版权声明:本文为博主原创文章,未经博主允许不得转载。 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 轮询系统,前后台系统和多线程系统的软件模型
模型 | 事件响应 | 事件处理 | 特点 |
---|---|---|---|
轮询系统 | 主程序 | 主程序 | 轮询响应事件, 轮询处理事件 |
前后台系统 | 中断 | 主程序 | 实时响应事件, 轮询处理事件 |
多线程系统 | 中断 | 线程 | 实时响应事件, 实时处理事件 |