此帖出自ARM技术论坛
最新回复
本帖最后由 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}
复制代码
详情
回复
发表于 2016-5-24 12:31
| ||
|
||
此帖出自ARM技术论坛
| ||
|
||
EEWorld Datasheet 技术支持