MCU 驱动应用分层架构 mcu系统架构

您所在的位置:网站首页 驱动板mcu程序坏怎么修 MCU 驱动应用分层架构 mcu系统架构

MCU 驱动应用分层架构 mcu系统架构

2024-05-02 04:53| 来源: 网络整理| 查看: 265

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

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

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

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

相比前后台系统,多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。

MCU 驱动应用分层架构 mcu系统架构_优先级

原文链接:

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 将转向执行另一个程序。

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 返回执行高优先级的任务。在没有任务调度的系统,一些功能的实现可能需要程序不断的穿插,即负责不同功能的程序,融合在一起,这无疑不利于可读性以及程序的维护等。 操作系统通常包括更多的功能,除了内核(调度任务)以外,还通常包括文件系统,内存管理,外设的驱动等等。有了操作系统,功能的实现变得更加的便捷。当然,操作系统或是逻辑系统,需要根据功能需求确定



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3