系统栈和任务栈
系统栈
系统栈用于中断函数和中断嵌套
系统栈大小在启动文件.S文件中分配
系统栈指针为MSP指针
任务栈
任务栈用于局部变量,函数形参,现场保护及返回地址等
任务栈大小在FreeRTOSConfig.h文件定义的heap中分配
任务栈指针为PSP指针
临界段 调度锁 任务锁 中断锁
临界段
临界段作用是临界段的代码不允许任何中断打断,即临界段必须一次性执行完成
执行临界段关闭了优先级值大于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY值的所有中断,PendSV中断和SysTick中断优先级最低(优先级值高),因此执行任务切换的PendSV中断和SysTick中断被关闭了,任务切换禁止
临界段API | 功能 |
---|---|
taskENTER_CRITICAL() | 进入临界段 |
taskEXIT_CRITICAL() | 退出临界段 |
taskENTER_CRITICAL_FROM_ISR() | 进入临界段(中断中使用) |
taskEXIT_CRITICAL_FROM_ISR() | 退出临界段(中断中使用) |
调度锁
调度锁是调度器开关函数,处于调度锁开和调度锁关之间的代码不会被高优先级的任务抢占
调度锁API | 功能 |
---|---|
vTaskSuspendAll() | 调度锁开 |
xTaskResumeAll() | 调度锁关 |
不能在调度锁开关之间执行任何会引起任务切换的函数,如vTaskDelayUntil、vTaskDelay、xQueueSend 等
任务锁
任务锁防止当前任务的执行被高优先级的任务打断,FreeRTOS没有专门的函数,可以使用调度锁或关闭PendSV中断及Systick中断实现同样的功能
中断锁
中断锁是防止中断处理被更高优先级的中断打断,FreeRTOS没有专门的函数,可以使用临界段实现同样的功能