UCOS-II的故事
第九讲 uCOS-II嵌入式实时操作系统
第九讲 第九讲 系统函数 uC/OS-II 嵌入式实时操作系统
1、uC/OS-II简介 2、系统函数 3、任务组成 4、任务管理 5、时钟和中断 6、内存管理 7、移植方法 8、移植实例
9.2 9.2.1 总体组成 uC/OS-II的系统函数
1)uC/OS-II的组成: 与处理器无关的代码; 与
9.1 uC/OS-II 简介 9.1.3 应用范围
3)uC/OS-II的应用范围 • uC/OS已经移植到了很多CPU上,例如:
AnalogDevices的AD21xx; ARM的ARM7/ ARM9等; Hitachi的64180、H8/3xx和SH系列; Intel的80x86、Pentium、PentiumII、 8051、8052、MCS-251、80196等; Motorola的PowerPC、68K、CPU32、 ColdFire、M.Core、68HC系列; Siemens的80C166和TriCore; TexasInstruments的TMS320等;
9.3 9.3.1 任务组成 uC/OS-II的任务组成
1) 任务组成
9.3 9.3.2 任务状态 uC/OS-II的任务组成
2) 任务的状态:睡眠、就绪、运行、等 待和中断服务5种状态。
9.3 uC/OS-II的任务组成 9.3.3 任务优先级
3)任务的优先级 uC/OS-II 按硬件实时任务的可剥夺型 内核来设计的,因此每个任务必须要有一 个唯一的优先级,用于表明该任务在抢夺 微处理器时所具有的优先权。 uC/OS-II规定应用程序最多包含64个 任务,即最多64个优先级。
9.2 9.2.1 应用相关 uC/OS-II的系统函数
2)应用程序有关的部分 • OS_CFG.H: 配置文件
UCOSII在51单片机运行成功
UCOSII在51单片机运行成功以下是我的移植过程:1、新建一个文件夹aduc845ucosii来存放整个工程,再在aduc845ucosii下建立两个目录:os和out。
os存放所有源代码,out存放编译链接产生的中间文件和最终的输出文件。
2、建立KEILC工程,芯片选择ADUC845并且加入默认的启动代码START_AD.A513、把所有用到的源文件都复制到OS文件夹内,也就是现在在OS 内所有文件。
4、在KEIL的WORKSPACE下Source Group 1右击,把OS文件夹内以下文件加入源码:uCOS_II.C、OS_CPU_C.C、OS_CPU_A.ASM、test.c、serial.c、serial.h。
然后还得把KEIL安装目录下的XX\KEIL\C51\LIB下的C51BFPC.LIB和C51L.LIB加入源码组。
这里要解释一下:uCOS_II.C是内核文件,OS_CPU_C.C、OS_CPU_A.ASM是移植文件,test.c是main函数文件,serial.c、serial.h是test.c里用到串口才把它们加进源码,而C51BFPC.LIB和C51L.LIB这两个文件据果子说是因为用到了浮点运算,要加入这两个库文件。
加入的文件最好是按顺序加入,特别是两个库文件,如果反了,就可能出现运行不了或者不正确。
5、打开Options for Target "Target 1",切换到Target选项卡,把Memory Model改为Large: variables in XDATA。
再切换到Output选项卡,点击"Select Folder for Objects",选择out文件夹,勾选Create hex File,按OK确定,再切换到Listing选项卡,点击"Select Folder for Listings",选择out文件夹,按OK确定。
关于UCOS-Ⅱ的移植
关于UC/OS-II的移植网上介绍的已经很多了,比较流行的几款处理器(例如ARM)在网上都可以直接下载移植好的代码。
由于最近选修了一门嵌入式系统的课,用的处理器是EPSON公司的S1C33系列,做实验的时候要进行操作系统的移植,这个周末花了一天半的时间学习了一下,因为毕业设计的时候做过ARM 上的移植,于是将两者比较了一下,给出一般的移植要点。
由于将来实验还要设计到GUI的移植以及文件系统的移植和网络协议的移植,我会将自己的学习笔记都记录下来。
大家下载到源码后,针对Intel 80x86的代码在uCOS-II\Ix86L目录下。
代码是80x86实模式,且在编译器大模式下编译的。
移植部分的代码可在下述文件中找到:OS_CPU.H, OS_CPU_C.C, 和OS_CPU_A.ASM。
大家可以参考这个例子,对它进行修改。
INCLUDES.H 是主头文件,在所有后缀名为.C的文件的开始都包含INCLUDES.H文件。
使用INCLUDES.H 的好处是所有的.C文件都只包含一个头文件,程序简洁,可读性强。
缺点是.C文件可能会包含一些它并不需要的头文件,额外的增加编译时间。
与优点相比,多一些编译时间还是可以接受的。
用户可以改写INCLUDES.H文件,增加自己的头文件,但必须加在文件末尾。
//////////////////////////////////////////////////////////一、(1)OS_CPU.H文件的移植(针对S1C33209)//////////////////////////////////////////////////////////OS_CPU.H 文件中包含与处理器相关的常量,宏和结构体的定义。
#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT //全局变量#else#define OS_CPU_EXT extern#endif//////////////////////////////////////////////////////////由于不同的处理器有不同的字长,µC/OS-II的移植需要重新定义一系列的数据结构。
ucos-ii及其任务
• 中断管理
1、uc/os-ii的概述 2、 uc/os-ii的任务 3、任务控制块 4、任务创建 5、uc/os-ii的初始化及任务启动
• uc/os-ii中的任务是一个线程,其代码通常是一个无 限循环结构/超循环结构,看起来像其它C 函数一样。 void mytask(void *pdata) //示意代码 { for (;;) { do something; waiting; do something; } }
uc/os-ii概述—性能特点
• 可剥夺性(Preemptive)与可确定性
内核可剥夺、函数调用或系统服务的执行时间具有 可确定性,是硬实时操作系统。
• 支持多任务
• 任务栈
uc/os-ii可以管理64个任务 每个任务有自己单独的栈,uc/os-ii允许每个任允 许每个任务有不同的栈空间,以便压低应用程序对 RAM的需求。
删除任 务
等待
等 待 时 间 到 创建任务 任务调度
挂 起
中断 运行 任务被占先 中断结束 中断任务
uc/os-ii的任务—优先级
uc/os-ii支持64个任务,每个任务有一个特定 的优先级。 任务的优先级别用数字表示,0表示的任务的 优先级最高,数字越大表示的优先级越低。 通过常数OS__LOWEST__PRIO(在 OS_CFG.H中)定义系统的最低优先级别,同 时限定系统能容纳的最多任务数量。 OS_LOWEST_PRIO给空闲任务, OS_LOWEST_PRIO-1给统计任务。
1、uc/os-ii的概述 2、 uc/os-ii的任务 3、任务控制块 4、任务的创建 5、uc/os-ii的初始化及任务启动
任务控制块—结构
任务控制块 (Task Control Blocks, OS_TCBs)是 ucos-ii用来存储任务堆栈指针、当前状态、优先级及 任务链表指针等属性的一个数据结构。 任务控制块是任务的身份证,每个任务都有一个属于 自已的任务控制块,当任务的CPU使用权被剥夺时, 任务的属性被保存在任务控制块中,而当任务重新得 到CPU使用权时任务控制块能确保任务从当时被中断 的那一点丝毫不差地继续执行。 OS_TCBs全部驻留在RAM中。 OS_TCBs 在任务建立的时候被初始化。
uCOS-II的介绍和uCOS-II在单片机使用中的一些特点资料概述
uCOS-II的介绍和uCOS-II在单片机使用中的一些特点资料概述早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。
但直到最近,它才在国内被越来越多的提及,在通信、电子、自动化等需要实时处理的领域所日益显现的重要性吸引了人们越来越多的注意力。
但是,人们所谈论的往往是一些著名的商业内核,诸如VxWorks、PSOS等。
这些商业内核性能优越,但价格昂贵,主要用于16位和32位处理器中,针对国内大部分用户使用的51系列8位单片机,可以选择免费的uC/OS-II。
uC/OS-II的特点1.uC/OS-II是由Labrosse先生编写的一个开放式内核,最主要的特点就是源码公开。
这一点对于用户来说可谓利弊各半,好处在于,一方面它是免费的,另一方面用户可以根据自己的需要对它进行修改。
缺点在于它缺乏必要的支持,没有功能强大的软件包,用户通常需要自己编写驱动程序,特别是如果用户使用的是不太常用的单片机,还必须自己编写移植程序。
2.uC/OS-II是一个占先式的内核,即已经准备就绪的高优先级任务可以剥夺正在运行的低优先级任务的CPU使用权。
这个特点使得它的实时性比非占先式的内核要好。
通常我们都是在中断服务程序中使高优先级任务进入就绪态(例如发信号),这样退出中断服务程序后,将进行任务切换,高优先级任务将被执行。
拿51单片机为例,比较一下就可以发现这样做的好处。
假如需要用中断方式采集一批数据并进行处理,在传统的编程方法中不能在中断服务程序中进行复杂的数据处理,因为这会使得关中断时间过长。
所以经常采用的方法是置一标志位,然后退出中断。
由于主程序是循环执行的,所以它总有机会检测到这一标志并转到数据处理程序中去。
但是因为无法确定发生中断时程序到底执行到了什么地方,也就无法判断要经过多长时间数据处理程序才会执行,中断响应时间无法确定,系统的实时性不强。
如果使用uC/OS-II的话,只要把数据处理程序的优先级设定得高一些,并在中断服务程序中使它进入就绪态,中断结束后数据处理程序就会被立即执行。
uC-OS II在ARM 上的移植体会
uC-OS II在ARM 上的移植体会移植uC/OS-II的绝大部分工作都集中在os_cpu_a.s文件的移植,这个文件的实现集中体现了所要移植到处理器的体系结构和uC/OS-II的移植原理;在这个文件里,最困难的工作又集中体现在OSIntCtxSw和OSTickISR这两个函数的实现上。
这是因为这两个函数的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关。
在实际的移植工作中,这两个地方也比较容易出错。
OSIntCtxSw最重要的作用就是它完成了在中断ISR中直接进行任务切换,从而提高了实时响应的速度。
它发生的时机是在ISR执行到OSIntExit时,如果发现有高优先级的任务因为等待的time tick到来获得了执行的条件,这样就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换,因为那样的话就不够实时了。
实现OSIntCtxSw的方法大致也有两种情况:一种是通过调整sp堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的sp位置来使得进入中断时所作的保存现场的工作可以被重用。
这种方法的好处是直接在函数嵌套内部发生任务切换,使得高优先级的任务能够最快的被调度执行。
但是这个办法需要和具体的编译器以及编译参数的设置相关,需要较多技巧。
另一种是设置需要切换标志位的方法,在OSIntCtxSw 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OsIntExit =>OS_ENTER_CRITICAL() => OSIntCtxSw()=>OS_EXIT_CRITICAL() => OSIntExit退出后,再根据标志位来判断是否需要进行中断级的任务切换。
这种方法的好处是不需要考虑编译器的因素。
也不用做计算,但是从实时响应上不是最快,不过刚开始学习这种方法比较容易理解,实现起来也简单。
在中断态下进行任务切换,需要特别说明的一个问题是如何获得被中断任务的lr_svc。
ucos-ii的工作原理
ucos-ii的工作原理自我感觉对ucos-ii已经很熟悉了,但是在一次面试的时候,被问及ucos的工作原理,却不知道怎么叙说,从那叙说,恨啊现在网络上搜了一篇,感觉写的蛮好的,借用一下,留作以后回顾(具体作者不详,所以无法署其姓名,望原创见谅)。
uC/OS-II是一种基于优先级的可抢先的硬实时内核。
要实现多任务机制,那么目标CPU必须具备一种在运行期更改PC 的途径,否则无法做到切换。
不幸的是,直接设置PC指针,目前还没有哪个CPU支持这样的指令。
但是一般CPU都允许通过类似JMP,CALL这样的指令来间接的修改PC。
我们的多任务机制的实现也正是基于这个出发点。
事实上,我们使用CALL指令或者软中断指令来修改PC,主要是软中断。
但在一些CPU上,并不存在软中断这样的概念,所以,我们在那些CPU上,使用几条PUSH指令加上一条CALL指令来模拟一次软中断的发生。
在uC/OS-II里,每个任务都有一个任务控制块(Task Control Block),这是一个比较复杂的数据结构。
在任务控制快的偏移为0的地方,存储着一个指针,它记录了所属任务的专用堆栈地址。
事实上,在uC/OS-II内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。
这点要求程序员在他们的程序中保证。
一般的做法是把他们申明成静态数组。
而且要申明成OS_STK类型。
当任务有了自己的堆栈,那么就可以将每一个任务堆栈当前位置,记录到前面谈到的任务控制快偏移为0的地方。
以后每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现。
然后系统会先把当前任务的堆栈地址保存起来,紧接着恢复要切换的任务的堆栈地址。
由于所要切换的任务堆栈里一定也存的是地址(还记得我们前面说过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU就会把地址压入堆栈),这样,就达到了修改PC为下一个任务的地址的目的。
UCOS-II移植ARM的读书笔记
UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。
这样的情况发生在我的身上已经挺多次了。
好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。
uCOS-II
uC/OS-IIuC/OS-II简介u C / O S是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。
μC/OS-II的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的BBS 上。
μ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目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
任务管理uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,改任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,改任务负责统计当前cpu的利用率。
《uCOSII原理》PPT课件
第4任章务的同步与通信 例如则该无相的此调总顺招需成数显如果任处冲 支 的限,之序呼要一据然突持能制操,系务于,要通项,,。地和力和作B任统等多求因过工任当访依制系,务已待个时不访作务任问赖约统从A经状任,能B和问,务同必而,,负把态务在获A任同任一须使甚 才责还打,共正个具得任务保至一务从未印只享式共有务证有打AB个缓向负共机有享对同工之时任印数冲缓责享分当资任间还务一作机据区冲向一配任源务可的要资之的缓读区缓台给务的以顺互,源前使冲取写冲打A了运相无利或或要用把区行加运冲者该入区印任有互权打合进行以突需数数写机务工相而印作行必要。、据据入,A作打应,机完协要互因流。
务的同步的。
任务间的同步依赖于任务间的通信。
在μC/OS-II中,是使用信号量、邮
箱(消息邮箱)和消息队列这些被
事 称作事件的中间环节来实现任务之
间的通信的。
件
黄宏
宋丹丹
一个简单的信号量
发信方
1/0
收信方
共享资源
如 它 数 (如 却 却把a的解果进又仍果i为μ作除t一一入要因一(用等个就使了C为个个/就待)正绪它没正把O函任是状在状S进有在-描把数态务等态入获等I调)待。I述就。置取待使用后的这绪事事事该于这,任用时状件件件函个再等务态要等的叫函把具的,数调待原任做数任备这用因务数的状的务事了时O而已据S原任在态可要_件未经E务任结型以调要v具超控e在务运用n构备为过调t任就制O行T可了S统a:务绪用_的s块以等Ek等表一vR条O运待eEd待中Sny件C起行_的t(表对BTE,的时O的来)中应v(函那e条间的的数,)n数么件,函位位t。就T,置置a该要s清1使,函k0W
空事件控制块链表 链接指针,把这些空事件控制块链接成一个单向
嵌入式系统rtosucos-ii原理及应用-5
2
节拍
了解不同类型任务的实时性要求,如何在UCOS-II中进行协作操作以满足这些需 求?掌握UCOS-II中节拍的基本概念,以及如何实现节拍的同步、异步和互斥。
3
定时器和超时
UCOS-II如何实现定时器、超时和等待机制,以及如何在应用中灵活应用?
U C O S-II:信号量、互斥量和事件标志
信号量
RTO S 的应用开发和市场趋势
1
RTO S 的应用开发流程
从开发到部署,RTOS应用开发的整个流程是怎样的?您如何提高开发效率和减少开发时间?
2
RTO S 的市场趋势
RTOS市场正在迅速发展。它们将如何重塑未来的嵌入式应用行业?哪些新技术将推动RTOS的 应用发展?
3
未来的发展趋势
随着嵌入式系统日益广泛地应用在日常生活和工作中,RTOS也在迅速发展。未来的发展趋势 和创新技术是什么?它们将如何推动嵌入式系统的革新和发展?
实时操作系统的定义和意义
定义
什么是实时操作系统?什么是实时和非实时的区别? 在嵌入式系统的应用中,实时系统扮演了什么角色?
意义
行业中对实时系统的需求越来越高,其价值和重要 性是什么?作为一个嵌入式系统的工程师,你将需 O S-II:任务调度算法和内核结构
任务调度算法
什么是任务调度算法,为什么它对UCOS-II如此重要?在哪些场景下,UCOS-II采用任务调度 算法?
内核结构
什么是UCOS-II的内核结构,其模块分为哪几部分?你如何可以根据设计需求,自定义内核 结构?
U C O S-II:任务管理和节拍
1
任务管理
UCOS-II是如何管理任务的?有哪些方法可以在UCOS-II中实现任务管理以控制可 靠性和稳定性?
UCOS-II移植ARM的读书笔记.
UCOS-II移植ARM的读书笔记(12.15)UCOS-II移植ARM的读书笔记(12.15)移植的工作难以分析下去,先来几个UCOS的使用范例看看吧第一个范例:void main (void){PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* PC的清屏函数,PC_DispClrScr(INT8U color),这里调用时是前景色为白色,背景色为黑色*/ OSInit(); /* Initialize uC/OS-II ,初始化UCOS-II,在使用任何功能之前必须调用OSInit函数,建立两个任务:空闲任务-所有其他任务均未就绪时运行,统计任务-计算CPU的利用率*/PC_DOSSaveReturn(); /* Save environment to return to DOS 允许程序在正式开始多任务前,保存重要的寄存器的值,以保证UCOS能够正常地返回DOS */PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector ,用于设定中断向量表的内容。
*/RandomSem = OSSemCreate(1); /* Random number semaphore,建立一个信号量,并制定信号量的初值为1,OSSemCreate(1)返回一个指向信号量的指针,那么之后对该信号量的操作全部通过这个指针来实现*/ OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); /*至少建立一个任务,TaskStart为指向该任务运行代码的指针,第二个参数是一个指向任务初始化数据的指针,第三个是任务的堆栈栈顶,当堆栈是从上到下,必须把堆栈高地址传给该函数,最后一个参数指定建立的任务的优先级,数值越小优先级越高,每个任务的优先级都是介于0-62之间独一无二的。
嵌入式实时操作系统ucosii
医疗电子
ucosii在医疗电子领域 中应用于医疗设备、监
护仪、分析仪等。
物联网
ucosii在物联网领域中 应用于传感器节点、网
关、路由器等设备。
02
ucosii的体系结构与内核
任务管理
任务创建
ucosii提供了创建新任务的函数,如 OSTaskCreate(),用于创建新任务。
任务删除
ucosii提供了删除任务的函数,如 OSTaskDelete(),用于删除不再需要的任 务。
时间管理
01
02
03
时间节拍
ucosii通过定时器产生固 定时间间隔的节拍信号, 用于任务调度和时间管理 。
超时处理
ucosii支持超时机制,当 某个任务等待时间超过预 定阈值时触发相应的处理 函数。
时间函数
ucosii提供了一系列时间 函数,如OSTimeDly()、 OSTimeTick()等,用于时 间相关的操作和控制。
智能家居
ucosii适用于智能家居领域,可应用于 智能家电控制、家庭安全监控等场景。
02
03
医疗电子
ucosii适用于医疗电子领域,如医疗设 备控制、病人监控等,其可靠性和实 时性为医疗系统提供了有力保障。
THANKS。
应用软件的开发
任务管理
在UCOSII中,任务是用来实现应用程序功能的。在进行应用软件的开发时,需要创建和管理任务。这包括任务的创 建、删除、挂起和恢复等操作。
任务间通信
为了实现任务间的协同工作,需要进行任务间通信。UCOSII提供了信号量、消息队列、互斥量等机制来实现任务间 通信。在进行应用软件的开发时,需要利用这些机制来实现任务间的同步和数据交换。
uCOS-II嵌入式操作系统介绍与移植
OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
嵌入式实时操作系统ucosII
嵌入式实时操作系统ucosIIucosII是一款源代码公开、可免费使用的嵌入式实时操作系统。
它是由德国嵌入式系统专家brosse于1992年编写完成的,主要适用于嵌入式系统的开发。
ucosII具有源代码短小精悍、可移植性好、稳定性高等优点,被广泛应用于各种嵌入式系统中。
源代码短小精悍:ucosII的源代码只有几百KB,相对于其他RTOS来说,其代码量较小,易于理解和修改。
可移植性好:ucosII采用了可移植性的设计方法,可以在不同的处理器和编译器上进行移植和优化。
稳定性高:ucosII在各种嵌入式系统中得到了广泛应用,其稳定性和可靠性得到了充分的验证。
支持多任务:ucosII支持多任务处理,可以同时运行多个任务,提高系统的效率和响应速度。
实时性:ucosII具有较高的实时性,可以满足各种实时性要求高的应用场景。
可扩展性:ucosII具有较好的可扩展性,可以根据需要进行功能扩展和优化。
系统内核:包括任务调度、任务管理、时间管理、内存管理等核心功能。
中断处理程序:处理各种中断请求,包括硬件中断、软件中断等。
系统API:提供了一套完善的API函数,方便应用程序的开发和调试。
调试和测试工具:包括各种调试和测试工具,如内存检查工具、性能分析工具等。
ucosII被广泛应用于各种嵌入式系统中,如工业控制、智能家居、智能交通、航空航天等。
其应用场景涵盖了消费类电子产品、医疗设备、通信设备、汽车电子等领域。
ucosII作为一款源代码公开、可免费使用的嵌入式实时操作系统,具有短小精悍、可移植性好、稳定性高等优点。
它广泛应用于各种嵌入式系统中,为应用程序的开发提供了便利和支持。
其可扩展性和实时性也使得它在各种领域中具有广泛的应用前景。
随着嵌入式系统的广泛应用,对嵌入式操作系统的需求也日益增长。
uCOSII是一种流行的实时嵌入式操作系统,具有轻量级、实时性、可扩展性等优点。
本文将介绍如何在AT91平台上实现uCOSII的移植。
uCOS-II简介
4.1OC/OS-II简介UC/OS-II 是一种基于优先级的可抢先的硬实时内核。
自从92 年发布以来,在世界各地都获得了广泛的应用,它是一种专门为嵌入式设备设计的内核,目前已经被移植到40 多种不同结构的CPU 上,运行在从8 位到64 位的各种系统之上。
尤其值得一提的是,该系统自从2.51版本之后,就通过了美国FAA 认证,可以运行在诸如航天器等对安全要求极为苛刻的系统之上。
鉴于UC/OS-II 可以免费获得代码,对于嵌入式RTOS 而言,选择UC/OS 无疑是最经济的选择。
需要说明的是,UC/OS-II 作为一个实时操作系统只提供了多任务调度等基本功能,这在实际应用中显然是不够的。
除了移植好的操作系统内核部分,还必须有文件系统,全部硬件的驱动程序,图形API,控件函数,综合提高的消息函数以及几个系统必须的基本任务,象键盘,触摸屏,LCD 刷新等。
有了这些,UC/OS-II 才能实现复杂的功能。
特殊需求的地方还需要像USB通信协议,TCP/IP 协议等更复杂的软件模块。
博创提供的UC/OS-II 库文件中包含了上述大部分功能,基于库的开发变的非常简单,在基本的程序框架下应用我们提供的丰富API 函数即可。
实际开发中,用户的工程中无需包括UC/OS-II 的源代码,只需要包括库文件即可。
当然,用户也可以了解库中部分代码的源文件,可以根据自己的需求就行重新编译,也可以对自己的一系列源文件生成一个专门的库,方便自己后续工作。
UC/OS-II 的开发中,应用程序和操作系统是绑在一起编译的,所生成的system.bin 文件是唯一的可执行文件,其中包括了所需要的UC/OS-II 代码和被用到的驱动程序等函数代码,以及应用程序的代码。
system.bin 文件是存放在平台的16M FLASH 中的,在系统启动时由BIOS依靠文件系统从FLASH 中读入到SDRAM 中,然后把控制转移到该代码上,完成所谓的引导。
根据自己理解,来仿写一个ucosii
根据自己理解,来仿写一个ucosii
简单谈谈我对uc的一些认识级对于部分源码的分析和调试,作为对近一段时间学习的阶段性总结。
下文将分两部分介绍,前半部分主要谈谈我个人对一些问题的认识以及一些疑惑,后半部分是通过阅读ucosii,按照ucosii的思路自己编写或者调试的一些源码的分析,这些源码可以实现任务按照优先级定时切换(MDK+stm32)。
1.ucosii有什幺作用,和裸机的区别
uc是一个实时操作系统,很长一段时间以来我一直在纠结这个东西是干嘛用的,单片机不是有中断吗,为什幺非要用这个东西来完成中断的功能呢?
先谈谈我们比较熟悉的裸机开发,使用一个while(1)配合一些中断来响应事件。
但是我们知道,单片机的中断资源是有限的,并且多是用来响应外部事件。
另外,中断中使用的全局变量,不可重入性也容易使系统产生问题,造成不确定性。
而且中断时间不能过长,使得任务的吞吐量不能太大,而中断之间的相互嵌套也容易使程序出现问题。
所以,在需要及时处理复杂或者耗时任务的时候(简单任务while循环的实时性好像不比uc差),及时响应任务并进行处理,这种普通的模式效果就比较差了。
而uc有个好处就是它可以随时切换任务,每个任务的执行有固定的时间,通过操作系统统一的TimeTick可以有效统一任务运行的时间,这样就不会出现一个任务长期占据cpu而其他任务得不到运行的情况,我们可以通过调用uc的API来控制每个任务的运行。
多任务还有个好处就是把复杂的程序拆成几个任务,这样管理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UC/OS-II的故事
多年以前,我设计了一个基于Intel 80C188的产品,需要一个实时内核。
在前一家雇主那里工作时,我一直在使用一个知名的内核(以下我称为内核A),但该内核对我当时设计的产品来说是太贵了。
我找到了一个廉价的内核(当时大约1000美元以下我称为内核 B),并且开始了我的设计工作。
为了让我那几个很简单的任务运行起来,竟花了我两个月时间。
我一天到晚给该厂商打电话求援。
该厂商声称内核B是用C语言写的,可我还得用汇编语言给程序中每个对象除实话,虽然该厂商很耐心,而我实在是烦透了!产品的开发也耽误了。
我真是不想再花时间去调试那个廉价的内核了。
后来得知我是该厂商的第一个客户,这个内核实际上没有完全测试和调试过。
还是回到正路上来,我决定使用内核A。
五个用户的价格是5000美元,此外,我的每个产品还要付200美元的内核使用费。
在当时,那可是一笔很大的开支。
就算是花钱买个心里踏实吧。
花了两天时间,内核转起来了。
项目进展到3个月上,我的一个工程师发现内核好像有毛病(bug)。
当内核中的这个毛病确认无疑以后,我把我的代码寄给了该厂商。
此时,厂商提供的90天的担保已经过期了。
为了得到答复,我还得支付每年500美元的维护费。
我和销售商争辩了好几个月,他们应该尽快纠正这一处毛病才是。
我实际是在为他们做好事。
可是,他们不予理睬。
最后,我只好认了,又签了程序维护合同。
而该厂商6个月以后才改正了那个毛病。
是的,6个月以后!我简直气坏了,最要紧的是,我的产品开发耽误了。
花了将近一年的时间,内核A才在我的产品中稳定运行。
然而,我得承认,从此以后,内核A再没有什么问题了。
渐渐的,我自然会想到,写个实时内核有那么难吗?不就是不断地保存、恢复CPU的那些寄存器嘛。
于是我决定试试写一个自己的实时内核,主要用业余时间、晚上和周末。
也花了大约一年的时间才使内核转起来,它在某些方面还比内核A好。
我并不想开公司去卖这个内核,因为当时市场上已经有大约50个实时内核的产品。
我想到给杂志写篇文章,打算投《C语言用户杂志》(《C User’s Journal 》)因为内和是用C写的,我听说该杂志每页给100美元的稿费,而其他杂志一般是每页75美元。
我的文章大约有70页。
这笔稿费对我写内核所花时间是不错的补偿。
很不幸,文章拒载了。
有两个原因,一个是文章太长,杂志不愿意连载。
另一个原因是,他们也不愿意“又登一篇关于内核的文章”。
我决定转向《嵌入式系统编程》(《Embedded System Programming》)杂志,因为我的内核是为嵌入式应用设计的。
我和该杂志的编辑Mr.Tyler Sperry 联系,告诉他我的实时内核想在他的杂志上发表,得到的答复和《C语言用户杂志》是一样的,我们不要“又是一篇关于内核的文章”。
我告诉他们,我的实时内核和他们的不一样,是占先式的,可以和许多商业上出售的内核产品竞争,源代码可以放在《嵌入式系统编程》杂志网站的留言板(BBS)上。
我每周要给Mr.Tyler打两三个电话,几乎是求他发表我的文章。
他终于同意了,大概是我的电话打得他烦了。
我的文章从70页压缩到30页,连载在1992年5月期和6月期杂志上。
该文章几乎是1992年最热门的文章。
头一个月,就有500多人从《嵌入式系统编程》杂志的网站留言板上下载我的源程序。
Tyler 先生真怕实时内核的商家们会要了他的命,因为在他的杂志上刊登了实时内核的源码,这使商家们感到不安。
我猜测,商家们一定已经认识到μC/OS(当
时称作μCOS)的质量和功能。
该文章实际上是第一次把实时内核的内在工作原理曝光,一些过去的秘密公开了。
几乎是文章在《嵌入式系统编程》杂志上刊登出来的同时,R&D出版社的Bernard (昵称Berny)Williams杂志来电话了。
《C语言用户杂志》就是这家出版社出的,此时距我最初与该杂志联系已有6个月了。
我留言给我的妻子,说他对我的文章感兴趣。
我回电话给他,“你不觉得你有点太晚了吗?我的文章已经在《嵌入式系统编程》杂志上发表了”。
Berny 只是说,“不,不,你没明白我的意思,因为文章那么长,我打算出一本书”。
起初,Berny只是想简单地把我手上已有的那些出成一本大约80页的书。
我告诉他,如果写成一本书的话,我打算写得更好一些。
以后,我又花了大约6个月的时间增加书的内容,就成了本书第一版的那个样子。
书大约有250页。
我把实时内核的名字由μCOS改成μC/OS,因为《嵌入式系统编程》杂志的读者一直称为“mucus”,那个自发音像英语的“痰”,让人听起来不舒服。
回想起来,这可能是第一次给实时内核起名字。
总之,实时内核μC/OS就这样诞生了。
开始时,书销售的很慢,Berny和我计划在书的适用期内能售出4000到5000册,可是照开始时的销售速率,能卖出去2000册就不错了。
Berny坚持说,让人知道这本书需要时间。
于是他连续在《C语言用户杂志》杂志上刊登广告,一直持续了一年。
约在书正式出版一个月之前,我第一次参加了在加利弗尼亚州圣克拉拉(Santa Clara)举行的嵌入式系统会议,那是1992年的9月,我第一次见到Tyler Sperry先生,我给他看了即将出版的书的草稿。
他很快地翻了翻,问我愿不愿意在下一届嵌入式系统会议上做个讲演。
下届会议在亚特兰大召开。
那再好不过了,我说我愿意。
但我讲些什么呢?
他建议我讲怎样使用“小实时内核”。
路上,我想,我这是怎么了?我从来没有在那么多人面前讲过话,到时候我自己就蒙了怎么办?如果我讲的都是些很平常的知识……人们可都是花了不少钱来听会的。
以后的6个月中,我准备了讲稿。
后来的会上,听我课的有70多人。
起初的20多分钟里,我出的汗至少有1磅多。
课后,约有15人上前来表示非常喜欢我的课,也喜欢我那本书。
我得到了1993年在圣克拉拉举行的会议的邀请,可我没能参加,我参加了1994年波士顿举行的会议。
从那以后,每次嵌入式系统会议上都有我的例行演讲。
过去几年中,我进了会议的顾问委员会(Advisory Committee),最近的几次会上,每次的会议我都要做至少三次讲演,每次的听众都在200到300人之间。
会议对我的讲演的评价总是在前10%。
至今,μC/OS的书已售出了15,000多册。
我收到并答复的来自世界各地的电子邮件超过1000份。
1995年,《μC/OS The Real Time Kernel 》被翻译成日语在《接口》(《Interface》)杂志上刊登。
μC/OS已经被移植到以下一些CPU上。
Analog 设备公司 AD21xx
ARM公司 ARM6,ARM7
日立公司 64180,H8/3xx, SH 系列
Intel公司 80x86 (Real and PM), Pentium , Pentium Ⅱ, 8051, 8052, MCS-251, 80196, 8096
三菱公司 M16和M32
摩托罗拉公司 PowerPC, 68K, CPU32, CPU32+, 68HC11, 68HC16
飞利浦公司 XA
西门子公司 80C166和TriCore
TI公司 TMS320
Zilog公司 Z-80 and Z-180
1994年,我决定写第二本书,《Embedded System Building Blocks, Complete and Ready-to-use Modules in C》。
由于某些原因,此书不如μC/OS 那么流行,虽然书中很多信息在其他地方是找不到的。
我始终认为,对于刚刚步入嵌入式世界的人们来说,这是一本理想的书。
1998年,我开通了μC/OS的正式网站:www.μCOS-Ⅱ.com,打算在该网站上放进移植、应用短文、相关网站、常见问题解答(FAQ)、μC/OS和μCOS-Ⅱ的版本更新等。
只是这都要花时间去做。
回到1992年,我绝没有想到写篇文章会改变我的生活方式,实际上确实是这样,我遇到了很多非常有趣的人,交了很多好朋友。
我还是回答收到的每一个电子邮件。
我确信,如果你写给我什么的话,回应你是我的责任。