返回

 

任务和联合程序

[FreeRTOS 基础]

参考 FreeRTOS.org 怎样工作 小节获取多任务的基本概念。

任务联合程序 文档提供了怎样判断何时适合以及何时不适合使用联合程序的方法,下面是简单的总结。注意一个系统可以只使用任务、或者只使用联合程序、或混合使用 - 但是任务和联合程序使用不同的 API 函数,因此一个队列(或者信号)不能用于从任务传递数据到联合程序,反之亦然。

 


'任务'的特性

FreeRTOS 低于 V4.0.0.0 的版本只允许实时系统的结构以一组任务的方式组成,这是 RTOS 调度的传统模式。

简评In brief: 一个使用 RTOS 的实时应用系统可以由一组独立的任务组成,每个任务执行它自己的内容而不依赖于其他任务或者调度器。在任何时候只有一个任务可以被执行,调度器负责决定哪个任务应当被执行。调度器反复启动和停止任务(切换任务),因为一个任务不清楚调度器的活动,所以在任务切换时保证处理器内容不变(寄存器值、堆栈等)就是实时内核调度器的工作。要做到这一点每个任务都需要使用自己的堆栈,当任务切换时运行的参数保存到堆栈中,任务再次运行时就可以从堆栈中恢复参数。参考 FreeRTOS 怎样工作 小节获得更多内容。

任务综述

简单。
使用没有限制。
支持完全占先。
支持优先级。
每个任务使用单独的堆栈使得 RAM 占用率较高。
使用占先时必须仔细考虑重入问题。


 

'联合程序'的特性

FreeRTOS V4.0.0 开始允许实时系统象使用任务一样选择使用联合程序。联合程序类似于任务,但是又有一些区别(进一步说明在 联合程序文档):
  1. 堆栈使用率

    系统中的所有联合程序共享一个堆栈,和使用任务相比这极大的减少了 RAM 的需求。

  2. 调度和优先级

    联合程序之间使用优先级进行调度,但是可以被系统中的任务占先。

  3. 联合程序通过一组宏定义执行。

  4. 使用限制

    减少 RAM 占用率的代价就是使用联合程序上有严格限制。

联合程序综述

在联合程序之间共享堆栈将占用少得多的 RAM。
联合操作使得重入不再是问题。
非常容易移植的架构。
相对其他联合程序有完全的优先级关系,但是可以被任务占先如果混合使用的时候。
需要仔细考虑堆栈。
API 调用时有限制。
只能在联合程序之间使用联合操作。

 

 


翻译:   邵子扬
EMail:   shaoziyang@126.com
Blog:    http://blog.ednchina.com/shaoziyang
2008年10月

 

Site Meter