单片机应用程序架构的介绍
“单片机应用程序的架构”这可能不是一个专业术语,但是是对一些经验的一个总结。我们在开发单片机的时候,程序的架构大致可分为以下三种:
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嵌入式
查看评论 回复