MCU的程序结构大致有三类(裸机------时间片轮询)

MCU的程序结构大致有三类:

实际是四种:轮询 前后台 时间片轮询 带系统的
裸机系统通常分成轮询系统和前后台系统

轮询系统就是在main函数里,让各个功能函数按顺序循环执行,实时性差,不适合有外部事件驱动时情况。

前后台系统就是在轮询系统中加入了中断,平时用得比较多,中断在这里称为前台,main函数里面的无限循环称为后台。

相比前后台系统,多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。
MCU的程序结构大致有三类(裸机------时间片轮询)_第1张图片

原文链接:https://blog.csdn.net/hwwxuexi/article/details/115539242

1.1 简单的前后台顺序执行程序;

了解前后台系统之前先来了解一下***轮询系统***
轮询系统是 MCU 中最简单的入门系统,它的程序结构是通常只需要一个 While(1)或For(;;)死循环来实现:

//程序清单 1.1

......
int main(void)
{
    HwInit();                //初始化外设
	while(1)
	{
		statement_1;         //语句1
		statement_2;         //语句2 
		statement_3;         //语句3
		......
	}
	return 0;
}

在该程序中,MCU首先初始化外设,如定时器,串口等,接着就不断循环的运行while(1)中的三个语句,轮询程序结构非常简单,通常适用一些不需要响应外部输入的嵌入式设备。因为在需要处理外部输入事件时,可能会由于某个语句执行时间较长,导致错过外部输入事件。比如 MCU 通过 read_key()函数来读取一个按键,当用户在按下抬起按键时,MCU 正在执行其它语句,而当 read_key() 被执行时,按键早已抬起,这便丢失了一次按键检测。显然,这样的程序会出现按键频繁失灵的缺陷。
前后台系统
前后台系统在轮询系统中,增加了 中断 机制。中断机制可以打断 MCU 目前正在执行的程序,而执行另外一段程序,这段程序称为中断程序,当中断程序执行完成,再回到原先位置,执行接下去的代码:

//程序清单 1.2
......
int main(void)
{
    HwInit();                //初始化外设
	while(1)
	{
		statement_1;         //语句1
		statement_2;         //语句2 
		statement_3;         //语句3
		......
	}
	return 0;
}

void interrupt_event(void)
{
    statement_4;         //语句4
    return 0;
}

在清单1.2中,interrupt_event()函数可以被中断执行,在前后台系统中,可以通过程序配置使 MCU 在某一个IO口有低电平,产生一次中断并运行中断函数。前后台系统与轮询系统相比,其中一个明显优点是可以实时响应外部输入。另外,通常中断是可以嵌套的,即是当发生一个中断时,MCU 开始执行中断相关代码,此时一个优先级更高的中断发生,MCU 将转向执行另一个程序。
https://blog.csdn.net/qq_17351161/article/details/105609341

1.2 裸机时间片轮询法;

1.什么情况下使用裸机时间片轮询法?
随着需求程序越来越复杂,简单的前后台顺序执行程序显得有些吃力、稳定性变差、bug也会增多。这是除了移植复杂的操作系统,还有一种更为轻便的方法来管理MCU的执行逻辑,即***裸机时间片轮询法***。
2.需要一个定时器中断资源去计时,计时周期如1ms,10ms,100ms,500ms…… 让这个定时器来管理我们的任务,中断程序中查询更新任务标志。然后在主循环中判断有无任务标志,在然后执行相应的任务即可。
3.使用裸机时间片轮询法可以提高轻量级程序代码的稳定性和可靠性,实现过程方便快捷。

1.3 搭载操作系统。

多线程系统是通过软件实现的,它可以让 MCU “同时”执行多个函数。事实上,这只是效果上看是多个函数在执行,由于单核的 MCU 每次只能处理一条指令,所以只是通过不断的切换 MCU 执行的函数(每个函数都执行一小段时间),由于MCU速度很快,运行效果就是多个函数在同时执行。这些被 MCU 不断切换执行的函数,在嵌入式系统中,被称为任务:

//程序清单 1.3

int main(void)
{
    HwInit();                //初始化外设
    OS_Init();               //初始化系统
    OS_Start();              //运行内核调度
	while(1)
	{      
		......
	}
	return 0;
}

//任务1
void task_1(void)
{
	task_statement_1;
	task_statement_2;
	task_statement_3;
	OS_delay();
}

//任务2
void task_2(void)
{
	task_statement_1;
	task_statement_2;
	task_statement_3;
	OS_delay();
}

//任务3
void task_3(void)
{
	task_statement_1;
	task_statement_2;
	task_statement_3;
	OS_delay();
}

在清单1.3中,程序不断的产生中断,每次中断都会执行三个任务中的其中一个,这是通过优先级来确定的,一旦当高优先任务执行到OS_delay()函数时候,低优先的任务就会被执行,当高优先级延时结束以后,则 MCU 返回执行高优先级的任务。在没有任务调度的系统,一些功能的实现可能需要程序不断的穿插,即负责不同功能的程序,融合在一起,这无疑不利于可读性以及程序的维护等。
操作系统通常包括更多的功能,除了内核(调度任务)以外,还通常包括文件系统,内存管理,外设的驱动等等。有了操作系统,功能的实现变得更加的便捷。当然,操作系统或是逻辑系统,需要根据功能需求确定

原文链接:https://blog.csdn.net/qq_17351161/article/details/105609341

你可能感兴趣的:(笔记,mcu,stm32)