1.裸机系统
裸机系统主要分为轮询系统和前后台系统。在实际应用当中,前后台系统的使用表较多,也能够满足大部分项目的需求。
1.1轮询系统
轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,是一种比较基础的写法,刚刚入门的时候比较常用,把所有的函数都放到死循环里面,顺序执行。轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。具体伪代码如下:
![](https://img-blog.csdnimg.cn/img_convert/ce1a3213d2b8426ea9ae66b569095b18.png)
1.2前后台系统
虽然轮询系统能够满足大部分要求,但是仍然有不足之处。当我们有时效性很强的任务时,它就不能满足我们的要求。假设我们设置一个按键,那么当我们按下按键的时候,肯定希望系统能够扫描到按键并作出相应的处理,但是轮询系统中的任务必须要扫描到该任务时,才会执行,所以,很大概率会出现即使我们按下了按键,但是没有扫描到,这就造成了按键无效。
相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完 成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台,main 函数里面的无限循环我们称为后台。
![](https://img-blog.csdnimg.cn/img_convert/5464ca297c0d41ca8f43badfb7aa09f6.png)
采用这种写法,当有按键按下时,系统能够及时标记按键,不会有按键无效的情况,按键对应的事件也就不会丢失。但是,虽然按键事件不会丢失,但可能不会及时执行,应为系统比一定轮询到按键对应的任务,造成时间上的偏差。
2.多任务系统
在多任务系统当中,事件的响应相当于是在中断中完成,在时间上不会有偏差,时效性很强。各个任务相当于是不同的中断,有着不同的优先级,优先执行高优先级的任务。
![](https://img-blog.csdnimg.cn/img_convert/3a02eaab5ed74c3b998f0339321f3bb3.png)
相比前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把这个程 序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为任务。每个 任务都是独立的,且具备自身的优先级,由操作系统调度管理。
有些同学可能会好奇,这个时候main函数怎么办,实际上在UCOS中,main函数只用来初始化硬件和系统。在RT_Thread中,mian函数相当于是一个独立的任务,可以修改优先级(实际上要复杂一点)。
虽然多任务系统有很多优点,但是随之而来的也有缺点。操作系统会占据单片机的FLASH和RAM,简单地说,就是需要占用单片机的资源来维持系统的正常运转。现如今,单片机FLASH和RAM越来越大,完全足以抵挡RTOS那点开销。