美文网首页电子工程师站
free rtos源码分析(一)

free rtos源码分析(一)

作者: SunShine__鹏 | 来源:发表于2018-06-08 16:38 被阅读5次

    新建一个文集,用来记录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;

    }

    相关文章

      网友评论

        本文标题:free rtos源码分析(一)

        本文链接:https://www.haomeiwen.com/subject/rxuasftx.html