搜索
bottom↓
回复: 1

嵌入式程序架构--你了解多少?

[复制链接]

出0入234汤圆

发表于 2021-12-20 17:37:17 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2022-1-7 17:32 编辑

以下文章来源于:公众号:开源电子网,读取更多技术文章,请扫码关注

讨论发帖图.png


嵌入式程序架构--你了解多少?


前言

       单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我们浅谈一下我们单片机开发中,有哪些程序架构。



一. 裸机系统

1. 轮询系统

      轮询系统是 MCU中最简单的入门系统,它的程序结构是通常只需要一个While(1)或for(;;)死循环来实现:

  1. <font size="4">int main(void)</font>

  2. <font size="4">{</font>

  3. <font size="4">    while(1)</font>

  4. <font size="4">    {</font>

  5. <font size="4">        //事务1</font>

  6. <font size="4">        //......</font>

  7. <font size="4">        //事务n</font>

  8. <font size="4">    }</font>

  9. <font size="4">    return0;</font>

  10. <font size="4">}</font>
复制代码

       这种程序架构就是不断循环,那么这种程序架构的缺点是非常的明显的—实时性差,因为我们的编写的代码都是顺序的执行,如果事务1和事务2之间有一个延时函数,那么处理事务2必须等待延时时间到来才可以执行相应的代码。

       例如下面的动画显示:

          1.gif
        所有的事务都是顺序的执行的。

        2. 前后台系统

       这种系统可称为前后台系统或超循环系统(Super-Loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也叫中断级。

       前后台系统在轮询系统中,增加了中断 机制。中断机制可以打断 MCU目前正在执行的程序,而执行另外一段程序,这段程序称为中断程序,当中断程序执行完成,再回到原先位置,如以下源码所示:

  1. <font size="4">int main(void)</font>

  2. <font size="4">{</font>

  3. <font size="4">    while(1)</font>

  4. <font size="4">    {</font>

  5. <font size="4">        事务1;</font>

  6. <font size="4">        事务2;</font>

  7. <font size="4">        事务3;</font>

  8. <font size="4">        ......</font>

  9. <font size="4">    }</font>

  10. <font size="4">    return0;</font>

  11. <font size="4">}</font>

  12. <font size="4">//中断服务函数</font>

  13. <font size="4">void interrupt_event(void)</font>

  14. <font size="4">{</font>

  15. <font size="4">    事务4;         //语句4</font>

  16. <font size="4">    return0;</font>

  17. <font size="4">}</font>
复制代码

       前后台系统与轮询系统相比,其中一个明显优点是可以实时响应外部输入、中断是可以嵌套的,即是当发生一个中断时,MCU开始执行中断相关代码,此时一个优先级更高的中断发生,MCU将转向执行另一个更高优先级的中断。

       例如下面的动画显示:

          2.gif



二. RTOS操作系统

1. 时间片轮转调度

       时间片轮询法实际上通常出现在操作系统中,也就是说它属于操作系统,每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。
       如以下源码所示:
  1. <font size="4">void task1(void)</font>

  2. <font size="4">{</font>

  3. <font size="4">    while(1)</font>

  4. <font size="4">    {</font>

  5. <font size="4">        事务1;</font>

  6. <font size="4">    }</font>

  7. <font size="4">}</font>

  8. <font size="4">void task2(void)</font>

  9. <font size="4">{</font>

  10. <font size="4">    while(1)</font>

  11. <font size="4">    {</font>

  12. <font size="4">        事务2;</font>

  13. <font size="4">    }</font>

  14. <font size="4">}</font>
复制代码

       注意:任务是有优先级的,同等优先级下的任务才可以使用时间片轮转调度。

      例如下面的动画显示:
         3.gif


2. 抢占式系统


       RTOS的内核负责管理所有的任务,内核决定了运行哪个任务,何时停止当前任务切换到其他任务,这个是内核的多任务管理能力。多任务管理给人的感觉就好像芯片有多个CPU,多任务管理实现了CPU资源的最大化利用,多任务管理有助于实现程序的模块化开发,能够实现复杂的实时应用。中断能打断所有任务。

          4.gif



三. 如何选择合适的程序架构

       对于上述讲解的程序架构,我们该如何选择呢,首先根据自己的项目以及MCU两个方面考虑。

       项目选择分析:我们的产品是否要求实时性非常好的产品,如果实时性非常好的产品,小编建议使用RTOS作为实时系统例如UCOSIII、FreeRTOS等操作系统,如果我们单单制作功能特别少的,例如汽车的智能钥匙,就是负责汽车的开锁,关闭等特别少的功能,比较适合选择前后台系统,

       如果我们的项目是关于物联网领域的,小编建议使用RTT以及OneOS等相关物联网操作系统,因为该操作系统不需要我们编写相关的设备驱动以及移植网络协议,直接调用相关API函数即可。

       MCU选择分析:首先我们选择的主控芯片有关,如果我们选择一款flash以及SRAM非常小型的MCU,那么移植RTOS可能比较吃力了,目前FreeRTOS操作系统最低需要3k到5k内存。


出0入50汤圆

发表于 2021-12-21 15:30:07 | 显示全部楼层
动画内所有中断结束后并没有返回到断点处执行,示意反倒是转到下一个任务执行了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-7-7 04:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表