没有合适的资源?快使用搜索试试~ 我知道了~
首页FreeRTOS实时内核中文实战教程:从入门到任务管理
FreeRTOS实时内核中文实战教程:从入门到任务管理
需积分: 9 4 下载量 103 浏览量
更新于2024-07-15
收藏 2.35MB PDF 举报
《FreeRTOS实时内核使用指南_中文.pdf》是一本详细介绍如何在微控制器系统中应用FreeRTOS实时内核的实用手册。FreeRTOS是由Richard Barry设计并维护的一款开源实时操作系统,特别针对嵌入式系统的特性而优化。该内核的核心优势在于其高效的任务管理和小型系统的适用性,强调了对微控制器资源的有效利用。 文章的初衷并非因为FreeRTOS本身的技术优越性,而是因为原著篇幅适中且FreeRTOS中文网对其在中国的推广工作有所贡献。作者Zou Changjun希望通过业余时间将英文版文档翻译成中文,以便于国内开发者能够无障碍地理解和使用FreeRTOS。他提到,他个人并未决定在系统中采用FreeRTOS,但对一个免费且能满足实时需求的内核有着兴趣。 第1章"任务管理"是文档的核心部分,概述了FreeRTOS在多任务环境下的运作原理。在这个章节中,读者可以了解到FreeRTOS如何实现任务调度、优先级管理、任务同步和通信机制,这些都是构建实时系统的关键要素。此外,作者还提到了附录中包含的关于如何使用FreeRTOS源代码的实用信息,这对于初次接触或想要深入理解内核内部工作机制的开发者来说是非常重要的参考资料。 尽管作者承认自己翻译过程中的不足,如未翻译附录和未进行校对,但他还是愿意分享自己的成果,并鼓励读者在遇到问题时提出反馈。《FreeRTOS实时内核使用指南_中文.pdf》为微控制器开发人员提供了一个从入门到实践的清晰路径,帮助他们理解和利用FreeRTOS来构建高效、可靠的嵌入式系统。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/15501800/bg10.jpg)
http://www.FreeRTOS.org
FreeRTOS
16
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
/* 定义将要通过任务参数传递的字符串。定义为const,且不是在栈空间上,以保证任务执行时也有效。 */
static const char *pcTextForTask1 = “Task 1 is running\r\n”;
static const char *pcTextForTask2 = “Task 2 is running\t\n”;
int main( void )
{
/* Create one of the two tasks. */
xTaskCreate( vTaskFunction, /* 指向任务函数的指针. */
"Task 1", /* 任务名. */
1000, /* 栈深度. */
(void*)pcTextForTask1, /* 通过任务参数传入需要打印输出的文本. */
1, /* 此任务运行在优先级1上. */
NULL ); /* 不会用到此任务的句柄. */
/* 同样的方法创建另一个任务。至此,由相同的任务代码(vTaskFunction)创建了多个任务,仅仅是传入
的参数不同。同一个任务创建了两个实例。 */
xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 1, NULL );
/* Start the scheduler so our tasks start executing. */
vTaskStartScheduler();
/* If all is well then main() will never reach here as the scheduler will
now be running the tasks. If main() does reach here then it is likely that
there was insufficient heap memory available for the idle task to be created.
CHAPTER 5 provides more information on memory management. */
for( ;; );
}
程序清单 9 例 2 中的 main()函数实现代码
例 2 的运行输出结果与例 1 完全一样,参见图 2。
![](https://csdnimg.cn/release/download_crawler_static/15501800/bg11.jpg)
http://www.FreeRTOS.org
FreeRTOS
17
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
1.5 任务优先级
xTaskCreate() API 函数的参数 uxPriority 为创建的任务赋予了一个初始优先级。这
个侁先级可以在调度器启动后调用 vTaskPrioritySet() API 函数进行修改。
应用程序在文件 FreeRTOSConfig.h 中设定的编译时配置常量
configMAX_PRIORITIES 的值,即是最多可具有的优先级数目。FreeRTOS 本身并没
有限定这个常量的最大值,但这个值越大,则内核花销的内存空间就越多。所以总是建
议将此常量设为能够用到的最小值。
对于如何为任务指定优先级,FreeRTOS 并没有强加任何限制。任意数量的任务可
以共享同一个优先级——以保证最大设计弹性。当然,如果需要的话,你也可以为每个
任务指定唯一的优先级(就如同某些调度算法的要求一样),但这不是强制要求的。
低优先级号表示任务的优先级低,优先级号 0 表示最低优先级。有效的优先级号范
围从 0 到(configMAX_PRIORITES – 1)。
调度器保证总是在所有可运行的任务中选择具有最高优先级的任务,并使其进入运
行态。如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行。这种
行为方式在之前的例子中可以明显看出来。两个测试任务被创建在同一个优先级上,并
且一直是可运行的。所以每个任务都执行一个”时间片”,任务在时间片起始时刻进入运
行态,在时间片结束时刻又退出运行态。图 3 中 t1 与 t2 之间的时段就等于一个时间片。
要能够选择下一个运行的任务,调度器需要在每个时间片的结束时刻运行自己本
身。一个称为心跳(tick,有些地方被称为时钟滴答,本文中一律称为时钟心跳)中断的
周期性中断用于此目的。时间片的长度通过心跳中断的频率进行设定,心跳中断频率由
FreeRTOSConfig.h 中的编译时配置常量 configTICK_RATE_HZ 进行配置。比如说,
如果 configTICK_RATE_HZ 设为 100(HZ),则时间片长度为 10ms。可以将图 3 进行
扩展,将调度器本身的执行时间在整个执行流程中体现出来。请参见图 4。
需要说明的是,FreeRTOS API 函数调用中指定的时间总是以心跳中断为单位(通
常的提法为心跳”ticks”)。常量 portTICK_RATE_MS 用于将以心跳为单位的时间值转化
为以毫秒为单位的时间值。有效精度依赖于系统心跳频率。
心跳计数(tick count)值表示的是从调度器启动开始,心跳中断的总数,并假定心跳
![](https://csdnimg.cn/release/download_crawler_static/15501800/bg12.jpg)
http://www.FreeRTOS.org
计数器不会溢出。用户程序在指定延迟周期时不必考虑心跳计数溢出问题,因为时间连
贯性在内核中进行管理。
图 4 对执行流程进行扩展以显示心跳中断的执行
图 4 中红色的线段表时内核本身在运行。黑色箭头表示任务到中断,中断再到另一
个任务的执行顺序。
例 3. 优先级实验
调度器总是在可运行的任务中,选择具有最高优级级的任务,并使其进入运行态。
到目前为止的示例程序中,两个任务都创建在相同的优先级上。所以这两个任务轮番进
入和退出运行态。本例将改变例 2 其中一个任务的优先级,看一下倒底会发生什么。现
在第一个任务创建在优先级 1 上,而另一个任务创建在优先级 2 上。创建这两个任务的
代码参见程序清单 10。这两个任务的实现函数没有任何改动,还是通过空循环产生延
迟来周期性打印输出字符串。
FreeRTOS
18
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
![](https://csdnimg.cn/release/download_crawler_static/15501800/bg13.jpg)
http://www.FreeRTOS.org
/* 定义将要通过任务参数传递的字符串。定义为const,且不是在栈空间上,以保证任务执行时也有效。 */
static const char *pcTextForTask1 = “Task 1 is running\r\n”;
static const char *pcTextForTask2 = “Task 2 is running\t\n”;
int main( void )
{
/* 第一个任务创建在优先级1上。优先级是倒数第二个参数。 */
xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL );
/* 第二个任务创建在优先级2上。 */
xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL );
/* Start the scheduler so the tasks start executing. */
vTaskStartScheduler();
return 0;
}
程序清
单 10 两个任务创建在不同的优先级上
图 5 是例 3 的运行结果。
图 5 两个测试任务运行在不同的优先级上
调度器总是选择具有最高优先级的可运行任务来执行。任务 2 的优先级比任务 1
高,并且总是可运行,因此任务 2 是唯一一个一直处于运行态的任务。而任务 1 不可能
进入运行态,所以不可能输出字符串。这种情况我们称为任务 1 的执行时间被任务 2”
饿死(starved)”了。
任务 2 之所以总是可运行,是因为其不会等待任何事情——它要么在空循环里打
转,要么往终端打印字符串。
FreeRTOS
19
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
![](https://csdnimg.cn/release/download_crawler_static/15501800/bg14.jpg)
http://www.FreeRTOS.org
图 6 展现了例 3 的执行流程。
图 6 当一个任务优先比另一个高时的执行流程
FreeRTOS
20
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
剩余147页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/393bec0013344f579858641c4589146b_long_ly.jpg!1)
long_ly
- 粉丝: 3
- 资源: 9
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 多模态联合稀疏表示在视频目标跟踪中的应用
- Kubernetes资源管控与Gardener开源软件实践解析
- MPI集群监控与负载平衡策略
- 自动化PHP安全漏洞检测:静态代码分析与数据流方法
- 青苔数据CEO程永:技术生态与阿里云开放创新
- 制造业转型: HyperX引领企业上云策略
- 赵维五分享:航空工业电子采购上云实战与运维策略
- 单片机控制的LED点阵显示屏设计及其实现
- 驻云科技李俊涛:AI驱动的云上服务新趋势与挑战
- 6LoWPAN物联网边界路由器:设计与实现
- 猩便利工程师仲小玉:Terraform云资源管理最佳实践与团队协作
- 类差分度改进的互信息特征选择提升文本分类性能
- VERITAS与阿里云合作的混合云转型与数据保护方案
- 云制造中的生产线仿真模型设计与虚拟化研究
- 汪洋在PostgresChina2018分享:高可用 PostgreSQL 工具与架构设计
- 2018 PostgresChina大会:阿里云时空引擎Ganos在PostgreSQL中的创新应用与多模型存储
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)