/* 为 TCB 和 堆栈分配内存空间,被 xTaskGenericCreate 调用*/
static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer )
{
tskTCB *pxNewTCB;
/* 首先分配 TCB 结构的内存空间 */
pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) );
if( pxNewTCB != NULL )
{
/* 分配堆栈空间,有内存对齐要求 */
pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMallocAligned( ( ( ( size_t )usStackDepth ) * sizeof( portSTACK_TYPE ) ), puxStackBuffer );
if( pxNewTCB->pxStack == NULL )
{
/* 如果堆栈空间没有分配成功. 则删除 TCB 空间. */
vPortFree( pxNewTCB );
pxNewTCB = NULL;
}
else
{
/* 将堆栈填满 0xa5,方便调试,之所以是0xa5,因为 0xa5 = 1010 0101 非常有特点 */
memset( pxNewTCB->pxStack, tskSTACK_FILL_BYTE, usStackDepth * sizeof( portSTACK_TYPE ) );
}
}
return pxNewTCB;
}