单片机裸机程序框架之轮询方式

单片机裸机程序框架之轮询方式

  • 前言
    • 最基础的轮询方式
    • 带时间片的轮询方式
    • 带状态机的轮询方式
    • 时间片加状态机的轮询方式

前言

本次学习了百问网的七天物联网直播课收获很多,写下笔记记录一下。

最基础的轮询方式

程序例子:
单片机裸机程序框架之轮询方式_第1张图片
这种是最基础的程序框架,优点是结构简单顺序执行,便于理解,开发成本低。缺点是程序顺序执行会造成对接收信息的处理不及时,造成实时性太差。适用场景在于,不需要处理外界信息的循环动作,或者接收信息后的一次性动作。

带时间片的轮询方式

#include "main.h"
#include "driver_led.h"
static int32_t time1_flag,time2_flag;
static int32_t time1_count,time2_count;
int main(void)
{    
    // 初始化HAL库函数必须要调用此函数
    HAL_Init();
    // 系统时钟即AHB/APB时钟配置
    SystemClock_Config();    
    // 初始化LED
    LedGpioInit();    
	// 循环闪烁
    while(1)
    {
		  if(time1_flag!=1){
				time1_count++;
				if(time1_count >= 1000){
					time1_count = 0;
					time1_flag = 1;
				}
			}
		  if(time2_flag!=1){
				time2_count++;
				if(time2_count >= 2000){
					time2_count = 0;
					time2_flag = 1;
				}
			}
			
		  if(time1_flag == 1){
				time1_flag = 0;
				BLED(ON);
			}
		  if(time2_flag == 1){
				time2_flag = 0;
				BLED(OFF);
			}
    }
}

如上面的代码所示,此程序框架是带入了时间片的概念,使不同的执行动作互相干扰减少,但仔细看程序,也容易看出,这种程序框架还是会相互影响,只是影响改善了。这种程序框架适用场景在于,一些简单的单片机,又需要合理执行不用动作的任务中。用于稍微复杂的动作里,起到各走各的时间段,充分利用MCU资源。

带状态机的轮询方式

实现原理就是在while(1)循环中把一个个的事件处理任务分解成一个又一个的小任务,小到只有一两行代码,然后一个一个的顺序执行,这些一个一个的小任务就是不同的状态。当单片机中存在两个这样大的事件处理任务时,单片机运行了这个任务的一个状态后,转到另一个任务的一个状态,由于状态切换都很快,所以互相影响小,两个任务可以看做像并行运行的感觉。适用场合在于多个复杂的任务中,可以起到不互相干扰,快速响应运行。缺点,编程有点繁琐,任务越多,代码量越多,很复杂,新手不容易看懂。
具体实例我就不写了,因为比较复杂,太多了,懒得写。具体可以看这篇文章。
C语言实现简单状态机

时间片加状态机的轮询方式

这种程序框架比较难,需要很好的编程经验。大概就是,设计好每个任务的时间片,再把这些任务使用状态机的方法实现。这种方式可以非常充分的利用好MCU资源,响应状态也迅速,是比较好的裸机开发模式。但再好的裸机程序框架,任务一多,都会暴露顾前不能顾上后的局面,这就需要编程员合理的分配任务资源,调和任务之间的配合,让充分发挥单片机的作用。这里实例我也不写了,熟悉了时间片和状态机的轮询方式后,尝试着写几个这样的程序就可以掌握了。

你可能感兴趣的:(单片机,stm32,嵌入式硬件)