freertos与rtthread内核实现的不同处

本文探讨了Freertos和rtthread两种RTOS内核的创建任务、延迟处理、信号量、邮箱、时间片和优先级机制的差异,以及它们在实际应用中的特点和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直在使用rtos作为主要开发内容,却没有详细了解过rtos的内核实现机制。最近一个月,抽了点时间将freertos和rtthread的内核代码看了下,了解了实时系统的实现机制和设计思想。这里学习freertos的代码,先看朱大神的freertos基础篇和高级篇的详细介绍,然后啃源码;搞懂了基本的设计思想和代码的实现逻辑。下面简单列一下自己了解到的两个系统的实现差异。

一、创建任务

两个系统都支持创建静态系统任务和动态任务。区别如下:

  1. freertos 创建的任务添加到就绪任务链表,创建完成后,若调度器已经运行,则可直接参与调度。
  2. rtthread 创建的线程添加到挂起任务列表,创建线程后,需要主动调用start_up,将线程移到就绪任务列表,参与调度。

二、delay

两个系统都支持delay和delayutil。区别如下:

  1. freertos 系统有专用的delay超时计数链表。delay的任务按照超时时间依次排列在超时计数链表中,等待超时时间到达,将其移至就绪任务链表参与调度。
  2. rtthread 系统的每个线程控制块结构体中都定义了一个软件定时器结构体,delay延时函数调用时,将会启动线程自带的软件定时器,完成delay操作,delay超时时间满足时,触发软件定时器超时callback,将任务从挂起列表移到就绪列表参与调度。

三、信号量

两个系统都支持使用信号量。区别如下:

  1. freertos 系统的信号量也是队列,只不过队列的长度为0。freertos使用宏定义封装了计数信号量和二值信号量。
  2. rtthread 系统信号量只支持计数信号量,在创建信号量时传入信号量的初始值。系统中没有二值信号量的接口。可以通过初始值设置1,作为二值信号量使用。

四、邮箱

邮箱与消息队列不同,邮箱常用于传输一个地址,可以直接引用数据,进行数据传输。但是消息队列的实现机制是提前分配好队列最大长度个队列项的内存,在传输数据时,将要发送的数据拷贝到申请的队列内存中,实现的是数据的拷贝。

  1. freertos 系统不支持邮箱
  2. rtthread 系统支持邮箱,邮箱传输的数据大小只有4字节,一般用于传输一个地址,引用这个地址进行数据的传输。

五、时间片

两个系统都支持时间片轮转的机制。时间片轮转是指就绪任务列表中有至少两个相同优先级的最高任务。需要按照轮流执行固定的时间tick进行任务调度。共享cpu资源。两个系统的区别如下:

  1. freertos 系统需要主动打开时间片轮转的宏定义才会开启这个功能,在task调度切换时,每个task只能执行1个tick。
  2. rtthread 系统在创建thread的时候可以直接传入时间片参数,在thread调度切换时,将按照创建时传入的时间片占用CPU资源,进行相同优先级thread的调度。

六、优先级

  1. freertos 系统的优先级定义为,优先级数值越大,task的优先级越高。
  2. rtthread 系统的优先级定义为,优先级数值越小,thread的优先级越高。优先级为0的thread,优先级最高。

总结,两个系统都是非常好用的RTOS,且各有所长,freertos的系统功能更为纯粹,可以用于各种需要实时系统的场景。rtthread具备各种第三方组件,尤其是网络组件相关,在物联网产品领域具有很强的优势。可以帮助开发人员配合组件快速完成物联网产品的开发。

### 实时操作系统特性对比 #### FreeRTOS 和 RT-Thread 的主要功能差异 FreeRTOS 和 RT-Thread 是两种广泛使用的实时操作系统(RTOS),各自具有独特的特性和优势。 在任务管理方面,两者存在显著的不同。对于 FreeRTOS 而言,允许任务在其内部调用 API 来终止自身[^2]。然而,在 RT-Thread 中,官方文档指出线程不应自行调用 `rt_thread_detach` 接口来尝试脱离或销毁自己;相反,当一个线程完成其工作并退出时,RT-Thread 内核会自动理该线程的清理过程,而不需要应用程序显式地进行干预[^3]。 #### 系统资源分配机制的区别 另一个值得注意的地方在于内存管理和资源配置方式上的差别: - **FreeRTOS**: 提供了多种灵活的任务创建方法,并支持静态和动态内存分配策略。开发者可以选择适合应用场景的方式创建任务。 - **RT-Thread**: 不仅提供了相似的功能选项,还引入了一些额外的概念和服务框架,使得应用层编程更加简便高效。例如,RT-Thread 支持组件化设计模式以及丰富的中间件库,有助于简化复杂系统的构建流程[^1]。 #### 时间响应性能考量 关于时间敏感型应用的支持程度: - **FreeRTOS** 使用简单的轮询调度算法,默认情况下采用基于优先级抢占式的多任务切换方案,能够满足大多数嵌入式项目的需求。 - **RT-Thread** 则实现了更为复杂的混合调度器模型,既保留了传统的固定优先级调度法的优点,又加入了自适应调整的能力,从而可以在更广泛的范围内优化系统表现。 ```c // 创建新线程/任务示例代码 - C语言风格伪码表示 void *my_task(void *parameter){ while(1){ // 执行具体业务逻辑... // 主动放弃当前 CPU 占有权给其他同级别或更高优先生级别的就绪态进程 rt_thread_delay(RT_TICK_PER_SECOND / 10); // 对应于 RT-Thread vTaskDelay(pdMS_TO_TICKS(100)); // 对应于 FreeRTOS } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值