以xTaskCreateStatic为例。
xTaskCreateStatic中调用了两个函数:prvInitialiseNewTask 和prvAddNewTaskToReadyList
一、prvInitialiseNewTask分析
初始化栈:
1、1
把栈都初始化成了0xa5,可以通过打印任务栈来确定是不是被用过了,如下:
1.2
根据栈的生长方向,计算栈顶的位置,并内存对齐
后面就是初始化任务名称、优先级、一堆列表项等内容
1.3 pxPortInitialiseStack
在栈的最顶部,保存现场(寄存器)信息,并返回栈顶位置
经过初始化之后,堆栈的内容如下:
二、prvAddNewTaskToReadyList 分析
2.1
portYIELD的最终实现:
触发PendSV中断实现任务切换