基于单片机的嵌入式系统的典型的应用程序框架设计

在单片机应用程序中,最常用、也是最简单的一种典型框架就是前后台系统,这种框架通常是由主函数里的大循环和一个或几个中断服务程序组成,本文主要讲这种典型框架设计问题。

前后台系统适用于一些程序流程简单、实时性要求不高的场合,其中的前台一般就是中断系统,后台是主函数里面的大循环,这里以C语言为例,列出程序框架如下:

void main()
{
	InitAll();  //初始化所有相关外设、变量等
	while(1)
	{
		process();  //后台处理程序
	}
}

上面的代码是典型的后台程序框架,在初始化的子函数中,一般要初始化一些必要的外设(以stm32为例,比如外部中断、定时器中断等中断系统相关寄存器的配置,还有其他必要的外设比如串口、DMA、ADC、DAC等),然后启动中断系统。

InterruptHandler1(){
	process();
}
InterruptHandler2(){
	process();
}
······

InterruptHandlern(){
	process();
}

上面的代码是典型的前台程序框架,前台系统,顾名思义,就是对一些事件起到应答作用,从而达到实际应用中的某些需求。举个例子,在一个采集图像信息的嵌入式系统中,如果是手动采集图像,那么一般会有一个按键去触发开始采样,或者又有其他的按键提供切换某些功能,这时这些按键就可以接到单片机的外部中断引脚上,通过触发中断,改变单片机的工作方式。

除了上面提到的前后台系统,还有一种设计思路,即通过设置一个全局变量global,改变global的值从而使单片机工作在不同的状态以应对不同的需求,本质上这种设计思路可以理解为前后台系统的改进版,它可以把不同的中断触发情况汇聚到一个变量上,便于后台系统在各个状态之间切换。

uint8 global;
void main()
{
	InitAll();
	while(1)
	{
		switch(global)
		{
			case 1: ······
			case 2: ······
			······
			default : break;
		}
	}
}

InterruptHandler1(){
	golbal = CASE1;
}
InterruptHandler2(){
	golbal = CASE2;
}
······

InterruptHandlern(){
	golbal = CASEn;
}

整体上,这种设计思路与前后台系统差别不大,但相对前者来说,这种设计思路便于处理更复杂的一种情况,并且在一些轮流使用cpu的场合,这种思路可以在定时器中断里面修改global的值,从而轮流执行某些程序。

除了上面提到的两种思路,还可以选择在嵌入式操作系统中处理更为复杂的任务,嵌入式OS有很多种,但在这儿推荐两个开源的、比较稳定的OS:μC/OS和Huawei Lite OS,这两种系统均可在对应的官网(华为的这里下载μC/OS这里下载)下载,但下载完毕后需要根据嵌入式系统的硬件情况做一些必要的处理。后面会专门写一些关于如何处理的文章。

(PS:限于作者水平,如有表述不妥之处,欢迎大家指出,另外欢迎大家关注微信公众号“24K纯学渣”,作者将会把处理好的程序共享到公众号上,请期待!)

发布了25 篇原创文章 · 获赞 9 · 访问量 6198

猜你喜欢

转载自blog.csdn.net/qq_42144047/article/details/103796908