- Cortex-M4中SysTick调度器核心
- Cortex-M4中的中断管理
- Cortex-M4中影子栈指针
- Cortex-M4中SVC和PendSV异常
1:Cortex-M4中SysTick调度器核心
-----systick每一次中断都会触发内核的调度-----
-->内核从就绪列表中去寻找优先级最高的任务------
--->从内核态恢复到任务态(上下文切换(栈的操作))
2:Cortex-M4中中断的管理
-----M4有256个中断(16个内核中断和240个外部中断):
每一个中断都能被使能或禁止,并且可以设置成挂起或清楚状态
-----在中断异常向量表中操作系统会用到的中断:
SVCall:用于启动,便于上下文的切换
PendSV:上下文切换
SysTick:功能如上
对于中断的管理,主要使用了两个寄存器:
1----PRIMSK中断屏蔽特殊寄存器(主要由FreeRTOS接管)
2----CONTROL控制寄存器:
[PRIV]位为0时处理器处于线程模式的特权级,为1为非特权
[SPSEL]位为0时,线程模式使用MSP,为1时使用PSP
MSP为系统主栈,PSP为进程栈(影子栈)
临界段:
内核在操作时,不能被中途打断,需要屏蔽一些优先级高的中断
进入临界段,赋值寄存器,屏蔽一些中断
退出临界段,相应所有中断
3:Cortex-M4中影子栈指针
模式切换:
系统启动默认使用MSP
异常请求使用MSP,异常返回可以选择使用MSP或者PSP
4:Cortex-M4中SVC和PendSV异常
SVC异常:
1:非特权的用户任务,想要调用硬件接口,发出请求
2:使用操作系统给的API接口进行请求
3:系统收到请求后把驱动调过来响应请求
特性:响应快,中断不可内嵌
操作系统实时响应用户外部请求,不能被PendSV和SysTick打断
SVC异常产生后,把PendSV和SysTick优先级调到最低
因为SVC响应快,可以给用户提供快速响应,PendSV和SysTick优先级如果
还是很高,就会一直占用CPU,导致SVC请求被搁置
Cortex-M4中的上下文切换
进入PendSV
上:就是保留上一个任务的信息(压栈和入栈)
下:恢复下一个任务的信息(出栈)