这个函数是对任务控制块的pxTopOfStack赋值 进入pxPortInitialiseStack函数 (1)中pxTopOfStack的值已经在prvInitialiseNewTas函数初始化。 其实就是系统分配的内存起始地址+分配的内存数量乘以每个内存的字节数,然后把这个地址数值低三位复0,这样得到最初的pxTopOfStack栈顶指针,这个指针可以对8进行整除,方便堆栈指针寻...
1portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode,void*pvParameters )2{3/*Simulate the stack frame as it would be created by a context switch4interrupt.*/56/*Offset added to account for the way the MCU uses the stack on entry/exit7of interrupts, ...
{/*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...
StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void * pvParameters ) { pxTopOfStack--; *pxTopOfStack = portINITIAL_XPSR; //thumb pxTopOfStack--; *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; //task回调函数指针 ...
/* 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=(StackType_t*) ( ( (portPOINTER_SIZE_TYPE)pxTopOfStack)& (~( (portPOINTER_SIZE_TYPE)portBYTE_ALIGNMENT_MASK) ) ); /* 检查计算出的堆栈顶部的对齐方式是否正确。 */ configASSERT( ( ( (portPOINTER_SIZE_TYPE)pxTopOfStack& ...
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 inte...
[R2] 是 TCB 首地址,也就是 pxTopOfStack 下次,任务激活可以重新取出恢复栈顶,并取出其他数据 */" str r0, [r2] \n"" \n"/*保护现场,调用函数更新下一个准备运行的新任务*/" stmdb sp!, {r3, r14} \n"/*设置优先级 第一个参数,
TCB 的第一个数据域 pxTopOfStack 是一个指针,指向任务的堆栈顶;pxStack 则应该是给任务分配的堆栈的最低地址。 我用GDB 跟踪了一下任务的创建过程。在调用 xTaskCreate() 创建任务时,调用了两次 pvPortMalloc() 函数来动态申请内存,一次用于任务的堆栈,另一次用于 TCB. 然后是调用 prvInitializeNewTask() 初...