freertos与rt-thread在应用上的一些区别

1、中断管理上的区别
freertos进入临界区时,不响应优先级低于设定阈值的中断,此时若需要一个绝对的定时时间来做一些采样业务,那么采样周期就有可能被打断。
若把中断优先级设定高于设定阈值,就不能使用freertos的API,但是这个中断又需要用到队列来存储数据。使用全局变量就有悖使用操作系统的初衷。
rt-thread进入临界区时,仅是不切换任务,对于所有中断都是可以响应的,这对于需要绝对周期的采样任务是友好的,而且所有中断里也可以使用API函数。
但是,对于临界区里的操作,也有被众多中断打断的风险,若是该临界区对操作时序的要求较高就会有些许影响。
在该管理上,对于我需要使用内部API,又需要采样中断的绝对时间,显然rt-thread更符合应用需求

基于中断的管理,freertos在中断里使用内部API,出中断时还需多一步操作检查任务切换,较为麻烦

rt-thread与freertos内部API,版本对比(FreeRTOS-9.0.0)(rtthread-nano-master-3.1.5)
freertos的内部API比rt—thread丰富,举以下例子:
1、软件定时器:
获取定时器状态:
freertos:xTimerIsTimerActive(timer)
rt-thread:操作上多一步
uint8_t state;
rt_timer_control(timer, RT_TIMER_CTRL_GET_STATE, &state)
获取定时器周期:
freertos:xTimerGetPeriod(timer)
rt-thread:无
freertos几乎提供了所有应用上可能用到的API

2、队列:
rt-thread:
仅提供了写入队列尾,写入队列头、读出删除、复位操作
freertos:
在此基础上同时提供了
覆盖写入:xQueueOverwrite(Queue, pxStack);
读出不删除:xQueuePeek(Queue,pxStack,0);
这个API在一些应用上有很好的用处,例如创建一个队列,周期性的向其写入,但只需保存最新的数据即可,覆盖写入就符合需求
相同如对于某一队列,在不同的任务中需要读出,且该队列只会在某处保存写入一次,就需要在读出时不清除队列数据,读出不删除队列就符合需求。

3、事件
rt-thread
对于事件的操作也只有写入、读出、复位
freertos
在此基础上同时提供了
对事件bit位的单独操作
等待某一bit位:xEventGroupWaitBits()
清除某一bit位:xEventGroupClearBits()

仅限于以上提到的两个版本对比,freertos的内部API比rt-thread丰富,使用上比较灵活,可以适应各种复杂的应用场景。但其他的rtt版本还没未看过。
rt-thread类linux提供了驱动层,使应用层和硬件层分离开(当然也可以不用),而freertos的硬件驱动与应用结合在一起,提供任务调度,内存管理,消息队列等
 

上一篇:leetcode 94. 二叉树的中序遍历


下一篇:主席树 常见题目类型总结