创建任务
定义任务栈
- 在多任务系统中需要为每个任务分配单独的栈空间(数组实现或者动态分配), 存在RAM中
定义任务函数
- 任务函数在main.c中定义, 每个任务函数都是一个独立, 无限循环且不能返回的函数
定义任务控制块
- 多任务系统为了顺利调度任务, 为每个任务定义了一个任务控制块, 其中包含了该任务的所有信息, 如:任务的栈指针, 任务名称, 任务形参等
- 定义任务控制块的数据类型在task.h中声明
实现任务创建函数
实现就绪列表
定义就绪列表
- 任务创建好后, 需要将任务添加到就绪列表中, 表示任务已经就绪, 系统可以随时调度; 就绪列表在task.c中定义, 在task.h中声明(就绪列表的实质就是List_t类型的数组, 数组大小由在FreeRTOSConfig.h中定义的宏决定; 数组的下标就是任务的优先级, 同一优先级的任务统一插入到就绪列表的同一条链表中)
就绪列表初始化
- 就绪列表的初始化在函数prvInitialiseTaskLists()实现
将任务插入到就绪列表
- 任务控制块中有一个xStateListItem成员, 数据类型是ListItem_t, 在prvinitialiseTaskLists()函数中调用这个成员, 实现将任务挂载到就绪列表中的某一级优先级上
实现调度器
- 调度器是操作系统的核心, 主要功能是实现任务的切换, 即从就绪列表中找到优先级最高的任务并执行; 调度器有几个全局变量和实现任务切换的函数组成, 在task.c中实现
启动调度器
-
vTaskStartScheduler()函数
- 调度器的启动(调用xPortStartScheduler()函数)
-
xPortStartScheduler()函数
- 启动调度器, 调度器启动成功该函数不会返回; 函数在port.c中实现
-
prvStartFirstTask()函数
- 在xPortStartScheduler()函数中调用, 以启动第一个任务, 启动成功后不返回, 函数由汇编编写, 在port.c中实现
-
vPortSVCHandler()函数
- 汇编编写的函数, 真正实现启动第一个任务, 在port.c中实现
任务切换(寻找优先级最高的任务并执行)
-
taskYIELD()
-
xPortPendSVHander函数
-
vTaskSwitchContext()函数
- 选择优先级最高的任务, 然后更新pxCurrentTCB; 在task.c中定义
main函数
[涉及的ARM汇编指令]
ARM常用汇编指令https://blog.csdn.net/m0_51593568/article/details/120937181
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)