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

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

时间片轮询方式是把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. velocity自定义标签和指令
  2. vc采集网页内frame框架下所有元素(不指定具体table/form)
  3. 5.0、Android Studio调试你的应用
  4. 《系统集成项目管理工程师》必背100个知识点-57沟通管理
  5. 归并排序,快速排序,冒泡排序,选择排序,基数排序,桶排序,堆排序(c++实现)
  6. Android 常见adb命令
  7. 天津大学计算机考试题库,天津大学在线考试题库及答案[开放英语专]
  8. (篇五)C语言水仙花数的花样求法
  9. 多数iPhone应用程序的不足之处
  10. j计算机集成维护工具,USBOS v2.1电脑超级维护工具启动盘(集成最全winPE)
  11. 阿里云部署hexo教程
  12. vue-element-template模板添加登录页面自定义背景
  13. Linux查看端口命令
  14. 苹果笔记本安装windows系统,在windows系统中一些快捷键的使用
  15. Android集成FFmpeg并实现视频转码
  16. 全面认识MOS管,一篇文章就够了
  17. 一篇不错的关于VSS的入门介绍
  18. Eloquent JavaScript 笔记 九: Regular Expressions(下)
  19. c语言程序设计林小茶,C语言第一篇概述林小茶
  20. Netcraft中国SSL市场份额统计,沃通WoSign跃居第二

热门文章

  1. 哪个工具可以保护计算机免受ESD的影响,可以避免ESD影响的实用解决方案
  2. poj3254/洛谷P1896 状压dp
  3. Golang处理excel用流式写入,追加行数据
  4. JAVA面试-系统设计题
  5. 怎么批量新建文件夹并命名?
  6. 【微信小程序】解决点击(bindtap)和长按(bindlongtap)冲突
  7. SpringBoot中Mybatis-plus的通用接口BaseMapper方法演示(上)
  8. vector<int> v 与 vector<int> v(n) 的区别
  9. C# 读取处理超大TXT文本文件
  10. 暗棋单机版_中国象棋暗棋下载_中国象棋暗棋安卓版下载 v1.6.8 安卓单机版_飞飞巴士下载...