时间片+状态机实现裸机伪多任务

注:上述伪多任务是按个人理解命名的,实际上在裸机中跑的还是单线程,只是效果看上去是多线程。

时间片轮询方式是把MCU的执行时间划分为一块一块的,然后根据自己的需求去分配这一块一块的时间,而当你的任务(在时间片轮询方法中实现的任务)的执行时间足够短的时候可以实现多线程的现象,效果如下图所示:

而当你的任务所需要的的时间不能在一个时间片的情况下完成时,此时就会出现一直在执行某一个任务,而现象则是跟裸机大循环(前后台系统)类似的现象出现,如下图所示:

出现此现象的原因跟时间片轮询调度的机制有关(可参考我的另一篇文章时间片轮询系统学习),因为每一次调度(即进入时间心跳定时中断进行调度)如果你的上一次任务并没有完成的话,在退出调度(即退出中断以后)会接着执行上一次未完成的任务,而出现大循环。

那我们如何实现裸机长任务的调度呢?既然任务太长导致无法及时完成,那么我们便用状态机的方式将一个长任务分割成一个个状态,每一次调度只要完成其中一个状态(在此之中不能用类似延时的方式将执行时间拖长到比时间片还长,只能执行短暂的小于时间片的延时),那么就可以将CPU的执行时间重新划分为一块一块,每一块都有对应的状态需要去完成,而且执行状态时间足够短,那么便可以实现多任务的效果啦。

附上伪代码:(时间片轮询调度请参考我的另一份文章,这里只提供调用状态机的任务情况,这个项目实现的效果是上电:①动态扫描数码管②RGB呼吸灯,①和②需要有同时执行的现象)

void task_schedule(void)//任务调度函数
{for (uint8_t i=0; i<TASKS_MAX; i++)                              // 逐个任务时间处理,TASKS_MAX有多少个任务{if (mytask_list[i].timer)                                   // 时间不为0{mytask_list[i].timer--;                                  // 减去一个节拍if (mytask_list[i].timer == 0)                           // 时间减完了{mytask_list[i].timer = mytask_list[i].interval_time; // 恢复计时器值,从新下一次mytask_list[i].run = 1;                              // 任务可以运行}}}
}
void task_process(void)//任务执行函数
{for (uint8_t i=0; i<TASKS_MAX; i++)          // 逐个任务时间处理{if(mytask_list[i].enable_flag)          //任务允许被运行{if (mytask_list[i].run)              // 时间不为0{mytask_list[i].run = 0;          // 标志清0mytask_list[i].mytask();         // 运行任务}}}
}
void digital_task(void)//动态数码管显示,任务1
{digital_fsm();
}
void led_breath_task(void)//呼吸灯,任务2
{  led_breath_fsm();
}

以上纯属个人见解,有误之处还望大家指正。

时间片轮询+状态机实现裸机多任务相关推荐

  1. 适合单片机使用的一个短小精悍的时间片轮询系统

    随着单片机外设的日益丰富,以及RAM,ROM的增大.RTOS实时操作系统被越来越广泛的使用.实时操作系统对任务的实时性高效处理是毋容置疑的! 但是有更多的情况我们仅仅需要一个短小精悍的轮询系统,比如实 ...

  2. STM32基于时间片轮询机制

    1. 基于时间片的轮询调度算法(仅局限单核CPU芯片): 利用定时器为每个任务函数设定执行时间间隔,保证使用频率高的函数多次被调用,提高单核芯片的资源利用率.如果只是简单地将A.B两个函数放在whil ...

  3. 单片机程序架构之----时间片轮询法

    我们在编写单片机代码时,常用的方法是根据各个模块的功能函数顺序执行,这种方法对于应用程序简单,实时性不高的场合比较实用.但对于一些对每个功能模块执行响应不同的系统来说,顺序执行就不能完成任务,例如一个 ...

  4. 32时间片轮转_【解惑】到底是quot;时间片quot;?还是quot;分时轮询quot;?

    1.简单聊一聊 今天为大家推荐一首迈克非常经典的歌曲,直译歌名为你不是孤单一个人的意思,一首非常治愈的歌曲,迈克的作品包括歌曲和舞蹈应该算是一代人的记忆吧,特别是太空步伐更是具有标志性和独特性. 好了 ...

  5. 嵌入式操作系统专题《基础概念1@轮询系统、前后台系统、多任务系统的区别》

    轮询系统:即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件.不能说轮询是低端的,轮询系统是一种非常简单的软件结构,但适用于仅需要顺序执行代码且不需要外部事件来驱动 ...

  6. 单片机开发-软件架构与系统设计(工程实现使用的也是轮询系统、前后台系统和多任务系统)

    目录 单片机开发1 轮询系统: 概述 详述 前后台系统 概述 详述 单片机开发1 单片机开发可以分为程序裸跑与多任务. 在单片机的工程使用中,可以分为裸机系统和多任务系统. 裸机系统一般被叫做裸跑,大 ...

  7. 实现简单的多任务轮询(C语言)

    实现简单的多任务轮询(C语言) 前言 总体思路 实现过程 调用示例 完整代码 前言 好久没有做MCU的项目了,最近因为工作需要接手一个STM32的项目,因为项目要求比较简单,也就没有用到操作系统,而是 ...

  8. php pcntl 进程池_PHP 进程池与轮询调度算法实现多任务的示例代码

    phper 请了解进程调度策略,CPU 时间片,进程控制[创建,销毁,回收,进程信号]与及进程运行流程和基本的进程组,信号中断原理,以及进程之间的关系. 关于进程的更多内容可参考本人前面撸过的文章或是 ...

  9. Tiny4412裸机程序,按键检测(轮询方式)

    由于前几天出差,博客没有更新,今天看了看Tiny4412的原理图,把按键扫描程序写了一下,用的是轮询方式,后面会有中断方式的实现,闲话少说,进入正题,程序由前一个实验Tiny4412之C语言实现流水灯 ...

最新文章

  1. Bootstrap 基本模板
  2. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧
  3. DCMTK:类DcmUniqueIdentifier的测试程序
  4. Mysql的timestamp与datetime
  5. 我就改了一行代码,为什么就全超时了?
  6. ajax速度axio速度,[转]Ajax Fetch Axios之间的详细区别以及优缺点
  7. 专题导读:新基建环境下的数据资产价值评估与定价
  8. 商汤春招特别策划-春招百晓生系列空宣第2期,助你收获心动的offer
  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-3.微信Oauth2.0交互流程讲解...
  10. 转载visio 绘图矢量图素材网站
  11. python科研向论文检索篇——提取PDF文字以供全文信息检索
  12. 一个全栈工程师要掌握哪些技能
  13. cocos 添加遮罩后白屏_Cocos2dx3.2 Crazy Tetris 由于遮罩引起的部分手机白屏
  14. oracle连续月份列表,Oracle实现查询2个日期所跨过的月份列表/日期列表的方法分析...
  15. exls表格搜索快捷键_Excel快捷键使用大全
  16. 【读书笔记】《解读基金——我的投资观与实践》(修订版)
  17. SQL 大厂面试真题篇
  18. H3C-stp-链路聚合-端口安全
  19. 重要经验八---UIImage转换为CVPixelBufferRef
  20. maya! board_maya人物跑步动画制作中文教程

热门文章

  1. java变量_Java变量
  2. 如何用ChatGPT做会议总结?
  3. 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了
  4. 成为一个有目标的学习者
  5. 开放Centos7端口
  6. (NLP)文本预处理
  7. Spring AOP @Aspect没反应的处理
  8. 微信公众号 - 实现 H5 网页在微信内置浏览器中下载文件,可预览和下载 office 文件(doc / xls / ppt / pdf 等)适用于任何前端技术栈网站,兼容安卓和苹果系统!
  9. JSTree的基本用法
  10. 51单片机简单乐曲演奏(青花瓷)