freertos任务切换汇编代码摘要

 最近在学任务切换的时候不懂任务切换的具体原理是什么、怎么实现的,所以卡了一段时间。这段时间内主要理清了每句汇编代码的意思,压栈和出栈具体指的什么,由此记录一下自己的心得体会:

__asm void xPortPendSVHandler( void )
{
/* 导入全局变量及函数 */
extern uxCriticalNesting;
extern pxCurrentTCB;
extern vTaskSwitchContext;
/* 8 字节对齐 */
PRESERVE8
/* R0 为 PSP,即当前运行任务的任务栈指针 */
mrs r0, psp
isb
/* R3 为 pxCurrentTCB 的地址值,即指向当前运行任务控制块的指针 */
/* R2 为 pxCurrentTCB 的值,即当前运行任务控制块的首地址 */
ldr r3, =pxCurrentTCB
ldr r2, [ r3 ]
/* 将 R4~R11 入栈到当前运行任务的任务栈中 */
stmdb r0 !, { r4 - r11 }
/* R2 指向的地址为此时的任务栈指针 */
str r0, [ r2 ]
/* 将 R3、 R14 入栈到 MSP 指向的栈中 */
stmdb sp !, { r3, r14 }
/* 屏蔽受 FreeRTOS 管理的所有中断 */
mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
msr basepri, r0
dsb
isb
/* 跳转到函数 vTaskSeitchContext
* 主要用于更新 pxCurrentTCB,
* 使其指向最高优先级的就绪态任务
*/
bl vTaskSwitchContext
/* 使能所有中断 */
mov r0, #0
msr basepri, r0
/* 将 R3、 R14 重新从 MSP 指向的栈中出栈 */
ldmia sp !, { r3, r14 }
/* 注意: R3 为 pxCurrentTCB 的地址值,
* pxCurrentTCB 已经在函数 vTaskSwitchContext 中更新为最高优先级的就绪态任务
* 因此 R1 为 pxCurrentTCB 的值,即当前最高优先级就绪态任务控制块的首地址 */
ldr r1, [ r3 ]
/* R0 为最高优先级就绪态任务的任务栈指针 */
ldr r0, [ r1 ]
/* 从最高优先级就绪态任务的任务栈中出栈 R4~R11 */
ldmia r0 !, { r4 - r11 }
/* 更新 PSP 为任务切换后的任务栈指针 */
msr psp, r0
isb
/* 跳转到切换后的任务运行
* 执行此指令, CPU 会自动从 PSP 指向的任务栈中,
* 出栈 R0、 R1、 R2、 R3、 R12、 LR、 PC、 xPSR 寄存器,
* 接着 CPU 就跳转到 PC 指向的代码位置运行,
* 也就是任务上次切换时运行到的位置
*/
bx r14
nop
}
//以上注释来源于正点原子

首先,任务的切换都在PendSV中进行的,上面这段代码主要讲的是任务切换在PendSV中断怎么实现的,我认为可以理解为一下几个步骤:

1、在任务A切换到任务B的时候,首先把任务控制块的地址赋值给r3,将任务控制块的首地址赋值给r2

2、r0任务栈指针将任务A的信息压栈到r4-r11寄存器中,即将r2(任务控制块的首地址)的地址赋值给r0达到压栈的效果。

3、将r3入栈到MSP指向的栈中。(因为M3中没有r14,我就不说r14了)(以上为保存现场,方便后续使用)

4、进入临界区,更新任务控制块,退出临界区。

5、把新的任务控制块的首地址(栈顶地址)[r3]赋值给r1,再把r1的值赋值给r0,然后将保存在r0中的任务B信息出栈到r4-r11寄存器中。

6、更新psp任务栈指针到r0,通过硬件自动恢复,返回到task寄存器。

以上是我浅薄的理解,至于更深层次的东西我想到真正做项目的时候再进行深度剖析。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值