1.1 问题来源发现freertos第一次代码模拟压栈,放入PC的函数指针,最低位必须是0. 1.2 问题资料说: 手动写pc,必须把最低位设1,告诉mcu此时是thumb状态。 但freertos的代码把最低位强行变0了。 这不是矛盾吗? 1.3 我的猜测资料说读PC,值最低位总是0,所以代码里面模拟硬件压栈,PC的bit[0]要求为0,因为PC肯定是硬件读出来放到栈里面,只要读PC的bit[0]必须为0. 硬件自动出栈给pc的时候,自动给出栈给pc的值加1? 1.4 freerots源码StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { /* Simulate the stack frame as it would be created by a context switch interrupt. */ 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 ) & 0xfffffffeUL; /* PC */ 不理解此处为什么要把bit0变为0 pxTopOfStack--; *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* 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; }
|