本系列帖中将会做一个目录,用来整合相关的与RTOS操作系统学习有关的文章。下面先从四大操作系统的移植开始(以下均为超链接):
(0)常见的嵌入式操作系统简介
——————————我是倾国倾城的分割线—————————
*************************下文为引帖****************************
八年前的一个晚上,半夜被雷声惊醒,睡不着了,想起这几天学的嵌入式RTOS操作系统,索性下床,打开自己的小台灯,在原来的裸机工程中移植了RTOS,再次重启设备,从未如此流畅过。那个时候RTOS还没有那么流行,身边的同学们也都还在还在学习51单片机。而我已经能够提前认识到嵌入式实时操作系统给我带来美好的体验了。这种感觉如果用一个字来概括,就是:“爽”!
那么为什么要使用RTOS操作系统,这里给大家详细解释下:大家都熟悉裸机代码,就是所谓的前后台程序,大致编程思维就是正常情况下程序在主函数main()中一条一条执行,即是后台程序,当触发中断的时候会进入异常处理模式,即是前台程序。前后台程序可以满足一般的工程项目要求。大致模型如下:
我们先来亲手写一段伪代码来感受下前后台程序,伪代码分别如下:
int flag1,flag2; int main() { while(1) { if(flag1 == 1) dosomething1(); if(flag2 == 1) dosomething2(); } return 0; } |
后台程序中不停对标志位进行检测,满足标志位条件时执行对应的代码段,标志位条件是否满足决定于前台程序。
void isr1(void) { flag1 = 1; doisr1thing(); } void isr2(void) { flag2 = 1; doisr2thing(); } |
前台程序段中会对标志位操作和一些紧急事件的处理,当从前台程序退出进入后台程序时,通过重新扫描标志位来执行需要执行的程序段。
看似很棒的结构,感觉也什么缺点啊,其实不然,主要分析以下三点,大家看下是否合理:
1. 首先前后台代码的实时性不能得到保证,有时候甚至事件都无法得到处理,有人说我在吹牛,那我就写一个例子给你们看。
int main() { while(1) { dosomething(); if(flag1 == 1) { doisr1thing1(); delay(2); } if(flag2 == 1) { dosomething2(); } } return 0; } |
void isr(void) { flag1 = 1; flag2 = 1; doisr1thing(); } |
假设程序在执行完doSomething()函数触发中断,在中断函数中将flag1与flag2置1,返回到后台程序先执行的是flag1代码段,要命的是有一个2S的延时,如果doSomething2()要求的响应时间很短(20MS),那么就出现了事件无法得到处理的情况,绝非危言耸听,事实依据在此。
2. 存在CPU空转,CPU利用率低,白白浪费功耗的情况,什么?你还不信,那我再证明给你看,让你心服口服。
int main() { while(1) { dosomething(); if(flag1 == 1) { doisr1thing1(); delay(2); } if(flag2 == 1) { dosomething2(); } } return 0; } |
void isr(void) { flag1 = 1; flag2 = 1; doisr1thing(); } |
void dosomething1() { ..................... ..................... while(!ReadyFlag) { if(++delay >= TimeOut) { return -1; } } } |
稍微改动了一下,将延时2s给删除了,省得大家会说我不折手段,这次给出了doSomething1()函数的内容,其中需要检查ReadyFlag标志位,为了不让程序卡死在这里,一般给了一个时间上限TimeOut,如果说这里的时间上限是1S那么CPU在这里白白空转1S,如果让这1S拿来干其它的事情不知道可以执行多少的任务。
3. 前后台的程序强迫要求人们按照CPU运行的顺序来编写程序,当执行的任务较多,代码结构越来越复杂时,编码就越来越难了。
RTOS的出现将这些问题统统解决,它好像西游记里的九头虫,拥有神奇的力量,有很多心脏和眼睛来帮我们处理各种任务。我用简单的例子来说明RTOS和前后台程序的区别?
没有对比就没有伤害,RTOS好像是有很多个眼睛在同时检测着不同的变量,不管你有多少变量,RTOS都可以第一时间知道是否发生了变化。相比之下前后台程序只是顺序的扫描检测不同的标志位。
如果你的代码还只是停留在点灯、读写简单传感器数据时刻,那你对这些完全不用理睬,当你的代码越写越多,不由自主的发现好多任务都无法响应了,怎么一会WiFi掉线了,一会按键触发不了。累计的代码给你的痛苦有多深,你就会感觉到RTOS有多香,至于到底有多香,需要你亲自尝一尝。RTOS就在那里,学还是不学,全看你自己喽~~~