RM圆桌010 | 操作系统RTOS

2019-04-15



点击此回顾活动


━━━━━


1. 在HAL库中,高优先级任务执行完后的osDelay的时间是不是就是下一级任务能执行的时间?这段时间过后又重新回到高优先级任务?

当程序进入了osDelay后,就进行任务切换进入下一级了,过程是当前最高优先级任务运行到osDelay就进入阻塞态,就会进行就绪态中的最高优先级的任务,等待延迟时间结束后就进入了就绪态,如果它是最高优先级的话就能马上运行了。


2. 应该怎样找到自己程序各种任务的优先级?比如现在主要有三个任务,底盘、云台和各种打印LED等较无关的,这些任务的优先级还有怎样才能让他们切换得更流畅(就是一种比较好的任务切换方法)

一般是云台最高优先级,底盘其次,打印和led放最后。我是这样想的,底盘的运行模式会根据云台的模式有所不同,同时云台任务的周期比底盘的周期要短,故而云台要比底盘高。

任务流畅的话,我觉得可能还是程序里面不要有太多无谓操作,减少时间延迟,如果用的是f4的芯片,芯片处理速度是足够的,像云台,底盘的任务,一般只是切换模式,计算PID这样的操作,CPU占有率基本上小于5%。


3. 请问,程序写到什么程度可以上操作系统呢?我的程序(没有系统,主程序在定时器中断里)刚完成了基本功能,下一步要提升性能,要先优化算法吗?还是先升级RTOS?

我觉得可以先试试操作系统,标准库的话,可以参考网上的一些教程啊,使用任务切换的功能就可以,我觉得这样有助于你设计程序架构逻辑上,有操作系统后,写程序还是有别于裸机设计。另外提升性能,我觉得你需要想清楚是什么样的性能,如果是控制性能,可能是研究好PID,参考上一期。


4. 想问一下,在使用freeRTOS时,在中断配置上要注意什么?感觉freeRTOS会与定时器或者串口的中断冲突。

freeRTOS有一个管理中断最大优先级设置

configLIBRAY_MAX_SYSCALLL_INTERRUPT_PRIORITY 

当stm32的中断组设置为NVIC_ProirityGroup_4的时候,freeRTOS会在进入临界区等一些操作的时候,屏蔽掉优先级低于configLIBRAY_MAX_SYSCALLL_INTERRUPT_PRIORITY的中断,退出临界区后会恢复。

所以如果你想要一些中断不要被屏蔽的时候,设置优先级比这个高就可以,同时这些高优先级的中断里面不要有freeRTOS的相关函数,同时在低优先级的中断使用带fromISR的freeRTOS函数。


5. 应该怎样找到自己程序各种任务的优先级?比如现在主要有三个任务,底盘、云台和各种打印LED等较无关的,这些任务的优先级还有怎样才能让他们切换得更流畅(就是一种比较好的任务切换方法)

根据实际情况决定,一般来说,控制类硬实时任务应该处于较高优先级:如电机控制,姿态结算。log和状态显示等时间不敏感任务应该处于较低优先级。一般来说,单片机性能是远远足够的。任务调度可以使用systemview进行分析。


6. 我看官方的程序,加入实时系统后是用遥控器控制的,我们想要程序自己控制,然后就在开始任务里面加了定时器计数判断,请问官方有什么更好的方法进行初始化吗?(由于要对陀螺仪进行误差处理,所以我们的初始化时间有点长,想减少一些时间)

零漂校准吗?我觉得可以在陀螺仪处理任务中进行处理。


7. 请问软件定时器和普通定时器具体有什么区别吗?(个人认为RTOS就相当于可以设置无限个定时器,但又可以去除定时器相互打断的缺点)

RTOS是可以设置比较多的定时器,但它精度上不如硬件定时器,它最小定时周期不会小于systick的周期。


8. 在云台控制的任务函数中,不加临界区限制,有时会失控,加了便不会出现这种现象,但是其他任务也加了临界区限制(例如串口接收啥的,防止数据处理被打断),请问加入临界区限制的任务函数过多会有什么影响呢,如果对一些数据处理不加临界区限制,对整体影响大吗?(会不会和不加操作系统的程序基本相似)

还是加上吧,会浪费一些时间,但有时候一些比较莫名奇妙的数据处理的bug就是由于临界区没有处理好。


9. 加入RTOS后,对于步兵来说,如何彻底摆脱定时器,因为目前有一些数据处理对时间要求还是挺严格的,我加入RTOS后,P轴云台偶尔会处于无力状态然后自己上下转动,请问这和RTOS有关系吗?(会不会是P轴的处理被不断打断)

我觉得可能是数据有问题吧,和RTOS关系不大,可以用别的板子抓一下can的log看看发送的控制指令是不是正确。

还可能是任务的优先级没有设置好,在多任务的环境下,对于一些要求精确时间的任务(比如PID控制任务要有精确的周期),尽量设置较高的优先级。可以通过设置一个计时变量并通过J-Scope等软件将这个运行周期显示出来来观察任务的执行周期是否稳定。


10. 请问操作系统选哪个比较好?FreeRTOS还是别的?

这个随意吧,ucos和freeRTOS都行。


11. 操作系统应该怎么入手啊?

入门的话,可以参考正点原子的教程入门,也可以去freeRTOS的官网上看相关介绍,边用边学,RTOS在使用上还是不复杂,可以先创建一个任务闪烁led任务,之后加入一些其他简单的任务,使用中学习就可以。

学RTOS我建议先学习一下操作系统任务切换的基本原理,理解了操作系统如何切换任务之后,对于后面RTOS的学习和一些BUG的调试是非常有帮助的。


12. 陀螺仪解算的优先级、遥控器处理优先级和云台控制的优先级应该如何分配?

理论上来说这几个任务的重要性基本相当,只要保证任务在执行过程中不会出现长时间阻塞其他任务的情况发生就可以了,遥控器处理任务对周期的要求不高,优先级可以稍低,陀螺仪结算和控制对周期精度要求较高,优先级可以设置高一些。

优先级遥控器 > 陀螺仪 > 云台。 我是这样觉得的,遥控器是用户交互的数据,应该优先满足,机器人控制都基于遥控器的数据,故而它优先级最高, 陀螺仪的数据是要用在云台控制中,而先要把数据处理好了,然后再给云台使用。故而云台最低。


13. 要是设置成相同优先级,会有什么明显区别吗?

就会几个任务轮流执行,增加了任务切换的频率。在一定程度上降低了系统性能(当然现在F4系列的单片机性能基本是冗余的,不会有太大感觉)。

应该没有太明显的区别,可能还是要看特别的数据有没有处理顺序的区别。


14. 有什么可以调试操作系统的工具推荐吗?可以用来调节线程冲突和溢出之类的。

这个跟正常调试嵌入式的工具差不多,可以使用一些串口工具,或者GPIO来翻转,显示线程切换来查找原因。