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 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.
分享到:
收藏