首页 > 其他分享 >空闲任务

空闲任务

时间:2022-11-19 15:22:51浏览次数:32  
标签:创建 void 调度 任务 TCB 空闲

freertos是通过调度任务实现实时任务的,而通过阻塞延时这一章(参考:https://www.cnblogs.com/toriyung/p/16905193.html),我们可以知道,当其他任务都进入阻塞时,空闲任务则执行。

空闲任务主要负责一些清理的工作,它不用我们手动创建,在调度器启动调度时则创建完成,现在就来了解下其内核。

 

创建任务,主要就是初始化任务的栈等,而我们手动创建任务是将这些参数作为形参传入创建函数,但是由于创建函数是内嵌在任务调度中,没办法直接调用到,所以需要定义另外一个函数,该函数对外部变量和任务调度内部变量联系起来,任务调度内部的创建空闲任务函数再直接调用内部变量。显然,这个函数我们就可以进行自定义其内容。这个函数就是vApplicationGetIdleTaskMemory,它以各参数的二级指针作为输入。

完整代码如下

void vApplicationGetIdleTaskMemory(TCB_t **ppxIdleTaskTCBBuffer,StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{
    /* 空闲任务是启动调度器时内核自动创建的,所以需要预先定好几个内核创建空闲任务时的参数,用户自行对该函数的赋值等进行编写 */

    
    *ppxIdleTaskTCBBuffer = &IdleTaskTCB;
    *ppxIdleTaskStackBuffer = IdleTaskStack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

void prvIdleTask(void)
{
    /*目前暂时不进行有意义的空闲任务定义*/
    for(;;);
}

void vTaskStartScheduler(void)
{
    /* 启动任务调度(含有空闲任务创建) */
    TaskHandle_t xIdleTaskHandle;                                            //空闲任务句柄
    TCB_t *pxIdleTaskTCBBuffer = NULL;                                //空闲任务TCB的指针
    StackType_t *pxIdleTaskStackBuffer = NULL;                //空闲任务栈指针
    uint32_t ulIdleTaskStackSize;                                            //空闲任务栈大小
    
    vApplicationGetIdleTaskMemory(&pxIdleTaskTCBBuffer,&pxIdleTaskStackBuffer,&ulIdleTaskStackSize);        //获取空闲任务信息,注意用二重指针
    
    //创建空闲任务
    xIdleTaskHandle = xTaskCreateStatic((TaskFunction_t)prvIdleTask,(char *)"IDLE", (uint32_t)ulIdleTaskStackSize,(void *)NULL,(StackType_t *)pxIdleTaskStackBuffer,(TCB_t *)pxIdleTaskTCBBuffer);
    
    vListInsertEnd(&(pxReadyTasksLists[0]),&(((TCB_t *)pxIdleTaskTCBBuffer)->xStateListItem));  //换成(*xIdleTaskHandle)->xStateListItem呢?

    /* 原本调度器的调度部分 */
    
    pxCurrentTCB = &Task1TCB;    //指定第一个任务
    
    if(xPortStartScheduler() != pdFALSE)
    {
        //调度器启动失败则进入这里
    }
}

 

标签:创建,void,调度,任务,TCB,空闲
From: https://www.cnblogs.com/toriyung/p/16906189.html

相关文章

  • WEB后台定时任务服务类及实现 源代码
    试用​​http://121.18.78.216/​​希望各位提宝贵意见(自己的讨论群152524724),谢谢实现思路:1、封装实现一个定时任务服务类2、单独实现类实现定时任务的处理。3、在系统启动......
  • Linux中如何实现定时任务
    前言在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作。细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确......
  • IDEA提交任务到spark standalone集群
    参考文章:在idea里面怎么远程提交spark任务到yarn集群代码注意setJars,提交的代码,要提前打好包。否则会报找不到类的错误个人理解就相当于运行的main方法是起了一个spar......
  • 面试官不按套路,竟然问我Java线程池是怎么统计线程空闲时间?
    背景介绍:你刚从学校毕业后,到新公司实习,试用期又被毕业,然后你又不得不出来面试,好在面试的时候碰到个美女面试官!面试官:小伙子,我看你简历上写的项目中用到了线程池,你知......
  • 多任务--进程
    并发:计算机一个内核处理多个任务,其实就是内核在任务间不停的切换,达到好像多个任务同时在执行,实际上每个时刻只有一个任务在执行并行:多个任务利用计算机的多核同时执行,达......
  • 数据集成平台关于【源平台调度&任务生命周期】
    任务调度者调度事件生产任务调度任务池-异步
AsynDispatcher--source实例化适配器执行消费任务实例化集成应用DataHubInstance
handleSourceDispatch()依赖注入集成方......
  • 数据集成平台关于【源平台调度&任务生命周期】
    任务调度者调度事件生产任务调度任务池-异步
AsynDispatcher--source实例化适配器执行消费任务实例化集成应用DataHubInstance
handleSourceDispatch()依......
  • 如何运用并行编程Parallel提升任务执行效率
    《.NET并发变成实战》读后感:并行编程Parallel手打目录:一、前言二、任务并行库(TPL)的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEach+Partitioner......
  • Spring 中定时任务cron表达式问题
    1.问题:Cronexpressionmustconsistof6fields(found7in“0/5****?*“)@Scheduled(cron="0/5****?*")2.原因:年的项1099~2099年,为默认。因此只需要......
  • Python - 实现定时任务
    fromapscheduler.schedulers.blockingimportBlockingSchedulerfromdatetimeimportdatetimedeftest_tick():print(f'timeis{datetime.now()}')if__nam......