裸机系统与多线程系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013517122/article/details/82971627

1. 裸机系统

裸机系统即直接操作硬件, 所有操作均在主程序中实现. 裸机系统又细分为如下两种:
1. 轮询系统
2. 前后台系统

1.1 轮询系统

轮询系统即为在裸机编程的时候, 在主程序初始化完硬件之后, 让主程序在一个死循环里面不断循环, 顺序地做各种事情, 伪代码如下 :
int main()
{
	/* 初始化硬件 */
	Init_HardWare();
	
	/* 无限死循环 */
	while(1) {
		/* 顺序的重复处理所有事件 */
		DoSomething1();
		DoSomething2();
		DoSomething3();
		...
	}
}
1.1.1 轮询系统优缺点
优点 :
	 代码结构简单明了, 适用于顺序执行代码, 且不需要外部事件驱动就能完成的事情. 
缺点 :
	 顺序执行会导致系统的实时响应能力不好, 来不及及时响应事件.

1.2 前后台系统

相比轮询系统, 前后台系统是在轮询系统的基础上加入了中断, 外部事件的响应在中断中完成, 事件处理还是在主程序的无限死循环中处理, 我们称中断为前台, 无限死循环为后台, 伪代码如下 :
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

int main()
{
	/* 初始化硬件 */
	Init_HardWare();
	
	/* 无限死循环 */
	while(1) {
		/* 顺序的重复处理所有事件 */
		if (flag1) {
			DoSomething1();
		}
		if (flag2) {
			DoSomething2();
		}
		if (flag3) {
			DoSomething3();
		}
}    

/* 中断处理函数 */
void ISR1(void)
{
	/* 置标志位 */
	flag1 = 1;
	
	/* 如果事件的处理时间很短, 则在中断里面处理
		如果事件处理时间比较长, 则在后台的无限死循环中处理 */
	DoSomething1();
}

/* 中断处理函数 */
void ISR2(void)
{
	/* 置标志位 */
	flag2 = 1;
	
	/* 如果事件的处理时间很短, 则在中断里面处理
		如果事件处理时间比较长, 则在后台的无限死循环中处理 */
	DoSomething2();
}

/* 中断处理函数 */
void ISR3(void)
{
	/* 置标志位 */
	flag3 = 1;
	
	/* 如果事件的处理时间很短, 则在中断里面处理
		如果事件处理时间比较长, 则在后台的无限死循环中处理 */
	DoSomething3();
}
1.2.1 前后台系统优缺点
优点 :
	 1. 解决了轮询系统的单一的顺序执行缺点, 能响应外部中断事件.
	 2. 将事件的响应和处理分开编写. 模块化代码.
	 3. 前后台系统引进中断, 确保事件不会丢失, 再加上中断可嵌套, 可以大大提高系统的实时响应能力, 适用于大多数的中小型项目中, 前后台系统运用的好, 堪称有操作系统的效果.
缺点 :
	 前后台系统也是顺序执行的系统, 功能的实现依靠死循环, 实时性依靠中断, 或检测IO引脚的电平, 局限于任务少的中小型项目.

2. 多线程系统

相比前后台系统, 多线程系统的事件响应也是在中断中完成的, 但是事件处理是在线程中完成的. 多线程系统中的线程跟中断一样吗也具有优先级, 优先级高的会被优先执行, 可以将紧急事件对应的线程优先级设置更高, 就会立马得到响应, 相比前后台系统, 多线程系统的实时性又被提高了, 伪代码如下 :
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

int main()
{
	/* 初始化硬件 */
	Init_HardWare();
	
	/*  初始化 OS */
	Init_RTOS();
	
	/* OS 开启任务调度 */
	Start_RTOS();
}    

/* 中断处理函数 */
void ISR1(void)
{
	/* 置标志位 */
	flag1 = 1;
}

/* 中断处理函数 */
void ISR2(void)
{
	/* 置标志位 */
	flag2 = 1;
}

/* 中断处理函数 */
void ISR3(void)
{
	/* 置标志位 */
	flag3 = 1;
}

void DoSomething1(void)
{
    /* 无限死循环, 不能返回 */
	for (; ;) {
		/* 线程实体, 事件处理 */
		if (flag1) {	
			...
		}
	}
}

void DoSomething2(void)
{
    /* 无限死循环, 不能返回 */
	for (; ;) {
		/* 线程实体, 事件处理 */
		if (flag2) {	
			...
		}
	}
}

void DoSomething3(void)
{
    /* 无限死循环, 不能返回 */
	for (; ;) {
		/* 线程实体, 事件处理 */
		if (flag3) {	
			...
		}
	}
}

2.1 多线程系统优缺点

优点 :
	 1. 提高系统的实时性, 任务可以更快的响应.
	 2. 根据程序的功能, 将程序主体分割成一个个独立的, 无限循环且不能返回的小程序(称之为线程), 每个线程都是独立的, 互不干扰, 且具有优先级, 由操作系统调度.
	 3. 加入操作系统后, 不用再去精心设计程序执行流, 不用担心模块间是否存在相互干扰, 编程更加简单.  
	 4. 适用于大型项目. 
缺点 :
	 带来额外的开销, 操作系统占据额外的 Flash 和 Ram 空间, 现如今, 单片机的Flash 和 Ram 越来越大, 完全足以抵挡 RTOS 的丁点开销. 

3 轮询系统,前后台系统和多线程系统的软件模型

模型 事件响应 事件处理 特点
轮询系统 主程序 主程序 轮询响应事件, 轮询处理事件
前后台系统 中断 主程序 实时响应事件, 轮询处理事件
多线程系统 中断 线程 实时响应事件, 实时处理事件

猜你喜欢

转载自blog.csdn.net/u013517122/article/details/82971627