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

本文介绍了如何解决栈冲突问题,特别是在异常处理和任务切换时。通过为每个任务分配独立的栈,CPU在进出异常时自动保存和恢复特定寄存器,避免了冲突。关键在于修改栈指针寄存器R13来切换任务栈,并手动保存和恢复[R4-R11]以处理内核寄存器冲突。栈指针的恢复应在任务切换之前进行。
摘要由CSDN通过智能技术生成

立即学习: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.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值