一直在使用rtos作为主要开发内容,却没有详细了解过rtos的内核实现机制。最近一个月,抽了点时间将freertos和rtthread的内核代码看了下,了解了实时系统的实现机制和设计思想。这里学习freertos的代码,先看朱大神的freertos基础篇和高级篇的详细介绍,然后啃源码;搞懂了基本的设计思想和代码的实现逻辑。下面简单列一下自己了解到的两个系统的实现差异。
一、创建任务
两个系统都支持创建静态系统任务和动态任务。区别如下:
freertos 创建的任务添加到就绪任务链表,创建完成后,若调度器已经运行,则可直接参与调度。
rtthread 创建的线程添加到挂起任务列表,创建线程后,需要主动调用start_up,将线程移到就绪任务列表,参与调度。
二、delay
两个系统都支持delay和delayutil。区别如下:
freertos 系统有专用的delay超时计数链表。delay的任务按照超时时间依次排列在超时计数链表中,等待超时时间到达,将其移至就绪任务链表参与调度。
rtthread 系统的每个线程控制块结构体中都定义了一个软件定时器结构体,delay延时函数调用时,将会启动线程自带的软件定时器,完成delay操作,delay超时时间满足时,触发软件定时器超时callback,将任务从挂起列表移到就绪列表参与调度。
三、信号量
两个系统都支持使用信号量。区别如下:
freertos 系统的信号量也是队列,只不过队列的长度为0。freertos使用宏定义封装了计数信号量和二值信号量。
rtthread 系统信号量只支持计数信号量,在创建信号量时传入信号量的初始值。系统中没有二值信号量的接口。可以通过初始值设置1,作为二值信号量使用。
四、邮箱
邮箱与消息队列不同,邮箱常用于传输一个地址,可以直接引用数据,进行数据传输。但是消息队列的实现机制是提前分配好队列最大长度个队列项的内存,在传输数据时,将要发送的数据拷贝到申请的队列内存中,实现的是数据的拷贝。
freertos 系统不支持邮箱
rtthread 系统支持邮箱,邮箱传输的数据大小只有4字节,一般用于传输一个地址,引用这个地址进行数据的传输。
五、时间片
两个系统都支持时间片轮转的机制。时间片轮转是指就绪任务列表中有至少两个相同优先级的最高任务。需要按照轮流执行固定的时间tick进行任务调度。共享cpu资源。两个系统的区别如下:
freertos 系统需要主动打开时间片轮转的宏定义才会开启这个功能,在task调度切换时,每个task只能执行1个tick。
rtthread 系统在创建thread的时候可以直接传入时间片参数,在thread调度切换时,将按照创建时传入的时间片占用CPU资源,进行相同优先级thread的调度。
六、优先级
freertos 系统的优先级定义为,优先级数值越大,task的优先级越高。
rtthread 系统的优先级定义为,优先级数值越小,thread的优先级越高。优先级为0的thread,优先级最高。
总结,两个系统都是非常好用的RTOS,且各有所长,freertos的系统功能更为纯粹,可以用于各种需要实时系统的场景。rtthread具备各种第三方组件,尤其是网络组件相关,在物联网产品领域具有很强的优势。可以帮助开发人员配合组件快速完成物联网产品的开发。
原作者:路飞的皮孩