CPU registers store in FreeRTOS task stack
FreeRTOS
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack,
TaskFunction_t pxCode,
void *pvParameters )
{
/* 异常发生时,自动加载到CPU寄存器的内容 */(1)
pxTopOfStack--;
*pxTopOfStack = portINITIAL_XPSR;(2)
pxTopOfStack--;
*pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;(3)
pxTopOfStack--;
*pxTopOfStack = ( StackType_t ) prvTaskExitError;(4)
pxTopOfStack -= 5; /* R12, R3, R2 and R1 默认初始化为0 */
*pxTopOfStack = ( StackType_t ) pvParameters; (5)
/* 异常发生时,手动加载到CPU寄存器的内容 */(6)
pxTopOfStack -= 8;
/* 返回栈顶指针,此时pxTopOfStack指向空闲栈 */
return pxTopOfStack;(7)
}
- 代码清单:任务-12 (1):异常发生时,CPU自动从栈中加载到CPU寄存器的内容。包括8个寄存器,分别为R0、 R1、R2、R3、R12、R14、R15和xPSR的位24,且顺序不能变。
- 代码清单:任务-12 (2):xPSR的bit24必须置1,即0x01000000。
- 代码清单:任务-12 (3):任务的入口地址。
- 代码清单:任务-12 (4):任务的返回地址,通常任务是不会返回的,如果返回了就跳转到prvTaskExitError, 该函数是一个无限循环。
- 代码清单:任务-12 (5):R12, R3, R2 and R1 默认初始化为0。
- 代码清单:任务-12 (6):异常发生时,需要手动加载到CPU寄存器的内容,总共有8个,分别为R4、R5、R6、 R7、R8、R9、R10和R11,默认初始化为0。
- 代码清单:任务-12 (7):返回栈顶指针,此时pxTopOfStack指向具体见图5?3。任务第一次运行时,就是从这 个栈指针开始手动加载8个字的内容到CPU寄存器:R4、R5、R6、R7、R8、R9、R10和R11,当退出异常时,栈中剩下 的8个字的内容会自动加载到CPU寄存器:R0、R1、R2、R3、R12、R14、R15和xPSR的位24。此时PC指针就指向了任 务入口地址,从而成功跳转到第一个任务。
转载:https://ebf-freertos-tutorial-rt1052.readthedocs.io/zh_CN/latest/zero_to_one/Task_definition_and_implementation_of_task_switching.html