打印
[STM32F1]

一位初识FreeRTOS小白的疑问。

[复制链接]
997|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cry1109|  楼主 | 2020-3-27 12:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前一直跑裸机,现在想跑跑RTOS,但是总觉得有时难以摆脱裸机编程时的一些思维。
1.上了FreeRTOS后到底还能不能使用全局变量?裸机时不同任务之间的信息传递几乎都是通过使用全局变量来完成的,比较典型的就是串口空闲中断+DMA接收数据,直接定义一个全局数组,在中断中写入接收的数据,其他任务读取数据时随拿随用,效率高。FreeRTOS中可以通过消息队列将串口接收的数据传送给其他任务,或者也可以通过二值信号量来做一个接收数据并解析数据的任务?
2.中断优先级。配置了几个FreeRTOS无法屏蔽的高优先级中断,这些中断中不能调用FreeRTOS的API,如果这些中断中又不得不和FreeRTOS中的其他任务通讯怎么办?比如说开启了输出比较中断,在中断中对PWM脉冲计数,其他任务需要读取当前脉冲个数,这时候是不是就必须得使用了全局变量了?
3.任务切换。通过osDelay()函数切换任务,如果osDelay(0),还是每隔1ms的时钟节拍切换任务,这个在函数后面的注释中有解释。如果把 osDelay() 注释掉是不是表示这个任务一直运行,不会进入阻塞?(除了其他高优先级任务)

使用特权

评论回复
沙发
mmuuss586| | 2020-3-27 13:15 | 只看该作者

使用特权

评论回复
板凳
纪国圣| | 2020-3-27 13:28 | 只看该作者
1.如果一个任务需要等待串口中断接受的数据,那么在不使用消息队列的情况下,任务只能等待至数据到来或时间片耗尽而未收到数据,如果还有超时处理需求,那需要自己写超时等待机制。这样效率太低了。同时如果多个任务需要这组数据,而各任务优先级不同,如何防止处理一半的数据被别的任务抢占使用?还有如果不使用消息队列,在中断中接受到数据后,不能根据需要直接将优先级切换到高优先级(比如接受处理数据的任务就是这个优先级),这样返回到原来打断的任务,会造成数据处理不及时。消息队列使用FIFO机制,好处我就不多说了。
2.中断优先级根据需求设置。记得可以选择不屏蔽。
3.如果使用时间片调度,在时间片用完后会将CPU使用权转让给其它任务。但如果高优先级任务不使用osDelay(),会造成低优先级任务没有机会获得CPU使用权。

使用特权

评论回复
地板
cry1109|  楼主 | 2020-3-27 14:10 | 只看该作者
纪国圣 发表于 2020-3-27 13:28
1.如果一个任务需要等待串口中断接受的数据,那么在不使用消息队列的情况下,任务只能等待至数据到来或时间 ...

多谢解答!关于第二个的问题,如果某些实时性要求特别高的中断必须要求FreeRTOS内核不能屏蔽,还是这个PWM脉冲计数的例子,在输出比较中断中计数,如果内核因任务调度或者进入临界保护区时屏蔽了这个中断,那么肯定造成脉冲计数不准确。

使用特权

评论回复
5
纪国圣| | 2020-3-27 17:57 | 只看该作者
本帖最后由 纪国圣 于 2020-3-27 18:18 编辑
cry1109 发表于 2020-3-27 14:10
多谢解答!关于第二个的问题,如果某些实时性要求特别高的中断必须要求FreeRTOS内核不能屏蔽,还是这个PW ...

对于你所说的例子
1.使用全局变量,不论中断是否可以使用FREERTOS的API,还是不能保证在任务读到该变量之前不会被中断再次更改(屏蔽中断会导致中断不能及时响应,不屏蔽中断相应任务不一定得到及时执行)。裸机编程应该也是同样不能保证的(比如在读变量的函数之前某个函数调用时间较长)。
2.如果要求极端苛刻,一般都是在未屏蔽的中断中直接处理,比如开关信号操作。无论是否用操作系统,都应该这样处理。
3.有兴趣可以看看RTX,这个号称源码无临界段。似乎可以解决你的疑虑。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

172

帖子

4

粉丝