logo资料库

freeRTOS操作系统详解(中文版).pdf

第1页 / 共149页
第2页 / 共149页
第3页 / 共149页
第4页 / 共149页
第5页 / 共149页
第6页 / 共149页
第7页 / 共149页
第8页 / 共149页
资料共149页,剩余部分请下载后查看
第一章
1.1 概览
1.2 任务函数
1.3 顶层任务状态
1.4 创建任务
1.5 任务优先级
1.6 扩充“非运行态”
1.7 空闲任务与空闲任务钩子函数
1.8 改变任务优先级
1.9 删除任务
1.10 调度算法 – 简述
第二章
2.1 概览
2.2 队列的特性
2.3 使用队列
2.4 工作于大型数据单元
第三章
3.1 概览
3.2 延迟中断处理
3.3 计数信号量
3.4 在中断服务例程中使用队列
3.5 中断嵌套
第四章
4.1 概览
4.2 临界区与挂起调度器
4.3 互斥量(及二值信号量)
4.4 守护任务
第五章
5.1 概览
5.2 内存分配方案范例
第六章
6.1 概览
6.2 栈溢出
6.3 其它常见错误
Appendix 1: Building the Examples
Appendix 2: The Demo Applications
Appendix 3: FreeRTOS Files and Directories
Appendix 4: Createing A FreeRTOS Project
Appendix 5: Data Types and Codeing Style Guide
Appendix 6: Licensing Information
http://www.FreeRTOS.org USING THE FREERTOS REAL TIME KERNEL 文 A Practical Guide Richard Barry 网 http://www.FreeRT OS.net/ FreeRT OS 中 FREERTOS 实时内核 实用指南 FreeRTOS 1 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 这篇文章的英文原版我是在www.FreeRTOS.net上下载得到的。其实我并没有决定 是否要在系统中使用FreeRTOS,虽然我想要的也仅仅是一个实时内核,当然更重要的 是免费。之所以翻译这篇文章倒不是因为FreeRTOS有多么优秀,完全是因为这篇文章 还不算太长。而且FreeRTOS.net仿佛致力于这个内核在国内的推广,也做了不少中文 化的工作。所以我是打算利用工作之余,边看边译,到读完这篇文档,也就有个中文版 另外,我本人很懒,没有翻译附录,而且译完正文后也没有做过任何检查。所以如 了。如果FreeRTOS.net不弃的话,我倒是情愿放到这个网站上与大家共享。 果有任何问题,请不要骂我。 Zou Changjun yisfx@126.com http://www.FreeRT OS.net/ FreeRT OS 中 网 文 FreeRTOS 2 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 第一章 任务管理 文 网 http://www.FreeRT OS.net/ FreeRT OS 中 FreeRTOS 3 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 1.1 概览 [附录中提供了使用 FreeRTOS 源代码的实用信息] 小型多任务嵌入式系统简介 不同的多任务系统有不同的侧重点。以工作站和桌面电脑为例: 早期的处理器非常昂贵,所以那时的多任务用于实现在单处理器上支持多用户。这 类系统中的调度算法侧重于让每个用户”公平共享”处理器时间。 随着处理器功能越来越强大,价格却更偏宜,所以每个用户都可以独占一个或多个 处理器。这类系统的调度算法则设计为让用户可以同时运行多个应用程序,而计算 机也不会显得反应迟钝。例如某个用户可能同时运行了一个字处理程序,一个电子 表格,一个邮件客户端和一个 WEB 浏览器,并且期望每个应用程序任何时候都能 对输入有足够快的响应时间。 文 网 http://www.FreeRT OS.net/ FreeRT OS 中 桌面电脑的输入处理可以归类为”软实时”。为了保证用户的最佳体验,计算机对每 个输入的响应应当限定在一个恰当的时间范围——但是如果响应时间超出了限定范围, 并不会让人觉得这台电脑无法使用。比如说,键盘操作必须在键按下后的某个时间内作 出明显的提示。但如果按键提示超出了这个时间,会使得这个系统看起来响应太慢,而 不致于说这台电脑不能使用。 仅仅从单处理器运行多线程这一点来说,实时嵌入式系统中的多任务与桌面电脑的 多任务从概念上来讲是相似的。但实时嵌入式系统的侧重点却不同于桌面电脑——特别 是当嵌入式系统期望提供”硬实时”行为的时候。 硬实时功能必须在给定的时间限制之内完成——如果无法做到即意味着整个系统 的绝对失败。汽车的安全气囊触发机制就是一个硬实时功能的例子。安全气囊在撞击发 生后给定时间限制内必须弹出。如果响应时间超出了这个时间限制,会使得驾驶员受到 伤害,而这原本是可以避免的。 大多数嵌入式系统不仅能满足硬实时要求,也能满足软实时要求。 FreeRTOS 4 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 术语说明 在 FreeRTOS 中,每个执行线程都被称为”任务”。在嵌入式社区中,对此并没有一 个公允的术语,但我更喜欢用”任务”而不是”线程”,因为从以前的经验来看,线程具有 更多的特定含义。 本章的目的是让读者充分了解:  在应用程序中,FreeRTOS 如何为各任务分配处理时间。  在任意给定时刻,FreeRTOS 如何选择任务投入运行。  任务优先级如何影响系统行为。  任务存在哪些状态。 此外,还期望能够让读者解:  如何实现一个任务。  如何创建一个或多个任务的实例。  如何使用任务参数。  如何改变一个已创建任务的优先级。  如何删除任务。  如何实现周期性处理。  空闲任务何时运行,可以用来干什么。 http://www.FreeRT OS.net/ FreeRT OS 中 本章所介绍的概念是理解如何使用 FreeRTOS 的基础,也是理解基于 FreeRTOS 网 文 的应用程序行为方式的基础——因此,本章也是这本书中最为详尽的一章。 FreeRTOS 5 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 1.2 任务函数 任务是由 C 语言函数实现的。唯一特别的只是任务的函数原型,其必须返回 void, 而且带有一个 void 指针参数。其函数原型参见程序清单 1。 void ATaskFunction( void *pvParameters ); 程序清单 1 任务函数原型 每个任务都是在自己权限范围内的一个小程序。其具有程序入口,通常会运行在一 个死循环中,也不会退出。一个典型的任务结构如程序清单 2 所示。 FreeRTOS 任 务 不 允 许 以 任 何 方 式 从 实 现 函 数 中 返 回 — — 它 们 绝 不 能 有 一 条”return”语句,也不能执行到函数末尾。如果一个任务不再需要,可以显式地将其删 除。这也在程序清单 2 展现。 文 网 http://www.FreeRT OS.net/ FreeRT OS 中 一个任务函数可以用来创建若干个任务——创建出的任务均是独立的执行实例,拥 有属于自己的栈空间,以及属于自己的自动变量(栈变量),即任务函数本身定义的变量。 void ATaskFunction( void *pvParameters ) /* 可以像普通函数一样定义变量。用这个函数创建的每个任务实例都有一个属于自己的iVarialbleExample变 量。但如果iVariableExample被定义为static,这一点则不成立 – 这种情况下只存在一个变量,所有的任务实 { } 例将会共享这个变量。 */ int iVariableExample = 0; /* 任务通常实现在一个死循环中。 */ for( ;; ) /* 完成任务功能的代码将放在这里。 */ { } /* 如果任务的具体实现会跳出上面的死循环,则此任务必须在函数运行完之前删除。传入NULL参数表示删除 的是当前任务 */ vTaskDelete( NULL ); 程序清单 2 典型的任务函数结构 FreeRTOS 6 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 1.3 顶层任务状态 应用程序可以包含多个任务。如果运行应用程序的微控制器只有一个核(core),那 么在任意给定时间,实际上只会有一个任务被执行。这就意味着一个任务可以有一个或 两个状态,即运行状态和非运行状态。我们先考虑这种最简单的模型——但请牢记这其 实是过于简单,我们稍后将会看到非运行状态实际上又可划分为若干个子状态。 当某个任务处于运行态时,处理器就正在执行它的代码。当一个任务处于非运行态 时,该任务进行休眠,它的所有状态都被妥善保存,以便在下一次调试器决定让它进入 运行态时可以恢复执行。当任务恢复执行时,其将精确地从离开运行态时正准备执行的 那一条指令开始执行。 文 网 http://www.FreeRT OS.net/ FreeRT OS 中 图 1 顶层任务状态及状态转移 任务从非运行态转移到运行态被称为” 切换入或切入(switched in)” 或”交换入 (swapped in)”。相反,任务从运行态转移到非运行态被称为”切换出或切出(switched out)”或”交换出(swapped out)”。FreeRTOS 的调度器是能让任务切入切出的唯一实体。 FreeRTOS 7 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
http://www.FreeRTOS.org 1.4 创建任务 xTaskCreate() API 函数 创建任务使用 FreeRTOS 的 API 函数 xTaskCreate()。这可能是所有 API 函数中最 复杂的函数,但不幸的是这也是我们第一个遇到的 API 函数。但我们必须首先掌控任务, 因 为 它 们 是 多 任 务 系 统 中 最 基 本 的 组 件 。 本 书 中 的 所 有 示 例 程 序 都 会 用 到 xTaskCreate(),所以会有大量的例子可以参考。 附录 5:描述用到的数据类型和命名约定。 portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, 网 文 描述 const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ); 程序清单 3 xTaskCreate() API 函数原型 http://www.FreeRT OS.net/ FreeRT OS 中 表 1 xTaskCreate()参数与返回值 任务只是永不退出的 C 函数,实现常通常是一个死循环。参数 pvTaskCode 只一个指向任务的实现函数的指针(效果上仅仅是函数 名)。 参数名 pvTaskCode pcName 具有描述性的任务名。这个参数不会被 FreeRTOS 使用。其只是单 纯地用于辅助调试。识别一个具有可读性的名字总是比通过句柄来 识别容易得多。 应用程序可以通过定义常量 config_MAX_TASK_NAME_LEN 来定 义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超 过了这个最大值,字符串将会自动被截断。 FreeRTOS 8 Designed For Microcontrollers; © 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
分享到:
收藏