|
楼主 |
发表于 2016-8-12 17:27:59
|
显示全部楼层
楼主 ,我用的V4板子的历程,没有你说的这个代码呢?是这个
pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */
*pxTopOfStack = portINITIAL_XPSR; /* xPSR */
pxTopOfStack--;
*pxTopOfStack = ( StackType_t ) pxCode; /* PC */
pxTopOfStack--;
*pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */
pxTopOfStack -= 5; /* R12, R3, R2 and R1. */
*pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */
pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */
return pxTopOfStack;
我可以这么理解FREERTOS的双堆栈设计实现吗?
首先是 默认复位时 是使用的MSP指针,特权模式,然后系统启动 第一个任务的时候 使用的是SVC系统调用,这里进来后使用的是MSP指针,但是返回后 就通过手动改变LR实现了 返回使用PSP,代码如下:
__asm void vPortSVCHandler( void )
{
PRESERVE8
ldr r3, =pxCurrentTCB /* Restore the context. */
ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */
ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */
ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */
msr psp, r0 /* Restore the task stack pointer. */
isb
mov r0, #0
msr basepri, r0
orr r14, #0xd
bx r14
}
以后再进入用户中断或者 pendsv时 CM3硬件会 自动计算 一个 EXEC_RETUR的值来保存之前的运行的状态(进入前使用的是MSP LR=0xFFFF_FFF9 如中断嵌套调用 ,, 进入前使用的PSP LR=0xFFFF_FFFD 如任务被中断打断),这样就由硬件内核实现了 任务和中断的双堆栈的 使用;
而且我跟踪SVC时发现,手动修改LR返回到任务后,CONTROL的值也同时自动 变为 0x02 了 |
|