学单片机为什么要学rtos

一、rtos简介

        RTOS,又叫real time operation system.最重要的就是这个实时的概念,我们写程序在用的方法应该叫轮询,带上中断之后应该就叫前后台系统,比如这个图是我们一般写程序的方法。没有中断前,我们的CPU一直在主函数的这个while(1)里面反复执行。虽然后来我们有了中断,中断的任务和CPU的任务确实了也是独立运行的,其实已经很类似操作系统这种模式了,但是一般我们在中断里只是改变一些标志量,我们自从上学的时候应该都听过,中断毕竟是异常,不能塞很多事件,影响系统的实时性,因为main函数里的while循环才是我们工作的主体,所以中断里我们往往只是改变一些标志量,读取一些数据,主要的处理还是在main函数里处理。所以中断里改变标志后还是在主函数里轮询到这个事件才能去处理,这是一般的写程序流程。这就突出了RTOS是如何保证实时运行的,这个我们后面会再说。

        下面对比一下我们经常写程序的方法,也就是我们为什么要学RTOS,我会从以下几个方面分别进行讨论,首先从开发难度上来讲,那最简单的肯定就是轮循了,一般一个新手你告诉他主函数里一个whil(1)大循环就可以了,把你要做的事分条目的列举出来,这种方式肯定最简单,后来因为效率问题,又学习了中断。这样有前后台,基本所有的程序都可以用这种方法写了。其实一般一个好的前后台抵得上一个RTOS了。但是这对编程者的要求一般比较高,能把握程序的分配,哪些用中断,哪些代码消耗多少时间,哪些对响应度比较高,比如按键吧,或者是用户发送的串口命令等等。而RTOS则有一堆的API函数,而且还有一些编程技巧。所以对编程者有一定的要求。但是你一旦掌握了RTOS的编程方法,你就永远不想再回到前后台了。第二从开发周期上讲,最快的方式莫过于RTOS了,其实我们程序写多了就会发现,写程序最麻烦的就是一些时间处理和数据处理。这个需要在中断里定时多少,那个需要定时多少,什么时间哪个函数该运行了。还有就是数据处理,比如wifi呀,蓝牙的数据,有时数据接收的多,但是处理的慢,你还得自己动手去写一个队列,来缓存指令数据。还有就是各种各样的变量。写完之后后期如果加功能,如果你写程序的整体框架搭得不好,加个功能,很多东西都要推倒重来。RTOS则很好的解决了这些问题,首先就是任务时间问题,他本身有很多时间函数。非常方便,调用后让出CPU,CPU仍然可以去做别的事情。数据处理像队列,堆栈各种结构体等等,可以大大缩短开发周期。还有就是RTOS一般来说集成了很多第三方的东西,像lwip等各种协议栈,安装卸载都比较方便,还有别的各种驱动函数。有这么多的资源也决定了我们写程序很多时候不用自己再去移植各种各样的底层函数了。第三从任务响应度上,RTOS应该是最快的,当有任务需要响应时,cpu可以立即切换到那个函数去执行。而前后台和轮循都必须要CPU执行到那条语句才能执行。前提是不在中断里去执行这条函数。比如串口接收函数,一般都是在中断里接收,接收完置位对应标志位,然后出中断去main函数里去执行相应的处理函数,在任务少的时候这种缺点不明显,但是任务稍微多一点就比较明显了。RTOS的接收函数和前后台是一样的,好处就是出了中断他能直接切换到中断处理函数。然后就是从项目维护上,比如刚才说的那个增加和减少功能来讲,RTOS也十分方便,因为RTOS本身的大框架在那,你是在他的框架搭的程序,所以修改起来也方便。

综上,我们学习RTOS就是因为集成了很多的资源,缩短开发周期,提高了任务的响应度。

        下面我们来看一下操作系统中经常用的数据结构。其实想把c语言学得特别好的方式就是看操作系统源码,像这种RTOS的操作系统源码也就几万行。首先是位图,比如在查找优先级的时候就是用这种方式,用空间代替时间。然后就是链表,这种结构用得比较多,一般像任务就绪之后就挂到就绪链表,就像排队一样,每个人只要知道自己的前面和后面是谁就行了,走了一个人其实只需要更改他前一个的下一个,和后一个的上一个。然后就是堆栈,先进后出,和电梯一样,最后一个进的要先出去。然后就是队列,先进先出。也是一种存储结构。数据接收多处理慢的时候一般都是用队列来进行缓存。

      剩下我们就开始讲RTOS的一般都有东西,任务管理,时间管理,中断管理,进程间同步,进程间通信,内存管理。因为嵌入式相关的内存都不大,不太可能占用很大的内存去管理内存,所以一般嵌入式的内存管理都比较简陋,也是为了最大程度的节省内存。

        首先我们讲任务管理,任务管理是核心,我们所有的东西都是围绕着任务管理来讲的。大家看这是一个系统里的一个任务,每个任务都是一个while(1)大循环,那如何进行任务切换呢,有两种方式,比如像ucosiii,你可以调用系统延时函数OSTimeDly,其实任务的调度的关键就是他,使用这个函数就相当于告诉内核我要睡眠了,然后内核把他的状态由运行改为挂起,要存的数据存一下,把他要醒的时间定一下,然后就进行任务切换,任务切换就是从就绪表里找一个优先级最高的执行,实在没有任务就会执行IDLE任务,就是空任务,因为CPU不能停下来。所以我们电脑上一般看到CPU的利用率也是这么计算的,把1秒内减去进空任务的运行时间除去1秒就是这一秒cpu的利用率。而且这个空任务是绝对不能删除的。这是主动的让出内核。还有一种方法大家应该都知道就是中断了,中断的好处在于会自己的进行环境的保存,把一些临时变量什么的自己压栈,等中断处理重新返回就可以了。这是中断的一般用法。刚才说到CPU主动让出内核,这就牵扯到另一个概念,叫可剥夺式和不可剥夺式,ucos-iii属于可剥夺式也叫抢占式的,不可剥夺也叫非抢占式的。区别就在于是否等待任务主动让出cpu,剥夺式的也叫抢占式的是只要有高优先级的就绪会立即获得cup的控制权,方法其实很简单就是操作系统都有一个系统的滴达定时器,也叫系统节拍。其实就是一个定时中断,每到这个时间CPU就会去检查一下所有任务,然后把那些睡眠的时间减1,时间减到0,说明该醒了,就改变他的挂起状态为就绪。抢夺式的就是在这进行抢占CPU,抢占式的内核会从就绪表里获得一个最高级的任务,然后出了滴达中断后直接运行他,而非抢占式的只是把该唤醒的任务给他挂到就绪表里,而不会进行任务切换,一直等到任务主动让出内核才会进行切换。其实到这里大家应该对操作系统的多任务有个大致的了解了,单核cpu只有一个,所谓的多任务就是每个任务运行的时间都很短,cpu不停的在不同的任务进行穿梭,看似是多任务了。所以说RTOS并不复杂,依ucosiii之父的话说,不就是停的保存cpu寄存器和还原cpu寄存器吗,有这么麻烦吗,他当时是在公司工作遇到需要内核的地方,公司花了很多钱,结果还是买的一个小公司的东西,本身也有bug,估计费了不少心,就下定决定写了一个内核,也就是你们听过的ucos。他说出了操作系统的核心东西就是任务在离开时要保护好现场,任务回来能够还原其实就可以了。这就牵扯操作系统移植里面一个最根本的东西就是任务切换函数的移植,一般都是用汇编写的,因为c语言一般不能直接cpu的寄存器,像cortex的R0-R15,XPSR,msp,psp等。好在RTOS现在都比较流行,现成的例程很多,不用自己再动手移植,但是如果你想真的学好这东西,一定要把一个arm核搞的特别清楚。像cpu框架,存储结构,中断结构还有就是他的相关指令集。大家也都知道c语言是不区分架构的,什么内核的都一样写,指令集才是区分这些东西的根本东西,像arm限制华为事件一样,现在大家目光之所以转到开源的risc-v,也是因为这个影响吧,话说天下大势,合主必分,分久必合,大势所趋吧。本来市场的最好配置就是发挥已长,把自己擅长的做到要极致,但是现在大家应该都感觉到,很多大公司都开始解决卡脖子的问题,什么都做。所以美国搞那么多事,弄得很多企业人心惶惶,根本上讲就是浪费资源,阻碍人类文明的进步。肯定也会被人类进步的车轮撵得粉碎。

      接着说,也就说解决了任务保存的问题,就解决了任务切换的问题,所以任务保存还有问题要解决,首先系统的寄存器保存我们知道,但是程序本身还有很变局部变量啊的怎么保存呢。所以这就需要每个任务都要有自己独立的存储空间,也就是每个任务都要有自己的栈空间,每当任务切换的时候,就可以把和任务相关的所以数据保存起来。具体哪些要保存呢,是不是所有局部变量都要保存呢,那就要看我们数据的存储地址啦,比如这个变量大家看一下,他会保存在哪?这个虽然是个局部变量,但是其实他是当全局变量用了,为什么呢,因为我们每个任务都是while(1),程序没有结束的时候,所以系统分配的局部变量地址也永远不会被释放。那还有什么要存储的呢,问题就出在这。子函数调用。大家可以自己下去测试下,子函数调用时的局部变量地址看一下是不是在任务栈的地址范围内。这个不再多说,解决了任务保存,剩下就是如何进行切换的问题。如何进行任务切换,其实肯定只有中断才可能。Cotex内核有个专门的中断就是给操作系统留的,叫pensv中断,他是一个软件中断,每当有任务需要让出内核,就需要置位对应的中断位引起pensv中断,在中断里系统会把当前的数据保存,查找当前优秀级最高的任务,把对应任务的栈读到系统栈,中断结束后没有其他中断就直接执行最高优先级的任务了。

      刚才提到任务切换,就不得不提任务的几种状态。1、就绪态。程序已经准备好了或者从睡眠中醒来,随时等待cpu控制权。2、运动态。程序当前正在运行。

3、阻塞态。用得比较多,比如串口处理函数等待串口数据一样,只有等有数据了才会执行,没数据时就处在阻塞态,数据准备好就会进入就绪态,随时准备抢夺cpu控制权。4、删除态。就是任务被删除,所占用的内存空间也会被释放。

      任务管理方面,一般一个任务所有牵涉的内容都会在任务控制块里看到,比如他的状态、栈空间大小、任务起始地址、优先级等。所以看一个任务的控制块就基本能了解任务都有哪些内容,任务控制块是统一定义的一个结构体,包含了任务所有的内容。下面看下这个是ucosiii的任务控制块。

 先写这么多,有个PPT暂时没上传。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,习资料,用于习51单片机的嵌入式开发,应用案例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值