0
点赞
收藏
分享

微信扫一扫

韦东山freeRTOS系列教程:FreeRTOS的内部机制 简易笔记 第一天

Ad大成 2022-03-20 阅读 47

韦东山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 任务调度机制探讨

上面为任务创建时的调度顺序

除了手动创建的任务外,还会自动创建空间任务,清理手动任务自杀后的栈

优先级可抢占,同优先级轮询,空闲任务礼让

 

 

举报

相关推荐

0 条评论