没有合适的资源?快使用搜索试试~ 我知道了~
首页FreeRTOS中文实战教程:入门与任务管理
"《FreeRTOS中文实用教程》是一份针对微控制器设计的实时操作系统FreeRTOS的实用指南中文版。该文档由原著作者Richard Barry翻译自英文原版,可在www.FreeRTOS.net获取。文章强调了FreeRTOS作为一个免费且功能强大的实时内核,特别适合那些寻求在嵌入式系统中实现多任务处理的开发者。 教程的初衷并不是FreeRTOS本身的技术优势多么显著,而是由于其篇幅适中和FreeRTOS.net对国内市场的关注,作者Zou Changjun选择将其翻译,以便国内开发者能更方便地理解和学习。他个人并未翻译附录,并表示如有任何错误,欢迎提出,但未进行详细校对。 文章首先介绍了第一章——任务管理,涵盖了概览部分,这部分为读者提供了一种理解FreeRTOS如何在小型多任务嵌入式系统中发挥作用的入门途径。它可能包含如何创建、调度和同步任务,以及如何处理任务间通信的重要概念。附录则提供了关于如何使用FreeRTOS源代码的实用信息,这对于深入理解和实际应用至关重要。 《FreeRTOS中文实用教程》是一个宝贵的资源,不仅适用于初学者了解实时操作系统的基础,也对有一定经验的开发人员在优化嵌入式系统的性能和资源管理上具有指导意义。通过阅读此教程,读者可以了解到FreeRTOS如何在资源受限的环境中提供高效的任务管理,以及如何适应不断增长的嵌入式应用需求。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/12994557/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/12994557/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/12994557/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/12994557/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/12994557/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.
剩余148页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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://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://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/493712295e0f45f0a539011380024de7_huangsunyang.jpg!1)
huangsunyang
- 粉丝: 7
- 资源: 30
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- VMP技术解析:Handle块优化与壳模板初始化
- C++ Primer 第四版更新:现代编程风格与标准库
- 计算机系统基础实验:缓冲区溢出攻击(Lab3)
- 中国结算网上业务平台:证券登记操作详解与常见问题
- FPGA驱动的五子棋博弈系统:加速与创新娱乐体验
- 多旋翼飞行器定点位置控制器设计实验
- 基于流量预测与潮汐效应的动态载频优化策略
- SQL练习:查询分析与高级操作
- 海底数据中心散热优化:从MATLAB到动态模拟
- 移动应用作业:MyDiaryBook - Google Material Design 日记APP
- Linux提权技术详解:从内核漏洞到Sudo配置错误
- 93分钟快速入门 LaTeX:从入门到实践
- 5G测试新挑战与罗德与施瓦茨解决方案
- EAS系统性能优化与故障诊断指南
- Java并发编程:JUC核心概念解析与应用
- 数据结构实验报告:基于不同存储结构的线性表和树实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)