参考 FreeRTOS.org 怎样工作 小节获取多任务的基本概念。
任务 和 联合程序 文档提供了怎样判断何时适合以及何时不适合使用联合程序的方法,下面是简单的总结。注意一个系统可以只使用任务、或者只使用联合程序、或混合使用 - 但是任务和联合程序使用不同的 API 函数,因此一个队列(或者信号)不能用于从任务传递数据到联合程序,反之亦然。
简评In brief: 一个使用 RTOS 的实时应用系统可以由一组独立的任务组成,每个任务执行它自己的内容而不依赖于其他任务或者调度器。在任何时候只有一个任务可以被执行,调度器负责决定哪个任务应当被执行。调度器反复启动和停止任务(切换任务),因为一个任务不清楚调度器的活动,所以在任务切换时保证处理器内容不变(寄存器值、堆栈等)就是实时内核调度器的工作。要做到这一点每个任务都需要使用自己的堆栈,当任务切换时运行的参数保存到堆栈中,任务再次运行时就可以从堆栈中恢复参数。参考 FreeRTOS 怎样工作 小节获得更多内容。
![]() |
简单。 |
![]() |
使用没有限制。 |
![]() |
支持完全占先。 |
![]() |
支持优先级。 |
![]() |
每个任务使用单独的堆栈使得 RAM 占用率较高。 |
![]() |
使用占先时必须仔细考虑重入问题。 |
系统中的所有联合程序共享一个堆栈,和使用任务相比这极大的减少了 RAM 的需求。
联合程序之间使用优先级进行调度,但是可以被系统中的任务占先。
联合程序通过一组宏定义执行。
减少 RAM 占用率的代价就是使用联合程序上有严格限制。
![]() |
在联合程序之间共享堆栈将占用少得多的 RAM。 |
![]() |
联合操作使得重入不再是问题。 |
![]() |
非常容易移植的架构。 |
![]() |
相对其他联合程序有完全的优先级关系,但是可以被任务占先如果混合使用的时候。 |
![]() |
需要仔细考虑堆栈。 |
![]() |
API 调用时有限制。 |
![]() |
只能在联合程序之间使用联合操作。 |
翻译: 邵子扬
EMail: shaoziyang@126.com
Blog:
http://blog.ednchina.com/shaoziyang
2008年10月