嵌入式工程师的为啥要一定要学RTOS,有些同学不学不也混的风生水起?
摘要:学肯定是要学的,嵌入式系统不只是ARM+Linux,不是独有安卓,但凡电子产品都可称为嵌入式系统。物联网行业的兴起,也提升了FreeRTOS市场占有率。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
正文开始:
一、为什么要进修RTOS
在大学里一般电子信息专业的最后大局部都进入嵌入式这个领域,入门首先接触的是单片机编程,尤其是C51单片机,根底的单片机编程通常都是指裸机编程,即不加入任何RTOS(RealTimeOperatingSystem实时操作系统)。常用的有国外的FreeRTOS、μC/OS、RTX和国内的RT-thread、HuaweiLiteOS和AliOS-Things等,其中开源且免费的FreeRTOS的市场占有率极高。在工作中用的最多的就是FreeRTOS,免费也没有版权谁不喜爱用呢?
二、裸机系统
1、轮询系统
轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情。裸机系统通常分成轮询系统和前后台系统。
intmain(void)
{
/*硬件相关初始化*/
HardWareInit();
/*没限循环*/
for(;;){
/*处理事情1*/
DoSomething1();
/*处理事情2*/
DoSomethingg2();
/*处理事情3*/
DoSomethingg3();
}
}
轮询系统是一种非常简略的软件构造,通常只适用于那些只须要顺序执行代码且不须要外部事件来驱动的就能完成的事情。在代码清单中,假如只是实现LED翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完美。但是,假如加入了按键操作等须要检测外部信号的事件,用来模拟紧要报警,那么整个系统的实时响应才能就不会那么好了。
假设DoSomethingg3是按键扫描,当外部按键被按下,相当于一个警报,这个时候,须要立马响应,并做紧要处理,而这个时候程序刚好执行到DoSomethingg1,要命的是DoSomethingg1须要执行的时长比较久,久到按键释放之后都没有执行完毕,那么当执行到DoSomethingg3的时候就会丢失掉一次事件。足见,轮询系统只合适顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。
2、前后台系统
在裸机系统中,所有的操作都是在一个没限的大循环里面实现,支持中断检测。外部中断紧要事件在中断里面标记或者响应,中断效劳称为前台,main函数里面的while(1)没限循环称为后台,按顺序处理业务功能,以及中断标记的可执行的事件。小型的电子产品用的都是裸机系统,而且也能够满足需求。
intflag1=0;
intflag2=0;
intflag3=0;
intmain(void)
{
/*硬件相关初始化*/
HardWareInit();
/*没限循环*/
for(;;){
if(flag1){
/*处理事情1*/
DoSomething1();
}
if(flag2){
/*处理事情2*/
DoSomethingg2();
}
if(flag3){
/*处理事情3*/
DoSomethingg3();
}
}
}
voidISR1(void)
{
/*置位标志位*/
flag1=1;
/*假如事件处理时长很短,则在中断里面处理
假如事件处理时长比较长,在回到后台处理*/
DoSomething1();
}
voidISR2(void)
{
/*置位标志位*/
flag2=2;
/*假如事件处理时长很短,则在中断里面处理
假如事件处理时长比较长,在回到后台处理*/
DoSomething2();
}
voidISR3(void)
{
/*置位标志位*/
flag3=1;
/*假如事件处理时长很短,则在中断里面处理
假如事件处理时长比较长,在回到后台处理*/
DoSomething3();
}
在顺序执行后台程序的时候,假如有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断效劳程序,在中断效劳程序里面标记事件,假如事件要处理的事情很简短,则可在中断效劳程序里面处理,假如事件要处理的事情比较多,则返回到后台程序里面处理。
虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这能够大大的提高程序的实时响应才能。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。
一般来说:假如的项目里面没有使用RTOS,则一般使用的都是这种前后台系统。
三、多线程系统
相比前后台系统,多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。
当一个紧要的事件在中断被标记之后,假如事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。
多线程系统大略的伪代码详细见代码清单所示:
intflag1=0;
intflag2=0;
intflag3=0;
intmain(void)
{
/*硬件相关初始化*/
HardWareInit();
/*OS初始化*/
RTOSInit();
/*OS启动,初始多线程调度,不再返回*/
RTOSStart();
while(1);/*程序不会执行到这里*/
}
voidISR1(void)
{
/*置位标志位*/
flag1=1;
}
voidISR2(void)
{
/*置位标志位*/
flag2=2;
}
voidISR3(void)
{
/*置位标志位*/
flag3=1;
}
voidDoSomething1(void)
{
/*没限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag1){
}
}
}
voidDoSomething2(void)
{
/*没限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag2){
}
}
}
voidDoSomething3(void)
{
/*没限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag3){
}
}
}
相比前后台系统中后台顺序执行的程序主体,在多线程系统中,依据程序的功能,我们把这个程序主体分割成一个个独立的,没限循环且不能返回的小程序,这个小程序我们称之为线程。
每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程的时候不须要精心地去设计程序的执行流,不用担忧每个功能模块之间是否存在干扰。
加入了操作系统,我们的编程反而变得简略了。整个系统随之带来的额外开销就是操作系统占据的那一丁点的FLASH和RAM。现如今,单片机的FLASH和RAM是越来越大,完全足以抵挡RTOS那点开销。
进修RTOS的意义到底是什么?
进修RTOS,一是项目须要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地攻克问题,反而会使编程变得愈加复杂,假如想降低编程的难度,就必需引入RTOS实现多任务管理。二是技能须要,掌握操作系统,和基于RTOS的编程,实现更好的职业布局,对个人开展尤其是“钱途”是必不可少的。
大家可能一直觉得学操作系统就必需是linux,实际每个系统都有其应用场景,对于物联网行业,杀鸡焉用牛刀,小而美,且应用广泛的FreeRTOS是首选。有一个操作系统的根底,即便后续基于其他系统开发软件,也可触类旁通,对新技术快捷入门。