开启辅助访问 切换到窄版

打印 上一主题 下一主题

单片机应用程序架构的介绍

[复制链接]
作者:觋牧 
版块:
MCU单片机技术 单片机入门及综合应用 发布时间:2018-6-25 13:48:36
8570
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式

“单片机应用程序的架构”这可能不是一个专业术语,但是是对一些经验的一个总结。我们在开发单片机的时候,程序的架构大致可分为以下三种:
1. 顺序执行程序,这类写法是大多数人使用的方法。
2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。
3. 操作系统,此法应该是应用程序编写的最高境界。
下面来详细的介绍一下:
1.顺序执行
这种方法的应用程序比较简单,在实时性,并行性要求不太高的情况下是一个不错的方法,程序设计简单,思路比较清晰。初学者使用的比较多,但是也是单片机应用最广的一种。我们来看Arduino 库的mian()函数。
这是一个典型的顺序执行的程序模型:

2.时间片轮询法。
很多人说过这种方法,但是都没有讲的很清楚。我也找了好久的资料,看到了这样的例子,感觉还是很不错的,很经典的。我们来看看:
目标:使用1个定时器,完成3个不同的任务。


  • 定义数据


  • 定时器中断服务函数

定时中断服务函数,在中断中逐个判断,如果定时值为0,表示没有使用此定时器或此定时器已经完成定时,不用处理。否则定时器减1,直到为0时,相应标志位值1,表示此任务的定时值到了。

  • 在需要的应用定时的地方添加如下代码

在任务中判断TaskMark[0] 是否为0x01即可
通过上面的例子:定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。这个就厉害了。
循环判断标志位:如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。
执行其他函数:那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?

时间片轮询法的架构:

  • 设计一个结构体


  • 此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数


  • 任务处理

此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。
下面我们就来举例说明这个架构怎么运用吧,我们还是以Arduino为例子,来执行3个任务:每隔1s执行任务1,每隔30ms执行任务2,每隔10s执行任务3。大家不要吐槽,说这个需求就用arduino直接编程就好了,分分钟的事,为啥还要搞的那么麻烦,我只能说,还是要细细研究一下。

我们看一下输出:

有没有有点带上操作系统的感觉。
3.操作系统

操作系统就不说了,多任务那是很简单的事了。就不做介绍了。

总结:时间片轮询法优势还是比较大的,即有顺序执行法的优点,也有操作系统的优点。结构清晰,简单,非常容易理解。用的也是最多的。
更多的内容请关注头条号:小5嵌入式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

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

本版积分规则

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