参考教程:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili
一、概述
1、裸机
(1)裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。
(2)裸机的特点:
①实时性很差,应用程序得依次执行。
②容易出现空等待的情况,浪费CPU资源。
③结构臃肿,所有功能的代码放在一个主循环中。
2、RTOS
(1)RTOS的全称为Real Time Operation System,即实时操作系统。
(2)常用的RTOS有国外的FreeRTOS、µC/OS、RTX和国内的RT-Thread、Huawei LiteOS和AliOS-Things等,它们有一定的相似性,只要学会其中一个,其它的实时操作系统也能很快上手,这里主要以FreeRTOS展开介绍。
(3)RTOS的特点:
①分而治之,复杂的功能可以划分为多个任务。
②有任务调度机制,增加CPU资源的利用率。
③高优先级任务可以抢占低优先级任务(任务可以同等优先级)。
④每个任务都有自己的栈空间,当任务被打断时,栈空间将保存断点的数据,当任务继续执行时从断点继续开始。
⑤为防止高优先级任务长时间占用CPU,可以令其阻塞,让出CPU资源。
3、µC/OS-III简介
(1)µC/OS-III的发音为“Micro C O S Three”,这意味着µC/OS-III是基于C语言编写的第三代小型操作系统。
特征 | uC/OS | uC/OS-II | uC/OS-III |
发布年份 | 1992 | 1998 | 2009 |
抢占式多任务 | 是 | 是 | 是 |
最大任务数 | 64 | 255 | 无限制 |
单个优先级任务数 | 1 | 1 | 无限制 |
时间片调度 | 否 | 否 | 是 |
事件标志 | 否 | 是 | 是 |
队列 | 是 | 是 | 是 |
可裁剪 | 是 | 是 | 是 |
代码量 | 3K~8K | 6~26K | 6K~24K |
(2)µC/OS-III是一个可裁剪、可剥夺的多任务系统,没有任务数目的限制。
二、操作系统知识与µC/OS-III的关联
1、任务调度
(1)抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
创建三个任务——Task1、Task2、Task3,Task1、Task2、Task3的优先级分别为3、2、1(在µC/OS-III中任务设置的数值越小,优先级越高,所以TASK3的优先级最高)
运行过程如下:
首先Task1在运行中,在这个过程中Task2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行,Task1进入就绪态
Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行,Task2进入就绪态
Task3运行过程中,Task3自我阻塞了(依靠系统延时或等待信号量等),此时就绪态中优先级最高的任务Task2执行
Task3的阻塞解除后(延时到了或者接收到信号量)便恢复到就绪态中,抢占TasK2的运行,Task2进入就绪态
(2)时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,同等优先级任务轮流地享有相应的CPU时间(可设置),叫时间片,在µC/OS-III中,一个时间片就等于SysTick(滴答定时器)中断周期。
创建三个任务——Task1、Task2、Task3,Task1、Task2、Task3的优先级均设置为1,时间片默认值(或者说时间片的数量)均设置为100
运行过程如下:
首先Task1运行完100个时间片后,切换至Task2运行
Task2运行完100个时间片后,切换至Task3运行
Task3运行过程中被挂起了(如果还不到一个时间片,没有用完的时间片不会再使用),此时直接切换到下一个任务Task1运行
Task1运行完一个时间片后,切换至Task2运行
(3)协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务。(了解即可)
2、任务状态
(1)µC/OS-III中任务共存在5种状态:
①运行态:正在执行的任务,该任务就处于运行态,在STM32中,同一时间仅一个任务处于运行态。
②就绪态:如果任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
③挂起态:如果一个运行态的任务因延时或等待某一事件发生时被挂起,那么这个任务就处于挂起态。
④休眠态:任务已经在CPU的内存中(任务已被删除),但是还没有交给µC/OS-III内核管理。
⑤中断态:当处于运行态的任务被中断打断,CPU跳转去执行中断服务函数时,原本属于运行态的任务会切换到中断态,直到中断结束,在切换回运行态继续运行。
(2)µC/OS-III主要有三大类列表用来跟踪任务状态:
①就绪列表:准备运行的任务将放在就绪列表OSRdyList[x],其中x代表任务优先级数值。(每个优先级的就绪列表都有一个对应位表示列表中是否有任务,有则置1,无则置0)
②Tick列表:正在等待延时超时或挂起的对象超时的任务,将放在Tick列表OSTickList。
③挂起列表:当任务等待信号量、事件时,任务将放置在挂起列表PendList。
(3)调度器总是在所有处于就绪列表的任务中选择具有最高优先级的任务来执行。