找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1748|回复: 0
收起左侧

一种基于系统节拍时间的单片机程序设计模式( 思想的提出 -01)

[复制链接]
ID:249272 发表于 2019-12-2 16:58 | 显示全部楼层 |阅读模式
本帖最后由 水漫金山2017 于 2019-12-3 09:00 编辑

   

    单片机又称微控制器,其工作原理与PC机相似,也就是存储程序和程序控制的工作方式。这里的程序有可能是汇编语言也有可能是C语言,但这里我们即将要讨论的不是用哪种语言编写程序的问题。我想和大家讨论的是一种程序设计模式,也就是讨论一下单片机程序设计中的一种比较通用,合理的方法。当然了,这里还是以C语言程序设计作为例程。我们都知道,从微观上来讲,CPU只能一条条的执行指令。(这里为方便讨论问题,有可能不区分指令和程序)。也就是说,在微观上来讲,CPU在某一个时刻,只能执行一个指令动作,这是我们要明白的第一点。第二点,我们还要知道单片机中还有一个特别好的运行机制,那就是中断。中断可以让任劳任怨的CPU专注于眼前的事情,而不必时刻“担心”着“突然事件”。待到“突然事件”发生,CPU再转头去处理。还有一点,我们要明白,那就是单片机的主频越高,指令执行的越快。(当然了,频率高带来的附作用,也不是我们这篇文章要讨论的)。知道了以上三点,我们现在就开始有关文章主题的讨论。
    平时生活中,我们经常用快慢这两个字。比如说,这个人做事真快,吃饭也快,写程序也快,总之吃喝拉撒,衣食住行都快。那么一个人做事快,有什么好处呢?很明显,节约时间,能处理更多的事情,看起来像是很多事情同时做了一样。慢,则一切相反。对单片机这种MHZ频率的机器来讲,实现”看起来像”同时处理更多的事情更是不在话下。这也是单片机程序能并发的物质基础之一。单片机虽然快,但我们也不能随随便便把所有任务都直接丢给单片机去处理,那样会出问题的。比如,我们在刚一接触单片机程序设计时,会这样写程序://主程序:                                 //中断服务程序
void main()                                void ISR(void)
{                                               {
      //初始化单片机系统                  Task1();
                                                    Task2();
         Inital()                                  Task3();               
                                                }
      //超级循环
     while(1)
     {
           Task1();
           Task2();
           Task3();
     }
}
这样写单片机程序会因为一个任务的“阻塞”而耽误其他程序的实时响应。比如,Task1,是一个按键扫描程序,其中有大概10ms的消抖时间,如果我们在程序中直接写一个delay_10ms()程序,那么Task2和Task3势必会因为这个延时而耽误运行。所以,为了解决类似这样的冲突,我们提出了一种单片机程序设计模式,一种基于系统节拍时间的程序设计模式。这种设计模式的思想是,在一个系统节拍时间到来,只运行其中一任务(注意,一定是一个任务)。所谓节拍时间是单片机系统提供给每一个任务的运行时间。在实际应用中,其实每个任务的最低响应时间要求可以是不同的,比如,按键可以10 - 20ms扫描一次,动态扫描的LED,总的刷新周期不超过20ms,人眼还是可以接受的,再比如,温度数据采集甚至可以500ms一次,正因为这些差异我们可以实现单片机程序的“并发执行“。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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