FreeRTOS学习(四)

中断

  1. 中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)。
  2. 响应中断:CPU停止执行当前程序,转而去处理中断服务程序(ISR)。
  3. 退出中断:执行完毕,返回被打断的程序处,继续往下执行。

任务切换的过程在PendSV中断服务函数里完成。
PendSV是如何触发的?

  • 滴答定时器中断调用(时间片到了)
  • 执行FreeRTOS提供的相关API函数:portYIELD()

通过向中断控制和状态寄存器的ICSR的bit28写入1挂起PendSV来启动PendSV中断。

FreeRTOS学习(四)_第1张图片
进入中断时的自动压栈使用的是进程堆栈,而进入中断handler后自动改为MSP,退出中断时切换回PSP,并且从进程堆栈上弹出数据。

前导置零指令,计算一个32位数,头部为0的个数,通过前导置零指令获得最高优先级。
然后根据最高优先级找到对应的任务控制块。
FreeRTOS学习(四)_第2张图片

时间片调度

同等优先级任务轮流地享有相同的CPU时间(可设置 ),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期。

vTaskDelay(10);相当于挂起当前的任务等待时间延时到达,会触发任务调度。
delay_ms()不会阻塞当前任务,相当于当前任务一直在执行。

FreeRTOS任务相关API函数

UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask)
获取指定任务优先级

UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)
此函数用于获取指定任务的任务栈历史最小剩余堆栈。

  • 滴答定时器为系统提供时钟节拍
  • 时基定时器统计任务运行时间

所以时基定时器的计时精度高于系统时钟节拍精度。

你可能感兴趣的:(FreeRTOS,学习,单片机,嵌入式硬件)