|
本帖最后由 samos2011 于 2016-5-24 17:17 编辑
如果是切换到一个新创建的任务没有问题而切换到一个已运行过的任务时有问题则是上下文保存不正确
给个容易理解的例子给你:
- // 假设C代码有以下定义
- typedef struct TCB{
- //...
- void* stack; // 任务栈顶地址 汇编使用,offset 0x0C
- //...
- }TCB;
- struct _OS{
- TCB* run; // 正在运行的任务 汇编使用,offset 0x00
- TCB* rdy; // 就绪的任务 汇编使用,offset 0x04
- // ...
- }os;
- ;***************************************
- ; * @brief 任务切换宏,使用了R0,R1,R2,R3寄存器
- ;***************************************
- MACRO
- OS_TASK_SWITCH
- ; os.run->stack = SP;
- LDR R2,=os
- LDR R1,[R2,#0x0]
- MRS R3,PSP
- STR R3,[R1,#0xC]
- ; os.run = os.rdy;
- LDR R0,[R2,#0x4]
- STR R0,[R2,#0x0]
- ; SP = os.rdy->stack
- LDR R1,[R2,#0x4]
- LDR R0,[R1,#0xC]
- MSR PSP,R0
- MEND
-
-
- ;****************************************
- ; * @brief 【PendSV异常处理】
- ;****************************************
- PendSV_Handler
- PUSH {LR}
- MRS R0,PSP
- STMFD R0!,{R4-R11}
- MSR PSP,R0
-
- BL OS_Sched ; C语言任务调度
- OS_TASK_SWITCH
-
- MRS R0,PSP
- LDMFD R0!,{R4-R11}
- MSR PSP,R0
- POP {PC}
复制代码
|
|