首页 > 其他分享 >搞嵌入式,为什么一定要学RTOS?

搞嵌入式,为什么一定要学RTOS?

时间:2022-11-16 14:02:29浏览次数:46  
标签:要学 中断 RTOS void 系统 嵌入式 处理 int 多线程

学习RTOS,一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,就必须引入RTOS实现多任务管理。二是技能需要,掌握操作系统,和基于RTOS的编程,实现更好的职业规划,对个人发展尤其是“钱途”是必不可少的。
大家可能一直觉得学操作系统就必须是linux,实际每个系统都有其应用场景,对于物联网行业,杀鸡焉用牛刀,小而美,且应用广泛的FreeRTOS 是首选。有一个操作系统的基础,即使后续基于其他系统开发软件,也可触类旁通,对新技术快速入门。
裸机系统
1、轮询系统 轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情。裸机系统通常分成轮询系统和前后台系统。 int main(void){ /* 硬件相关初始化 */ HardWareInit();
/* 无限循环 */ for (; {   /* 处理事情 1 */   DoSomething1();
   /* 处理事情 2 */   DoSomethingg2();
   /* 处理事情 3 */   DoSomethingg3(); }}
轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在代码清单中,如果只是实现LED翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完美。
但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。
假设DoSomethingg3是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到DoSomethingg1,要命的是DoSomethingg1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到DoSomethingg3的时候就会丢失掉一次事件。
足见,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。
2、前后台系统 在裸机系统中,所有的操作都是在一个无限的大循环里面实现,支持中断检测。外部中断紧急事件在中断里面标记或者响应,中断服务称为前台,main 函数里面的while(1)无限循环称为后台,按顺序处理业务功能,以及中断标记的可执行的事件。小型的电子产品用的都是裸机系统,而且也能够满足需求。 int flag1 = 0;int flag2 = 0;int flag3 = 0;
int main(void){ /* 硬件相关初始化 */ HardWareInit();
/* 无限循环 */ for (; {   if (flag1) {     /* 处理事情 1 */     DoSomething1();   }
   if (flag2) {     /* 处理事情 2 */     DoSomethingg2();   }
   if (flag3) {     /* 处理事情 3 */     DoSomethingg3();   } }}
void ISR1(void){ /* 置位标志位 */ flag1 = 1; /* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething1();}
void ISR2(void){ /* 置位标志位 */ flag2 = 2;
/* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething2();}
void ISR3(void){ /* 置位标志位 */ flag3 = 1; /* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething3();}
在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。

虽然事件的响应和处理是分开了,但事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。
一般来说:如果项目里面没有使用RTOS,则一般使用的都是这种前后台系统。

3多线程系统
相比前后台系统,多线程系统的事件响应也是在中断中完成的,但事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。
当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。
多线程系统大概的伪代码具体见代码清单所示: int flag1 = 0;int flag2 = 0;int flag3 = 0;
int main(void){ /* 硬件相关初始化 */ HardWareInit();
/* OS 初始化 */ RTOSInit();
/* OS 启动,开始多线程调度,不再返回 */ RTOSStart();  while(1);/* 程序不会执行到这里 */}
void ISR1(void){ /* 置位标志位 */ flag1 = 1;}
void ISR2(void){ /* 置位标志位 */ flag2 = 2;}
void ISR3(void){ /* 置位标志位 */ flag3 = 1;}
void DoSomething1(void){ /* 无限循环,不能返回 */ for (; {   /* 线程实体 */   if (flag1) {
   } }}
void DoSomething2(void){ /* 无限循环,不能返回 */ for (; {   /* 线程实体 */   if (flag2) {
   } }}
void DoSomething3(void){ /* 无限循环,不能返回 */ for (; {   /* 线程实体 */   if (flag3) {
   } }}
相比前后台系统中后台顺序执行的程序主体,在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。
每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰。
加入了操作系统,我们的编程反而变得简单了。整个系统随之带来的额外开销就是操作系统占据的那一丁点的FLASH和RAM。现如今,单片机的 FLASH和RAM是越来越大,完全足以抵挡RTOS那点开销。

标签:要学,中断,RTOS,void,系统,嵌入式,处理,int,多线程
From: https://www.cnblogs.com/farsight/p/16895654.html

相关文章

  • 嵌入式Linux单板连接飞燕物联网平台
    大家好,我是杂烩君。最近,我们的设备连接的云平台需要切到阿里的飞燕平台,做个笔记记录下。阿里的物联网平台有好几个:物联网平台生活物联网平台(飞燕平台)城市物联网平台它们的应......
  • 嵌入式-Linux基础:Windows和Linux间的文件传输方式
    首先必须安装VMWare里面的VmWareTool(1)拖拽方式:安装完之后就可以通过拖拽的方式将Windows的文件移到虚拟机里了,同样虚拟机里的也可以拖拽到Windows中。(2)设置共享文件夹......
  • 嵌入式-Linux常用初级指令和介绍
    ls:列出当前文件夹下有哪些文件 ls-a:显示所有文件,包括隐藏的文件和文件夹pwd:显示在当前哪个文件夹下面  mkdir+新建文件夹名称:新建文件夹  进入文件夹:cd+......
  • 嵌入式-Linux基础操作
    Crtl+Alt+T:调出命令窗口xrandr:列出分辨率列表 设置窗口的分辨率大小为1280x960:xrandr-s1280x960   通过命令窗口来执行一段C语言程序:VI工具的使用:(1)vifir......
  • freeRTOS使用:源码下载 & 系统移植的步骤
    1、FreeRTOS的学习资料(1)FreeRTOS的源码下载学习一个操作系统前,首先要下载对应的源码,用于研究和学习。FreeRTOS的源码下载链接如下:​​https://sourceforge.net/projects/fre......
  • 【单片机/嵌入式】【梁山派】学习日志13:直接存储器访问DMA
    一、DMA原理介绍1.1DMA基础知识1.1.1数据传输方式一般情况下实现存储器和外设之间的数据传输,有三种常用的方法:轮询法(polling),中断法(interrupt)以及DMA。轮询法(polling):......
  • 【单片机/嵌入式】【梁山派】学习日志12:脉宽调制PWM
    一、PWM原理1.1PWM基础知识1.1.1什么是PWMPWM(PulseWidthModulation脉宽调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM是一种对模拟信......
  • AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板AIR32F103(四)2......
  • 要学完Java大概需要多长时间
      其实学习任何东西都一样,包括学习Java。刚开始我们可以使用快速浏览全局的方法来去学习它,不要过多的去涉及细节问题,记不住就不记了。在这刚开始的阶段学习什么,就专心去......
  • 加油每天都要学习坚持住就会迎来胜利的曙光
    用户交流Scanner通过Scanner类的next()和nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()或hasNextLine()判断是否还有输入的数据基本语法Scanners=newS......