嵌入式开发交流网论坛

标题: 单片机应用程序架构的介绍 [打印本页]

作者: 觋牧    时间: 2018-6-25 13:48
标题: 单片机应用程序架构的介绍
[attach]1630[/attach]
“单片机应用程序的架构”这可能不是一个专业术语,但是是对一些经验的一个总结。我们在开发单片机的时候,程序的架构大致可分为以下三种:
1. 顺序执行程序,这类写法是大多数人使用的方法。
2. 时间片轮询法,此方法是介于顺序执行与操作系统之间的一种方法。
3. 操作系统,此法应该是应用程序编写的最高境界。
下面来详细的介绍一下:
1.顺序执行
这种方法的应用程序比较简单,在实时性,并行性要求不太高的情况下是一个不错的方法,程序设计简单,思路比较清晰。初学者使用的比较多,但是也是单片机应用最广的一种。我们来看Arduino 库的mian()函数。
这是一个典型的顺序执行的程序模型:
[attach]1631[/attach]
2.时间片轮询法。
很多人说过这种方法,但是都没有讲的很清楚。我也找了好久的资料,看到了这样的例子,感觉还是很不错的,很经典的。我们来看看:
目标:使用1个定时器,完成3个不同的任务。

[attach]1632[/attach]
[attach]1633[/attach]
定时中断服务函数,在中断中逐个判断,如果定时值为0,表示没有使用此定时器或此定时器已经完成定时,不用处理。否则定时器减1,直到为0时,相应标志位值1,表示此任务的定时值到了。
[attach]1634[/attach]
在任务中判断TaskMark[0] 是否为0x01即可
通过上面的例子:定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。这个就厉害了。
循环判断标志位:如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。
执行其他函数:那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?

时间片轮询法的架构:
[attach]1635[/attach]
[attach]1636[/attach]
[attach]1637[/attach]
此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。
下面我们就来举例说明这个架构怎么运用吧,我们还是以Arduino为例子,来执行3个任务:每隔1s执行任务1,每隔30ms执行任务2,每隔10s执行任务3。大家不要吐槽,说这个需求就用arduino直接编程就好了,分分钟的事,为啥还要搞的那么麻烦,我只能说,还是要细细研究一下。
[attach]1638[/attach]
我们看一下输出:
[attach]1639[/attach]
有没有有点带上操作系统的感觉。
3.操作系统

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

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




欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/) Powered by Discuz! X3.2