韦东山freeRTOS系列教程:FreeRTOS的内部机制_哔哩哔哩_bilibili
02 栈的作用
03 保存现场的几种场景
a.A函数调用B函数
无需保存传参的寄存器 R0R1R2
b.硬件中断
硬件保存R0R1R2->栈
软件保存LR PC R8等
c.任务切换
04 创建函数
aseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
参数
参数 功能
pvTaskCode 任务函数
pcName 任务名
usStackDepth 任务栈大小
pvParameters 任务参数
uxPriority 任务优先级
pxCreatedTask 任务句柄
返回值
返回值 意义
pdPass 表示任务已经创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 表示无法创建任务,因为FreeRTOS没有足够的堆内存来分配任务数据结构和堆栈。如果项目中包含heap_1.c、heap_2.c或heap_4.c,FreeRTOSConfig中的configTOTAL_HEAP_SIZE定义可用堆的总量。使用vApplicationMallocFailedHook()回调函数(或“hook”)可以捕获分配内存失败,使用xPortGetFreeHeapSize() API函数可以查询剩余的空闲堆内存数量。如果项目中包含heap_3.c,则链接器配置将定义总堆大小。
在堆里创建一个栈,便于全局使用
05 创建任务的 具体细节
创建任务时,函数地址会被压入到PC寄存器
形参会被压入R0寄存器,所以在TCB任务块里面看不到这两个的操作。
06 任务调度机制
高优先级会抢占低优先级任务
高优先级不停止,低优先级无法执行
同等优先级先到先得
运行态、就绪态、暂停态、阻塞态
切换时找到最高优先级的就绪态去运行,平级就第一个
>> 内核里面维护多个优先级数组
数组元素为不同优先级下的任务块
07 任务状态的切换
08 任务调度机制探讨
上面为任务创建时的调度顺序
除了手动创建的任务外,还会自动创建空间任务,清理手动任务自杀后的栈
优先级可抢占,同优先级轮询,空闲任务礼让