开启辅助访问 切换到窄版

打印 上一主题 下一主题

嵌入式简易操作系统剖析(一)

[复制链接]
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
爱你的人不一定会等你,等你的人一定很爱你。




CYoung做一个有温度的公众号
这是我的第三十篇原创文章


上周没有写啥笔记,心情不太好,就给自己放个假,这周咱们继续写一些东西,在任何时候,学习还有有所必要的,无论学啥。本来想写写关于编程的设计模式,但是这东西比较抽象,换句话,我也没能很好的掌握,咱们还是找个时间在说设计模式。那么这周我们聊聊ucos的一些实现过程吧,可能很多人都知道这东西,但是不太了解他们的实现,咱们还是说说这个简单的操作系统的简易实现,我写这玩意儿只是简易的讲下,具体的还是得自个儿看源码。
ucos源码可能也就5000来行的样子,但是他的功能确实强大的,是一个实时多任务的操作系统内核。那什么是多任务呢?
01
多任务概念操作系统就不多说了,我们只要知道他是在硬件之上,应用软件之下的软件平台,windows就是例子。咱么说说多任务,我们用电脑可以听歌,上网,看电影。可以同时提执行多个并行任务,并且各个任务之间相互独立互不影响,在宏观上像并发运行。
其实我们知道CPU只有一颗,不可能做到他并发运行,只有不同的任务轮流使用CPU资源,本质上还是单任务。只是CPU运行的比较快让我们感觉是多任务在跑而已。
我们使用多任务还有一个好处,很好的使用CPU资源。因为我们在delay的时,CPU其实是在空跑,这样显得有点资源浪费,在多任务是延时时候会自动调用其他任务,这样就充分的利用CPU资源,提高使用效率。
任务有三态,运行态,就绪态和挂起态。下面分析任务之间的转化。


02
任务调度假设我们定义一个就绪列表为一个32位的数据,例如:

我们知道如何在登记表中表示任务的状态,这不够,我们还得知道任务应该选择合适的任务调度,就是系统如何知道我们要调度哪个任务?这个时候就引入优先级的概念,为每个任务安排一个唯一的优先级别,当同时有多个任务就绪时,优先运行优先级较高的任务就可以解决这个问题。
同时的,任务的优先级也是作为任务的唯一标识,这就表示在ucos中是不允许两个任务处于同一个优先级的。
所以我们在使用ucos时候会常定义这样的宏,一般来说,数字越低表示优先级越高。

这中还有一个概念:抢占式调度,一旦就绪状态中出现优先权更高的任务,便立即剥夺当前任务的运行权,把 CPU 分配给更高优先级的任务。这样 CPU 总是执行处于就绪条件下优先级最高的任务。
要实现运行高优先级任务,我们得知道那个优先级的任务比较高,所以就得找到任务优先级高的任务,代码可以如下:

代码中判断优先级从高到低查找,找到数据中某位数据位为1为止,这就表示找到优先级高的任务了,直接返回或者赋值给变量。代码中这样写不是特别的好,原因有二。其一:这个函数是不可重入的函数;其二,实时操作系统有一个特征就是延时可预测,然而这种算法的延时任务的数量的变化而不同,但是这种算法是最简单的。
03
多任务时间管理在多任务做,也是需要一个心跳来维持系统的正常运行,和晶振一样。在系统中一般利用一个固定周期的中断来充当。所以一般在任务中有一个任务级别的延时。这个函数比较简单。就是就是先挂起当起当前任务,设定其延时节拍数,然后进行任务切换,在指定的时钟节拍数到来之后,将当前任务恢复为就绪状态。任务必须通过 任务延时 或 任务挂起的方式 让出 CPU的使用权,使更低优先级任务有机会运行。代码实现可以如下:

代码中有一个临界区,这个临界区的实现就是关闭中断的方式,就不多讲了。在延时函数中, 定时器的中断服务函数依次对各个延时任务的延时节拍数减 1。若发现某个任务的延时节拍数变为 0,则把它从挂起态置为就绪态。中断服务函数可以如下:

实际上任务心跳(定时器中断)做的是任务的刷新工作,因为任务要轮流的使用CPU的使用权限。实际上系统会自动的创建一个空闲任务,为了不让系统空跑,闲置资源。他的任务优先级是最低的,做一些无关紧要的工作,类似CPU的使用率之类的。所以像这种空闲任务是一直处于就绪状态。
好了今天就写这么多了,下篇文章写如何实现多任务,这篇只是介绍了多任务的一些前提概要,比较简单。关于笔记什么的之后写完一起发吧。周末愉快。


-END-



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表