UCOS快速入门(基础理论篇)
简述
文章主要使用通俗易懂的语言介绍了实时操作系统(RTOS)所涉及的核心部件知识,可以让你快速对ucos操作系统全方位有一定的了解。适合想入门操作系统或者在学习操作系统课程的小伙伴。
然后文章会对STM32F103上的ucosII基础代码进行简单分析,并给出使用ucos的基本方法,能够让读者快速使用ucos进行开发。
注:该篇文章分为两部分发布,第一篇即RTOS基础框架构建(理论),第二篇则为如何在STM32平台上开发使用UCOS(应用)。
从“任务”开始一步步看清操作系统
1、任务机制
和字面意思一样,即操作系统需要去执行的东西即为任务。正如你手机上使用的各种APP,假如现在你需要使用CSDN你的步骤应该是:
开机你的安卓手机(初始化操作系统)->下载CSDN(任务的创建)->打开CSDN(任务的运行)。
这就类似一个最简单的“单任务”操作系统的工作模式。
当然,只要手机是保持开机状态,你就可以不断的下载APP,并同时运行多个应用程序。在宏观上ucos也可以做到这点,只不过灵活性没那么高而已。我们应当知道,普通单片机程序都是从头执行到尾,最多产生中断去紧急处理一下事情。而是ucos如何做到多任务“同时”运行的呢?
2、分时复用
分时复用即将一个时间段分成若干个时间片,在不同的时间片里可以执行不一样的任务。(比如一秒钟分成一百份即十毫秒一个时间片,两个任务的话奇数时间片时执行a任务,偶数时间片时执行b任务)其中实现的原理也并不算复杂,粗暴都说就是中断与函数的配合使用,在此不做深究。
我们知道多个人在一起总会存在各种各样的交集,任务也一样,多个任务同时存在时难免会需要互相协同,互相依赖,或出现互相竞争,争抢资源等情况。为了使系统有条不紊并且高效的运行下去,产生了任务优先级(即优先级越高的任务具有优先执行权)以及事件机制。
3、事件(event)
在ucos中事件包含很多种,我们分别按照任务间互相协同,互相依赖,互相争斗来进行简单介绍。
互相协同
邮箱(mbox)
直译即消息盒子,即一个可以将自己的一些不同类型数据进行打包成一个邮件,发给其它任务的一种工具。
旗标(flag)
即类似于标记,当你的电脑高速运转,cpu内核达到一定温度,用于检测cpu温度的任务就会在flag上的某个位进行标记,散热风扇察觉到这个标记后即加快散热。
互相依赖
即各事件的阻塞式访问。
非阻塞:你给我的文章评论了,并且希望得到回复,然后立刻你就不等了打开了刺激战场。
阻塞:我在等着回复你的评论,你还没有评论,我一直在CSDN等着你。直到你评论了我回复完才离开。
互相争斗
互斥锁(mutex)
系统存在某些共享资源,所有任务都可以访问它。正如QQ和微信都需要获取手机的摄像头资源(外部设备)一样,摄像头资源就是系统的共享资源。你可以尝试在进行QQ视频同时再去打一个微信视频,显然是不能使用的。这就类似一把互斥锁,资源只有一把钥匙,当一个任务获取了某个共享资源(拿到钥匙),其他任务就无法得到它,必须等到钥匙被还回来才能继续去访问。
信号量(semaphore)
信号量与互斥锁类似,都是起到对共享资源的保护作用。只不过信号量保护的共享资源存在多把钥匙,可同时被多个任务访问。当然,如果钥匙被拿光了,再想获取必须等到其他任务还回钥匙才行。
由于每个任务被各种各样的事件(event)控制着,我们根据它们的主要特性对它进行了分类命名,因此任务状态出现了。
4、任务状态
运行态,就绪态,挂起态,休眠态。
就绪(Ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态。 (已经有飞机票了,等待飞机来接你去旅游)
运行(Running):该状态表明任务正在执行,此时它占用处理器,调度器选择运行的永远是处于最高优先级的就绪态任务。 (已经在飞机上)
阻塞(Blocked):任务当前正在等待某个事件,比如信号量或外部中断。 (等待出飞机票,才能去等飞机,最后才能坐飞机)
挂起态(Suspended):处于挂起态的任务对调度器而言是不可见的。(没兴趣去坐飞机)
上文中有提到就绪列表及调度器,为保证文章的易懂性,在此我们也简单介绍一下。
就绪列表
可简单认为是一个表格,里面存放着处于就绪态的任务,当要调度是会从这里寻找优先级最高的那一个去运行。在ucosII中使用的技巧是静态内存加链表组合构建的。
调度器
负责自动进行任务分割、程序流折断、现场上下文保护等。
自此,一个简化版的操作系统在你的脑海里成型了。只有当某个事物在心中成型的时候,你才能够懂得如何去学习这个事物。
注:有任何疑问或想深入学习ucos某个部分,并觉得本人语言表述还算OK,可在评论区留言,我将优先考虑发布该类文章。想尝试深入了解学习ucos,可关注我,UCOS文章正在实时更新中。