FreeRTOS任务调度的三种方式:
抢占式调度
针对优先级不同的任务
时间片调度
-
针对优先级相同的任务;
-
FreeRTOS中的一个时间片就等于
SysTick
(滴答定时器)中断周期(1ms);
协程式调度
后续将不再支持。
!NOTE
- 同等优先级任务,轮流执行;时间片流转;
- 一个时间片大小,取决于滴答定时器中断周期;
- 没有用完的时间片将不会再使用,会直接进入下个任务;下次执行该任务时还是按照一个时间片的时钟节拍运行;
四种任务状态
- 运行态:只能从就绪态进入该状态;
- 就绪态
- 阻塞态
- 挂起态:类似暂停,调用函数
vTaskSuspend()
进入挂起状态,需要调用解挂函数vTaskResume()
才可以进入就绪状态;
!NOTE
- 仅就绪态可转变为运行态;
- 其他状态的任务想运行,就必须先转变为就绪态;
- FreeRTOS的四中状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表(链表);
任务状态列表
- 就绪列表:
pxReadyTaskLists[x]
,其中x
代表任务优先级数值;只有任务先挂载到就绪列表,任务才能进入到运行态; - 阻塞列表:
pxDelayedTaskList
- 挂起列表:
xSuspendTaskList
FreeRTOS 移植
源码获取
- 官网
- 第三方开发板厂商
源码
- include:FreeRTOS的头文件
- portable:FreeRTOS的移植文件
- croutine.c:协程相关文件按
- event_groups.c:事件相关文件
- list.c:列表相关文件
- queue.c:队列相关文件
- stream_buffer.c:流式缓冲区相关文件
- task.c:任务相关文件
- timers.c:软件定时器相关文件
portable文件夹
FreeRTOS操作系统归根到底是一个软件层面的东西,那FreeRTOS是如何跟硬件联系在一起的呢?portable
文件里面的东西就是连接桥梁。
由于使用MDK开发(stm32),因此这里重点介绍其中的部分移植文件:
- Keil:指向
RVDS
文件夹 - RVDS:不同内核芯片的移植文件
- MemMang:内存管理文件
移植
-
移植准备:FreeRTOS源码
-
基础工程:
-
移植步骤:
- 添加FreeRTOS源码:将FreeRTOS源码添加至基础工程、头文件路径等;
- FreeRTOSConfig.h:添加
FreeRTOSConfig.h
配置文件; - 修改SYSTEM文件:修改
SYSTEM
文件中的sys.c
、delay.c
、usart.c
; - 修改中断相关文件:修改
Systick
中断、SVC
中断、PendSV
中断; - 添加应用程序:验证移植是否成功;