FreeRtos任务创建过程简写

本文解析了如何在M3内核中静态创建任务,涉及BaseType_txTaskGenericCreate函数的用法,重点讲解了prvAllocateTCBAndStack与prvInitialiseTCBVariables等关键步骤,包括任务堆栈分配、TCB初始化和任务调度策略。
摘要由CSDN通过智能技术生成

静态创建:

函数返回值类型:t typedef long BaseType_t;一般为pdTRUE表示任务创建成功,pdFALSE表示任务创建失败

参数:函数指针类型变量pxTaskCode;任务的描述pcName;任务的堆栈深度,实际所占用的任务堆栈大小是usStackDepth*4;入口参数pvParameters,一般设置为NULL,任务的优先级uxPriority;任务的句柄pxCreatedTask;最后两个参数一般设置为NULL

函数描述:为任务申请一段空间作为任务的堆栈,以及任务控制块。

BaseType_t xTaskGenericCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, StackType_t * const puxStackBuffer, const MemoryRegion_t * const xRegions )

函数体主要分为:

①为任务分配任务堆栈内存以及任务控制块,由于M3内核任务堆栈是向下生长的,为了防止堆栈在生长的过程中发生堆栈溢出破坏任务控制块的结构,所以先申请任务堆栈再申请任务控制块

函数名:prvAllocateTCBAndStack

函数返回值数据类型:任务控制块类型的指针

函数参数:usStackDepth,puxStackBuffer

函数描述:为任务分配任务堆栈和任务控制块

static TCB_t *prvAllocateTCBAndStack( const uint16_t usStackDepth, StackType_t * const puxStackBuffer )

②重定向任务的栈顶

pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( uint16_t ) 1 );

//pxNewTCB->pxStack指向最初的栈顶(固定不变的位置)、而新的栈顶pxTopOfStack是随着进栈出栈而变化的。
pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );

③:初始化任务控制块

函数名:prvInitialiseTCBVariables

函数返回值数据类型:static void

函数描述:初始化任务控制块中的一些变量

函数参数:新创建的任务控制块指针pxNewTCB、任务的描述pcName、任务优先级uxPriority、

xRegions一般为NULL指针,堆栈深度usStackDepth

 prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth );

④:初始化任务堆栈

pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );

⑤:初始化列表

prvInitialiseTaskLists();

⑥:将新创建的任务加入到任务就绪列表中

     prvAddTaskToReadyList( pxNewTCB );

⑦:如果调度器已经启动且新创建的任务优先级较高则执行一次任务调度

if( xSchedulerRunning != pdFALSE )//但是此时任务调度器已经启动
  {
            /* If the created task is of a higher priority than the current task
            then it should run now. */
   if( pxCurrentTCB->uxPriority < uxPriority )//如果优先级比当前运行的任务优先级
                                //高的话就执行一次任务切换
    {
      taskYIELD_IF_USING_PREEMPTION();
     }

    else
    {
       mtCOVERAGE_TEST_MARKER();
     }
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值