u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时 *** 作系统。\x0d\x0a\x0d\x0aμC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。\x0d\x0a\x0d\x0aμC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大
部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。\x0d\x0a\x0d\x0a严格地说uC/OS-II只是一个实时 *** 作系统内核,它仅仅包含了
任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。\x0d\x0a\x0d\x0auC/OS-II目标是实现一个基于
优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。\x0d\x0a\x0d\x0a任务管理\x0d\x0a\x0d\x0auC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。\x0d\x0a\x0d\x0auC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。\x0d\x0a\x0d\x0a系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,改任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,改任务负责统计当前cpu的利用率。\x0d\x0a\x0d\x0a时间管理\x0d\x0a\x0d\x0auC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。\x0d\x0a\x0d\x0auC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。\x0d\x0a\x0d\x0a内存管理\x0d\x0a\x0d\x0a在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的错作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。\x0d\x0a\x0d\x0auC/OS-II中把连续的大快内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。\x0d\x0a\x0d\x0a任务间通信与同步\x0d\x0a\x0d\x0a对一个多任务的 *** 作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4中同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。\x0d\x0a\x0d\x0a任务调度\x0d\x0a\x0d\x0auC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。\x0d\x0a\x0d\x0auC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。\x0d\x0a\x0d\x0a任务调度将在以下情况下发生:\x0d\x0a\x0d\x0a1) 高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。\x0d\x0a\x0d\x0a2) 高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。\x0d\x0a\x0d\x0a这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。\x0d\x0a\x0d\x0a调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。\x0d\x0a\x0d\x0aμC/OS-II的组成部分\x0d\x0a\x0d\x0aμC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。\x0d\x0a\x0d\x0a1) 核心部分(OSCore.c)\x0d\x0a\x0d\x0a是 *** 作系统的处理核心,包括 *** 作系统初始化、 *** 作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。\x0d\x0a\x0d\x0a2) 任务处理部分(OSTask.c)\x0d\x0a\x0d\x0a任务处理部分中的内容都是与任务的 *** 作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。\x0d\x0a\x0d\x0a3) 时钟部分(OSTime.c)\x0d\x0a\x0d\x0aμC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等 *** 作是在这里完成的。\x0d\x0a\x0d\x0a4) 任务同步和通信部分\x0d\x0a\x0d\x0a为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。\x0d\x0a\x0d\x0a5) 与CPU的接口部分\x0d\x0a\x0d\x0a是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的 *** 作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。第一种
1、将ucos_ii的源代码解压到c盘根目录下形成SOFTWARE文件夹(邵贝贝书内的光盘获取SOFTWARE)
2、安装bc45(borland C++4.5)和tasm;将bc45和tasm加到用户环境变量中,还要将tasm.exe加入到bc45的bin内;
3、建立一个工作文件夹比如叫c:\oswork\ucos,然后将解压目录C:\SOFTWARE\uCOS-II\SOURCE下的所有文件复制至该文件夹,有文件如下(不同版本文件可能不一样):
OS_CORE.C, OS_FLAG.C, OS_MBOX.C, OS_MEM.C, OS_MUTEX.C
OS_Q.C, OS_SEM.C, OS_TASK.C, OS_TIME.C, uCOS_II.C, uCOS_II.H(11个)
解压目录下的C:\SOFTWARE\uCOS-II\EX1_x86L\BC45\source 内的 INCLUDES.H,OS_CFG.H,TEST.C(3个)
位于bc45文件下的pc文件夹里面的PC.H PC.C;(2个)
C:\SOFTWARE\uCOS-II\x86L OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM(3个)共19个;
4.修改c:\work\ucos下includes.h:
//#include"\SOFTWARE\ucos-ii\ix86l\os_cpu.h"
//#include"os_cfg.h"
//#include"\SOFTWARE\blocks\pc\source\pc.h"
//#include"\SOFTWARE\ucos-ii\source\ucos_ii.h"
去掉前面的路径:
#include"os_cpu.h"
#include"os_cfg.h"
#include"pc.h"
#include"ucos_ii.h"
修改c:\work\ucos下UCOS_II.C:
#include "\software\ucos-ii\source\os_core.c"
#include "\software\ucos-ii\source\os_flag.c"
#include "\software\ucos-ii\source\os_mbox.c"
#include "\software\ucos-ii\source\os_mem.c"
#include "\software\ucos-ii\source\os_mutex.c"
#include "\s·oftware\ucos-ii\source\os_q.c"
#include "\software\ucos-ii\source\os_sem.c"
#include "\software\ucos-ii\source\os_task.c"
#include "\software\ucos-ii\source\os_time.c"
将\software\ucos-ii\source\统统去掉
5.启动BORLAND C++4.5,创建工程。
菜单Project --->New project...,d出“New Target”对话框。
(1)在“Project path and name”中指定工程路径:c:\work\ucos
(2)在“Target Type”下选择“Application[.exe]”
(3)在“PlatForm”下选择“DOS[Standard]”
(4)在“Target Modet”下选择“Large”
(5)单击“OK”按钮
(6)因为.h文件都在c:\work\ucos文件夹下,需要设置一下include的路径(在bc45中选择菜单,options\project\Directories\,在窗口右边找到Include,c:\bc45\includec:\work\ucos ) 红色是需要增加的路径,前面的分号注意
6.在工程文件中添加c:\work\ucos下的几个文件:
os_cpu_a.asm
os_cpu_c.c
pc.c
ucos_ii.c
test.c
7 编译和运行
菜单Project--->Compile/Make all/Build all,或者点工具栏上的按钮
编译结果出现很多警告,但是没有错误,因此就可以正常运行实验程序拉~
第二种
另外一种方式是把uCOS-II的所有代码打包成一个静态库,方法同上,只是有两点不同:
1、在第2步中不需要拷贝TEST.C文件
2、第5步建立工程时选择“Static Library(for exe)[.lib]”,其他选项不变
编译后将生成一个.lib文件,假设文件名为mylib.lib
这样在每次使用uCOS-II时就不需要把所有源文件都拷贝到工程目录下了,只需要拷贝下面几种文件:
mylib.lib
OS_CPU_A.ASM
所有.h文件
然后把mylib.lib、TEST.C和OS_CPU_A.ASM加到工程中就可以成功编译了~ .
评论列表(0条)