首页 > 代码库 > FreeRTOS--概述
FreeRTOS--概述
1.前言
FreeRTOS是小型多任务嵌入式操作系统,硬实时性。
2.任务
- 任务函数的原型
void ATaskFunction( void *pvParameters );参数必须是void *,返回值必须是void
- 任务通常是死循环,不会退出
不会有return语句
- 任务不需要可以删除
vTaskDelete( NULL );
3. 任务的状态
- 任务有两个状态,运行态和非运行态
- 任务由非运行态转入运行态为切入,相反为切出
4.创建任务
1 portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, 2 const signed portCHAR * const pcName, 3 unsigned portSHORT usStackDepth, 4 void *pvParameters, 5 unsigned portBASE_TYPE uxPriority, 6 xTaskHandle *pxCreatedTask );
- uxPriority
表示任务的优先级,最好设置成实际任务需要的最小值,以避免浪费
5. 启动任务
vTaskStartScheduler();
6. 任务优先级
- 设置优先级
最高优先级在FreeRTOSConfig.h 中 设 定 的 编 译 时 配 置 常 量configMAX_PRIORITIES中进行设置。
FreeRTOS 本身并没有限定这个常量的最大值,但这个值越大,则内核花销的内存空间就越多。建议将此常量设为能够用到的最小值
任意数量的任务可以共享同一个优先级也可以为每个任务唯一指定一个优先级
低优先级号表示任务的优先级低
有效的优先级号范围从 0 到(configMAX_PRIORITES – 1)
调度器保证总是在所有可运行的任务中选择具有最高优先级的任务,并使其进入运行态
如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行调度器总是选择所有能够进入运行态的任务中具有最高优先级的任务
- 任务时间片
两个任务被创建在同一个优先级上,并且一直是可运行的。所以每个任务都执行一个”时间片”,任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态
调度器需要在每个时间片结束时能够调度自己, tick中断可以完成此目的
tick中断频率可以通过FreeRTOSConfig.h 中的编译时配置常量configTICK_RATE_HZ 进行配置,如设为100HZ,则时间片长度为10ms
两个优先级相同的任务时间片执行图如下:
图 优先级相同的两个任务的时间片执行序列
加入了tick中断及tick中断调度器调度下个任务图示如下:
图 对执行流程进行扩展以显示tick中断的执行
图 Task2比Task1优先级高时的任务运行序列
7.任务状态机
图 完整的任务状态机
- 阻塞态(blocked)
(1)如果一个任务正在等待某个事件,则称这个任务处于”阻塞态(blocked)”。阻塞态是非运行态的一个子状态。
(2)任务进入阻塞态一般等待以下两种事件:定时事件和同步事件
(3)任务可以在进入阻塞态等待同步事件时指定一个等待超时时间,这样可以有效地实现阻塞状态下同时等待两种类型的事件,
比如说,某个任务可以等待队列中有数据到来,但最多只等10ms。如果10ms 内有数据到来,或是10ms 过去了还没有数据到来,这两种情况下该任务都将退出阻塞态。
- 挂起状态(suspended)
(1)处于挂起状态的任务对调度器而言是不可见的
(2)让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() API 函数
(3)把一个挂起状态的任务唤醒的唯一途径就是调用vTaskResume() 或TaskResumeFromISR() API 函数
(4)大多数应用程序中都不会用到挂起状态
- 就绪状态(ready)
(1)如果任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪(ready,准备或就绪)状态
(2)处于就绪态的任务能够被运行,但只是”准备(ready)”运行,而当前尚未运行
8.利用阻塞态实现延迟
1 void vTaskDelay( portTickType xTicksToDelay );
调用上面的函数的任务会进入阻塞态,xTicksToDelay表示delay的tick周期数,portTICK_RATE_MS代表每毫秒有多少个tick周期
FreeRTOS--概述