关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
嵌入式简易操作系统剖析(一)
[复制链接]
作者:
Iq37di7
版块:
›
灌水·股票·程序员大本营·工作之余需要点阳光·我们不只是工程师
›
IT业界资讯
发布时间:
2018-12-8 19:27:38
1156
0
返回列表
Iq37di7
当前离线
新手上路
新手上路, 积分 26, 距离下一级还需 24 积分
新手上路
新手上路, 积分 26, 距离下一级还需 24 积分
积分
26
发消息
楼主
电梯直达
Iq37di7
发表于 2018-12-8 19:27:38
|
只看该作者
|
倒序浏览
|
阅读模式
爱你的人不一定会等你,等你的人一定很爱你。
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-
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
开源之Ubuntu:两种方法在Ubuntu20.04里安装Qt5
•
【Linux编程】Makefile的工作流程!
•
Cpufetch:一款功能强大的CPU架构信息爬取工具
•
大多数程序员接触过的技术_负载均衡,但大多数都不知其核心原理
•
产业缺货背景下,STM32峰会都说了什么?
•
Xmanager使用教程:如何在Linux系统上安装Xterm应用
•
开源项目EasyDarwin编译:Linux系统下编译运行最新EasyDarwin的步骤介绍
•
硬核观察|Python之父对Rust、Go、Julia和TypeScript的看法
•
干货|手把手带你搞定4大容器网络问题
•
对话胡伟武:和国产CPU一起突围的20年
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
生活交流*灌水区*工程师滋润生活*
linux
快速回复
返回顶部
返回列表