没有合适的资源?快使用搜索试试~ 我知道了~
首页ucos简要教程——入门必读
ucos简要教程——入门必读
需积分: 13 11 下载量 138 浏览量
更新于2023-06-06
评论
收藏 410KB DOC 举报
uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。 μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。
资源详情
资源评论
资源推荐
第一篇 UCOS 介绍
第一篇 UCOS 介绍
这个大家都知道。呵呵。考虑到咱们学习的完整性还是在这里唠叨一下。让大家再熟悉一
下。高手们忍耐一下吧! uC/OS II(Micro Control Operation System Two)是一个可以
基于 ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合
于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提
供最好的移植性能,uC/OS II 最大程度上使用 ANSI C 语言进行开发,并且已经移植到近
40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。
uC/OS II 可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任
务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清
晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最
多可以管理 60 个任务。
μC/OS-II 的前身是 μC/OS,最早出自于 1992 年美国嵌入式系统专家 Jean J.Labrosse
在《嵌入式系统编程》杂志的 5 月和 6 月刊上刊登的文章连载,并把 μC/OS 的源码发布
在该杂志的 B B S 上。
μC/OS 和 μC/OS-II 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用 C 语言编写
的。CPU 硬件相关部分是用汇编语言编写的、总量约 200 行的汇编语言部分被压缩到最
低限度,为的是便于移植到任何一种其它的 CPU 上。用户只要有标准的 ANSI 的 C 交叉编
译器,有汇编器、连接器等软件工具,就可以将 μC/OS-II 嵌人到开发的产品中。μC/OS-II
具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至
2KB 。μC/OS-II 已经移植到了几乎所有知名的 CPU 上。
严格地说 uC/OS-II 只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间
管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,
网络等额外的服务。但由于 uC/OS-II 良好的可扩展性和源码开放,这些非必须的功能完全
可以由用户自己根据需要分别实现。
uC/OS-II 目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最
基本的系统服务,3 如信号量,邮箱,消息队列,内存管理,中断管理等。
uC/OS-II 以源代码的形式发布,但并不意味着它是开源软件。你可以将其用于教学和私下
研究(peaceful research);但是如果你将其用于商业用途,那么你必须通过 Micrium
获得商用许可。
虽然 uCOS-II 在商业上使用时需要的得到授权并且费用也是一笔不小的数字,但是他的开
源毕竟带领我们走入了内核的世界。在此我代表嵌入式工程师向 Mr Jean J.Labrosse 致
谢。
任务管理
uC/OS-II 中最多可以支持 64 个任务,分别对应优先级 0~63,其中 0 为最高优先级。
63 为最低级,系统保留了 4 个最高优先级的任务和 4 个最低优先级的任务,所有用户可
以使用的任务数有 56 个。
uC/OS-II 提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,
任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个
整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前 cpu
的利用率。
在系统初始化完毕后启动任务时必须创建一份用户任务,也就是说必须有一个应用程序
(用户任务,使用应用程序对于我们经常使用 Windows 用户容易接受一些。呵呵),否
则系统会崩溃。当然还有一些其他的要求,咱们后续再说,下面简要概述一下任务管理相
关的函数
1:建立任务 OSTaskCreat()/OSTaskCreatExt()
如果想让 UCOS 管理用户的任务,必须先建立任务。可以通过将任务的地址和其他参数传
递到以下两个函数之一来建立任务。当调用 OSTaskCreat()时,需要四个参数:
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)
Task:是指向任务代码的指针,pdata:是任务开始执行是,传递给任务的参数的指针,
ptos:是分配给任务的堆栈的栈顶指针,prio 是分配给任务的优先级。
也可以用 OSTaskCreatExt(),不过该函数需要 9 个参数,前四个参数与 OSTaskCreat()一样,
例如:
INT8U OSTaskCreateExt(void(*task)(void *pd),void *pdata,OS_STK *ptos, INT8U prio,
INT16U! !id, OS_STK!!*pbos, OS_STK!!*pbos, OS_STK!!*pbos, INT16U!!opt)
id 参数为要建立的任务创建一个特殊的标识符。pbos 是指向任务的堆栈栈底的指针,用
于堆栈的检验。stk_size 用于指定堆栈成员数目的容量。pext 是指向用户附加的数据域
的指针,用来扩展任务的 OS_TCB。opt 用于设定 OSTaskCreateExt()的选项,指定是
否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等。
2:任务堆栈 OS_STK()
每个任务都有自己的堆栈,堆栈必须申明为 OS_STK 类型,并且由连续的内存空间组成。
可以静态分配堆栈空间,也可以动态分配堆栈空间。
3:堆栈检验 OSTaskStkChk()
有时确定任务实际需要的堆栈空间的大小是很有必要的,因为这样就可以避免为任务分配
过多的堆栈空间,从而减少应用程序代码所需的 RAM 空间。
4:删除任务 OSTaskDel()
有时需要删除任务,删除任务,是说任务返回并处于休眠态,并不是说任务的代码被删除
了,只是任务的代码不再被 UCOS 调用。删除任务前应保证所删任务并非空闲任务。
5:请求删除任务 OSTaskDelReq()
有时,任务会占用一些内存缓冲或信号量一类的资源。这时,假如另一个任务试图删除该
任务,这些被占用的资源就会因为没有被释放而丢失。在这种情况下,需想办法拥有这些
资源的任务在使用完资源后先释放资源,再删除自己。
6:改变任务的优先级 OSTaskChangePrio()
在建立任务时,会分配给任务一个优先级。在程序运行期间,可以通过调用该函数改变任
务的优先级。也就是说,UCOS 允许动态的改变任务的优先级。
7:挂起任务 OSTaskSuspend()
任务挂起是一个附加功能,也就是说,如果任务在被挂起的同时也在等待延迟时间到,那
么,需要对任务做取消挂起的操作,并且等待延迟时间到,任务才能转让就绪状态。任务
可以挂起自己或者其他任务。
8:恢复任务 OSTaskResume()
挂起的任务只有通过该函数才能被恢复。
9:获得任务的信息 OSTaskQuery()
通过调用该函数,来获得自身或其他应用任务的信息
时间管理
uC/OS-II 的时间管理是通过定时中断来实现的,该定时中断一般为 10 毫秒或 100 毫秒发
生一次(这个时间片段是 OS 的作者推荐的,大家可以参考邵贝贝翻译的《嵌入式实时操
作系统 ucos-II》这本书),时间频率取决于用户对硬件系统的定时器编程来实现。中断发
生的时间间隔是固定不变的,该中断也成为一个时钟节拍。这里隐含的意思就是你选择的
芯片如果想使用 UCOS 系统,前提条件一定要有一个 Timer。
uC/OS-II 要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,
例如中断级的任务切换函数,系统时间函数。
uCOS 时间管理的相关函数
1:任务延迟函数 OSTimeDly()
Ucos 提供一个可以被任务调用而将任务延时一段特定时间的功能函数,即 OSTimeDly().
任务调用 OSTimeDly()后,一旦规定的时间期满或者有其他的任务通过调用
OSTimeDlyResume()取消了延时,他就会进入就绪状态。只有当该任务在所有就绪态任
务中具有最高的优先级,它才会立即运行。
2:按时,分,秒延时函数 OSRimeDLyHMSM()
与 OSTimeDly()一样,调用 OSRimeDlyHMSM()函数也会是 UCOS 进行一次任务调度,
并且执行下一个优先级最高的就绪任务。当 OSTimeDlyHMSM()后,一旦规定的时间期
满,或者有 OSTimeDlyResume(),它就会马上处于就绪态。同样,只有当该任务在所
有就绪态任务中具有最高的优先级,他才开始运行。
3:恢复延时的任务 OSTimeDlyResume()
延时的任务可以不等待延时的期满,而是通过其他任务取消延时而使自己处于就绪态,可
以通过该函数来实现,实际上,OSTimeDlyResume()也可以唤醒正在等待的事件。
4:系统时间 OSTimeGet()和 OSTimeSet()
内存管理
在 ANSI C 中使用 malloc 和 free 两个函数来动态分配和释放内存。例如在 Linux 系统
中就是这样。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,因为嵌入式系统
尤其是 uCOS 是实地址模式,这种模式在分配任务堆栈时需要整块连续的空间,否则任务
无法正确运行。且由于内存管理算法的原因,malloc 和 free 的执行时间也是不确定。这
点是实时内核最大的矛盾。
基于以上的原因 uC/OS-II 中把连续的大块内存按分区管理。每个分区中包含整数个大小相
同的内存块,但不同分区之间的内存快大小可以不同。用户需要动态分配内存时,系统选
择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能
有效解决碎片问题,同时执行时间也是固定的。
同时 uCOS-II 根据以上的处理封装了适合于自己的动态内存分配函数 OSMemGet()
和 OSMemPut(),但是使用这两个函数动态分配内存前需要先创建内存空间,也就是
第二段咱们介绍的内存分块。呵呵,不罗嗦了,具体的关于内存管理的函数如下:
内存控制块的数据结构
Typedef
struct
{void! !*osmemaddr! ! ;指向内存分区起始地址的指针。
Void! !*osmemfreelist!!;指向下一个空余内存控制块或者下一个空余内存块的指针,
Int32u!!osmemblksize!!;内存分区中内存块的大小,是建立内存分区时定义的。
Int32u osmemnblks! !!!;内存分区中总的内存块数量,也是建立该内存分区时定义的。
Int32u!!osmemnfree! ! ;内存分区块中当前获得的空余块数量。
}os_mem;
1;建立一个内存分区,OSMemCreate()
2:分配一个内存块,OSMemGet()
应用程序通过调用该函数,从已经建立的内存分区中申请一个内存块。该函数唯一的参数
是指向特定内存分区的指针。
3:释放一个内存块,OSMemPut()
当应用程序不再使用一个内存块时,必须及时的把它释放,并放回到相应的内存分区中,
这个操作就是通过调用该函数实现的。
4:查询一个内存分区的状态,OSQMemQuery()。
任务间通信与同步
对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II 中提供了 4
种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,
发送,查询的接口用于实现进程间的通信和同步。
对于这 4 种同步对象将在后面一一讨论。
任务调度
uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪
了的最高优先级的任务。
uC/os-II 的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦
处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,
uC/OS-II 规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。
UCOS 的任务调度在一下情况下发生:
1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就
绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。
2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任
务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种
调度也称为中断级的上下文切换。
这两种调度方式在 uC/OS-II 的执行过程中非常普遍,一般来说前者发生在系统服务中,后
者发生在时钟中断的服务程序中。
调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务
的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,
并有一个称为任务控制块 TCB(Task Control Block)的数据结构,其中第一个成员变
量就是保存的任务堆栈指针。任务调度模块首先用变量 OSTCBHighRdy 记录当前最高级
就绪任务的 TCB 地址,然后调用 OS_TASK_SW()函数来进行任务切换。
第二章 搭建 UCOS-II 2.52 版的调试平台
在这一章中我们主要讨论 UCOSII 的源码调试环境,为了给大家一个共同的学习平台,我
搜集整理了一写资料,就是以 X86 为平台,使用 BC31(这个堪称骨灰级的编译器)来调
试 UCOSII 源码。当然你也可以用 BC45 或更高版本的编译器,具体方法大同小异,我在
此就不再啰嗦。
本章节的主要内容包括四点:
1、下载并安装 BC31 编译器
2、下载并安装 UCOS-II2.52 版本源代码
3、使用 BC31 编译 UCOS-II 源码
4、让 OS 的第一个任务 RUN 起来
接下来会在每个帖子中讨论一点。耐心等待哦!
下载并安装 BC31 编译器
我在这里提供给大家这个骨灰级的编译器 BC31.需要的可以下载。见附件(骨灰级编译器
BC31)由于这个软件的比较大,分成两个压缩包。下班了,先到这里,回家再传附件!
上传了好几次都没有上传成功。可能是我的网速太慢。如果有需要的坛友把邮箱留给我吧,
我发邮箱去!
剩余27页未读,继续阅读
sailingm16
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0