free rtos源码分析(一)
新建一个文集,用来记录free rtos学习过程,作为笔记,中间会去掉一些非主线代码
一些参数,本篇分析创建任务函数,及其参数。
pxTaskCode 被创建的任务函数
pcName 带描述性的任务名
usStackDepth 任务分配的栈大小
pvParameters 任务接受一个void型的指针
uxPriority 任务优先级
pxCreatedTask 传出任务的句柄,可对任务进行操作,值可传递到任务中(改变优先级,删除),若不用设为NULL
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
{
TCB_t *pxNewTCB;
BaseType_t xReturn;
/* If the stack grows down then allocate the stack then the TCB so the stack
does not grow into the TCB. Likewise if the stack grows up then allocate
the TCB then the stack. */
StackType_t *pxStack;
/*为新创建任务申请堆栈空间 */
pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
debug_flag = 0x5a;
if( pxStack != NULL )
{
/* 为 TCB申请空间 */
pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );
if( pxNewTCB != NULL )
{
/* 指向TCB所在的堆栈. */
pxNewTCB->pxStack = pxStack;
}
else
{
/* The stack cannot be used as the TCB 没用创建成功不能被用作堆栈使用,再次释放 */
vPortFree( pxStack );
}
}
else
{
pxNewTCB = NULL;
}
}
if( pxNewTCB != NULL )
{
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
{
/* 任务可以被静态或动态创建,注意,若是动态创建的,稍后需要被删除 */
pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB;
}
#endif /* configSUPPORT_STATIC_ALLOCATION */
DEBUG_OUT("[%s]-pxNewTCB:%04x,pxStack:%04x,d=%d\n",pcName,pxNewTCB,pxNewTCB->pxStack,usStackDepth);
prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );
/*加入到任务就绪表*/
prvAddNewTaskToReadyList( pxNewTCB );
xReturn = pdPASS;
}
else
{
xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
}
return xReturn;
}