以下是一个典型的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" // 返回下一个任务
- );
- }
|