学习笔记(1):自己动手从0到1写嵌入式操作系统-C2.02 任务切换的实现

立即学习:https://edu.csdn.net/course/play/4605/82626?utm_source=blogtoedu

 

解决了栈冲突的问题:为每个任务独立分配栈

在发生异常的时候:

CPU会自动保存 xPSR,PC(R15),LR(R14),R12,R0~R3到栈中,该栈是独立的话就不会冲突

在退出异常的时候:

CPU会自动弹栈 xPSR,PC(R15),LR(R14),R12,R0~R3到栈中,该栈是独立的话就不会冲突

解决>>建立一个独立的栈就好了

我们如何切换栈呢?

修改R13就好了

解决内核寄存器的冲突:出现两个冲突,第一个是当前的任务寄存器的值,第二个是需要切换的任务寄存器的值

CPU只为我们保存了xPSR [R0,R1,R2,R3,R12,R14(LR),R15(PC)]

还有 [R4~R11,R13]没有被保存

R13为栈指针寄存:我们通过修改R13便可以更改当前的任务栈,所以不需要保存R13的值

那么只需要手动保存 [R4~R11]就好了

解决冲突1

保存当前的[R4-R11]

解决冲突2

恢复正要切换的任务的[R4-R11]

注意切换的时候要先把栈指针恢复再切换

  1.  

你可能感兴趣的:(研发管理,嵌入式操作系统,ARM,驱动/内核开发,硬件/嵌入式)