以下是一个典型的PendSV中断服务例程(Cortex-M架构下):
void PendSV_Handler(void) {
// 保存当前任务上下文
__asm volatile (
"MRS R0, PSP\n" // 获取当前任务的进程堆栈指针 (Process Stack Pointer)
"STMDB R0!, {R4-R11}\n" // 保存低寄存器(R4-R11)到堆栈
"LDR R1, =current_tcb\n" // 加载当前任务控制块的地址
"LDR R2, [R1]\n" // 获取当前任务的TCB地址
"STR R0, [R2]\n" // 保存当前任务的堆栈指针到TCB
);
// 加载下一个任务上下文
__asm volatile (
"LDR R2, =next_tcb\n" // 加载下一个任务控制块的地址
"LDR R2, [R2]\n" // 获取下一个任务的TCB地址
"LDR R0, [R2]\n" // 获取下一个任务的堆栈指针
"LDMIA R0!, {R4-R11}\n" // 恢复低寄存器(R4-R11)
"MSR PSP, R0\n" // 恢复进程堆栈指针
"BX LR\n" // 返回下一个任务
);
}
|