单片机程序设计模式

RTOS:多任务拆分交叉执行

Q:状态机和多任务模式有什么区别

Q:任务创建和任务调度器是什么?

裸机程序的设计模式可以分为:轮询、前后台、定时器驱动、基于状态机。前面三种方
法都无法解决一个问题:假设有 A、B 两个都很耗时的函数,无法降低它们相互之间的影响。
第 4 种方法可以解决这个问题,但是实践起来有难度。

1、轮询模式

2、前后台

所谓“前后台”就是使用中断程序。假设收到同事发来的信息时,电脑会发出“滴”的
一声,这时候妈妈才需要去回复信息。

如果电脑声音“滴”、小孩声音“啊”不会同时、相近发出,那么“回一个信息”、“喂一口饭”相互之间没有影响。在不能满足这个前提的情况下,比如“滴”、“啊”同时响起,先“回一个信息”时就会耽误“喂一口饭”,这种场景下程序遭遇到了轮询模式的缺点:函数相互之间有影响。

3、定时器驱动

每 2 分钟给小孩喂一口饭,需要每 5 分钟给同事回复信息。 

这种模式适合调用周期性的函数,并且每一个函数执行的时间不能超过一个定时器周期。
如果“喂一口饭”很花时间,比如长达 10 分钟,那么就会耽误“回一个信息”;反过来也是
一样的,如果“回一个信息”很花时间也会影响到“喂一口饭”;这种场景下程序遭遇到了
轮询模式的缺点:函数相互之间有影响。

 

4、状态机

以“喂一口饭”为例,函数内部拆分为 4 个状态:舀饭、喂饭、舀菜、喂菜。每次执行
“喂一口饭”函数时,都只会执行其中的某一状态对应的代码。以前执行一次“喂一口饭”
函数可能需要 4 秒钟,现在可能只需要 1 秒钟,就降低了对后面“回一个信息”的影响。
同样的,“回一个信息”函数内部也被拆分为 3 个状态:查看信息、打字、发送。每次 

执行这个函数时,都只是执行其中一小部分代码,降低了对“喂一口饭”的影响。
使用状态机模式,可以解决裸机程序的难题:假设有 A、B 两个都很耗时的函数,怎样
降低它们相互之间的影响。但是很多场景里,函数 A、B 并不容易拆分为多个状态,并且这
些状态执行的时间并不好控制。所以这并不是最优的解决方法,需要使用多任务系统。

5、多任务系统——多任务模式

本质是:交叉执行,t1~t5 和 ta~te 交叉执行

6、多任务系统——互斥操作

执行多个任务可能会“同时”访问某些资源,需要增加保护措施以防止混乱。比如任务 A、B 都要使用串口,能否使用一个全局变量让它们独占地、互斥地使用串口

7、多任务系统——同步操作

如果任务之间有依赖关系,比如任务 A 执行了某个操作之后,需要任务 B 进行后续的处
理。

当任务 A 处理完事情后,再唤醒任务 B。

 

相关推荐

  1. 裸机程序设计模式

    2024-07-19 12:40:02       30 阅读
  2. 初识tensorflow程序设计模式

    2024-07-19 12:40:02       56 阅读
  3. Python程序设计 单例模式

    2024-07-19 12:40:02       31 阅读
  4. .NET 面向对象程序设计 —— 设计模式 详细版

    2024-07-19 12:40:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 12:40:02       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 12:40:02       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 12:40:02       62 阅读
  4. Python语言-面向对象

    2024-07-19 12:40:02       72 阅读

热门阅读

  1. 动态规划练习题(2024/7/18)

    2024-07-19 12:40:02       22 阅读
  2. 计算机视觉8 图像增广

    2024-07-19 12:40:02       17 阅读
  3. Linux输出重定向详解

    2024-07-19 12:40:02       18 阅读
  4. ArduPilot开源代码之AP_DAL_RangeFinder

    2024-07-19 12:40:02       17 阅读
  5. 可视化页面LandingPage如何修改组件的内容 - Modstart

    2024-07-19 12:40:02       20 阅读
  6. 【SpringBoot】Controller与Test

    2024-07-19 12:40:02       18 阅读
  7. WPF之URI的使用

    2024-07-19 12:40:02       24 阅读
  8. oracle显示列名,列注释

    2024-07-19 12:40:02       19 阅读
  9. vite+vue3项目初始化搭建

    2024-07-19 12:40:02       15 阅读
  10. wsdl接口返回xml数据接收

    2024-07-19 12:40:02       18 阅读
  11. CSAPP看了快半年了

    2024-07-19 12:40:02       18 阅读
  12. STM32中volatile关键字

    2024-07-19 12:40:02       18 阅读
  13. 最长公共子序列和最长公共子串模板(LCS)

    2024-07-19 12:40:02       22 阅读