首页 uCOS移植

uCOS移植

举报
开通vip

uCOS移植 0 引言 在开发嵌入式系统时,一般选择基于 ARM 和 uC/ OS - II 的嵌入式开发平台,因为 ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点[1 ] . 将 uC/ OS - II 移 植到 ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经 常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可 以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II 是由 Jea...

uCOS移植
0 引言 在开发嵌入式系统时,一般选择基于 ARM 和 uC/ OS - II 的嵌入式开发平台,因为 ARM 微处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点[1 ] . 将 uC/ OS - II 移 植到 ARM 系统之后,可以充分结合两者的优势. 如果一个程序在一个环境里能工作,我们经 常希望能将它移植到另一个编译系统、处理器或者操作系统上,这就是移植技术.移植技术可 以使一种特定的技术在更加广泛的范围使用,使软件使用更加灵活,不局限于某一条件.uC/OS - II 是由 Jean J . Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任务内 核.uC/ OS - II 的源代码完全开放,这是其他商业实时内核无法比拟的[2 ] . 它是针对嵌入式 应用 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 的,在设计之初就充分考虑了可移植性 ,它的大部分源代码都是用高可移植性的 ANSIC 编写的[3 ] . uC/ OS - II可以移植到从8 位到64 位的不同类型、不同规模的嵌入式系 统,并能在大部分的8 位、16 位、32 位、甚至64 位的微处理器和 DSP 上运行. 由于 uC/ OS - II是一个实时操作系统,所以如果将它嵌入到ARM处理器上,就能够进一步简化ARM系统的 开发. 图1 uC/ OS - II 文件体系结构 1 uC/ OS - II 的移植 uC/OS - II 的文件系统结构包括核心代码部分、设置代码部分、与处理器相关的移植代 码部分[4 ] . 结构如图1 所示.其中最上边的软件应用层是uC/ OS - II 上的代码. 核心代码部 分包括7 个源代码文件和1 个头文件. 功能分别是内核管理、事件管理、消息队列管理、存 储管理、消息管理、信号量处理、任务调度和定时管理. 设置代码部分包括2 个头文件,用来 配置事件控制块的数目以及是否包含消息管理相关代码. 而与处理器相关的移植代码部分 则是进行移植过程中需要更改的部分,包括1 个头文件 OS CPU. H ,1 个汇编文件 OS CPUA. S 和1 个 C 代码文件.实际上将 uC/ OS - II 移植到 ARM 处理器上,需要完成的工作主要是 以下三个与体系结构相关的文件:OS CPU. H ,OS CPU. C 以及 OS CPUA. S[5 ] . 1. 1 OS CPU.H 的移植 文件 OS CPU.H 中包括了用# define 语句定义的与处理器相关的常数、宏以及类型. 移 植时主要修改的内容有:与编译器相关的数据类型的设定;用#define 语句定义2 个宏开关中 断;根据堆栈的方向定义 OS STK GROWTH等. 在将 uC/ OS - II 移植到 ARM 处理器上时,首先进行基本配置和数据类型定义. 重新定 义数据类型是为了增加代码的可移植性,因为不同的编译器所提供的同一数据类型的数据长 度并不相同,例如 int型,在有的编译器中是16 位,而在另外一些编译器中则是32 位. 所以,为 了便于移植,需要重新定义数据类型,如 INT32U 代表无符号32 位整型. typedefunsigned int INT8U ,就是定义一个8 位的无符号整型数据类型. 其次就是对 ARM 处理器相关宏进行定 义,如 ARM处理器中的退出临界区和进入临界区的宏定义,退出临界区宏定义[5 ] : # define OS EXITCRITICAL () ARMDisable Int ( ) / / 关中断,进入临界区宏定义# define OS ENTER CRITICAL ( ) AR2MEnableInt () / / 开中断. 最后就是堆栈增长方向的设定. 当进行函数调用 时,入口 参数 转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应 和返回地址一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的 堆栈指令就会决定堆栈的增长方向[6 ] ,定义为# define OS STK GROWTH 1. 图2 堆栈增长方向 1. 2 OS CPU. C 的移植 OS CPU. C 的移植包括任务堆栈初始化和相应函数的实现 . 在这里 ,共有6 个函 数 :OSTaskStkInit( ) , OSSTaskCreateHook ( ) , OSTaskDelHook ( ) , OS2TaskSwHook( ) ,OSTaskStatHook ( ) , OSTimeTickHook () . 其中后面的5 个 HOOK函数又称为钩子函数,主 要是用来对 uC/ OS - II 进行功能扩展. 这些函数为用户定义函数,由操作系统调用相应的 HOOK 函数去执行 ,在一般情况下 ,他们都没有代码 ,所以实现为空函数即可 . 而函数 OSTaskStkInit ( ) 对堆栈进行初始化,在 ARM 系统中,任务堆栈空间由高到低依次为 PC ,LR ,R12 ,R11 , ,R1 ,R0 ,CPSR ,SPSR. 在进行堆栈初始化以后,OSTaskStkInit ( ) 返回新的堆栈 栈顶指针. 1. 3 OS CPUA. S 的移植 OS CPUA. S 文件的移植需要对处理器的寄存器进行操作,所以必须用汇编语言来编写. 这个文件的实现集中体现了所要移植到处理器的体系结构和 uC/ OS - II 的移植原理[6 ] . 它 包括4 个子函数:OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中难点在 于 OSIntCtxSw() 和 OSTickISR() 函数的实现,因为这两个函数的实现与移植者的移植思路 以及相关硬件定时器、中断寄存器的设置有关.在实际的移植工作中,这两处也是比较容易出 错的地方. OSIntCtxSw( ) 函数由 OSIntExit ( ) 函数调用,而 OSIntExit () 函数又由 OSTickISR() 调 用. OSIntCtxSw()函数最重要的作用就是它完成在中断 ISR 中直接进行任务切换,从而提高 了实时响应的速度. 它发生的时机是在 ISR 执行到 OSIntExit ( ) 时,如果发现有高优先级的 任务因为等待 time tick 的到来获得了执行• 7 2 • 第4 期李学桥等:uC/ OS - II 在 ARM系统 上的移植与实现的条件,就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任 务切换. 实现 OSIntCtxSw() 的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 大致也有两种情况[7 ] :一是通过调整 SP 堆栈指针的方 法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的 SP 位置来使得进 入中断时所作的保护现场的工作可以被重用 . 二是设置需要切换标志位的方法 ,在 OSIntCtxSw( ) 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入 OSIntExit ( ) = > OS ENTER CRITI2CAL() = > OSIntCtxSw( ) = > OS EXIT CRITICAL() = > OSIntExit ( ) 退出后,再根据标志位来判断是否需要进行中断级的任务切换. 其次是对OSTickISR() 修改.OSTickISR() 首先在被中断任务堆栈中保存CPU 寄存器的 值,然后调用OSIntEnter () . 随后调用OSTimeTick() ,检查所有处于延时等待状态的任务,判断 是否有延时结束就绪的任务. 最后调用 OSIntExit ( ) . 如果在中断中(或其他嵌套的中断) 有 更高优先级的任务就绪,并且当前中断为中断嵌套的最后一层,OSIntExit ( ) 将进行任务调度. 如果进行了任务调度,OSIntExit () 将不再返回调用者,而是用新任务的堆栈中的寄存器数值 恢复 CPU 现场,然后实现任务切换. 如果当前中断不是中断嵌套的最后一层,或中断中没有 改变任务的就绪状态, OSIntExit ( ) 将返回调用者 OSTickISR ( ) ,OSTickISR() 返回被中断的 任务 . 最后就是退出临界区和进入临界区函数 . 进入临界区时 ,必须关闭中断 ,用 ARMDisableInt () 函数实现. 在退出临界区的时候恢复原来的中断状态,通过 ARMEnableInt ( ) 函数来实现[7 ] . 至于进行任务级上下文切换,则是由汇编子程序 OSCtxSw 实现. 2 在 ARM系统上的实现 以跑马灯和数码管为例,说明 uC/ OS - II 的移植过程:跑马灯是4 个小灯轮流变明变暗, 很方便看出效果. 跑马灯在日常中使用很多,比如状态栏跑马灯、文字跑马灯、图片跑马灯、 单片机跑马灯等[8 ] . 本文采用的是单片机跑马灯. 实现单片机跑马灯的程序中,只有地址口 为低电平(接地) 时,发光管才会亮. 所以只要循环控制地址口的各个引脚的电平高低变化就 可使 LED 循环点亮:首先是全不亮,接着第1 个灯亮,第2 个灯亮,第3 个灯亮,第4 个灯亮,第 5 个灯亮,最后所有的灯一起亮. 笔者使用6 个共阳极LED 数码管来实现在7 段数码管上循环显示0~9 ,A~F 字符. 每 个显示位的段选线与一个8 位并行口线对应相连,只要在显示位上的段选线上保持段码电平 不变,则该位就能保持相应的显示字符. 这里的8 位并行口可以直接采用并行 I/ O 口,也可以 采用串入/ 并出的移位寄存器或是其他具有三态功能的锁存器等 . 当采用动态显示接口时, 在多位 LED 显示时,为了简化电路,降低成本,将所有位的段选线并联在一起,由一个8 位 I/ O 口控制. 而共阴(或共阳) 极公共端分别由相应的 I/ O 线控制,实现各位的分时选通. 由于各 个数码管是共用同一个段码输出口分时轮流通电的,从而大大简化了硬件线路,降低了成本. 对于数码管的实现分为3 个步骤: 1) 制作 LED 字符与码段对应表 2) 扫描控制 3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一个数码管 3 / 3) 段码输出 ( (U8 3 ) 0x02000004) = seg7table[0 ] ; 根据上面的LED 字符与码段对应表,控制相应的数字进行输出. 数码管扫描控制地址为 0x02000006 ,8 位访问,比如 Bit0 控制数码管0 ,并且低电平有效,Bit5 控制数码管5 ,低电平 有效,数码管显示试验系统中采用的是动态显示接口,其中数码管扫描控制地址为0x02000006 ,位0 —5 分别对应一个数码管,将其中每位清0 来选择相应的数码管;地址0x02000004 为数 码管的数据寄存器,控制数码管的段码输出. 3 多任务应用程序 uC/OS - II 的移植及跑马灯和数码管的实现如下[9 ] :首先是 C 语言入口函数 Main (所 有 C 程序的入口) . 它里面包括调用函数 ARMTargetInit () 初始化 ARM处理器,调用 OSInit ( ) 进行 uC/ OS - II 操作系统初始化,然后调用 OSTaskCreate ( ) 函数创建任务 TaskLED 和 TaskSEG,最后调用 ARMTargetStart () 函数启动时钟节拍中断,并且调用OSStart ( ) 启动系统 任务调度,由于在程序当中使用 for ( ; ;) ,这是一个永无止境的回路,所以装置可以一直进行下 去,直到关闭装置. void Main(void) {ARMTargetInit () ; uHALr printf (″uC/ OS - II # n″) ; OSInit () ; Sem1 = OSSemCreate(0) ; Sem2 = OSSemCreate(1) ; OSTaskCreate(TaskLED , (void 3 ) &IdLED , (OS STK 3 ) &StackLED[ STACKSIZE - 1 ] , 5) ; OSTaskCreate(TaskSEG, (void 3 ) &IdSEG, (OS STK 3 ) &StackSEG[ STACKSIZE - 1 ] , 6) ; ARMTargetStart () ;OSStart () ; return ;} 4 结语 使用创建好的模板 Temp 新建一个工程 Temp ,并将模板中的 Core 和 Assemble 文件夹 中的文件加入到工程 Temp 中. 1) 新建一个文件 Temp. c ,并将其添加到 Temp 工程的 App 文件夹中. 2) 打开 Temp. c文件,添加两个任务,它们的任务处理函数分别为 TaskLED() 和 TaskSEG() . 3) 在 TaskLED( ) 函数中每隔50 个时钟节拍使所有跑马灯闪烁一次(即按顺序 亮,然后全亮,最后全灭,顺序循环) . 4) 在 TaskSEG() 函数中每隔50 个时钟节拍切换一次数 码管显示(循环从0~F 显示) . 5) 编译工程Temp ,如果出错,则进行修改后再编译. 6) 将Temp 下载并运行,看结果. 正确的结果是将每隔1/ 2 s 切换一次数码管显示,每隔1/ 2 s使所有跑马 灯闪烁一次. 经持续了2 h试验,没有出现错误,跑马灯和数码管正常运转,结果证明移植成功.
本文档为【uCOS移植】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_240875
暂无简介~
格式:pdf
大小:183KB
软件:PDF阅读器
页数:5
分类:互联网
上传时间:2010-04-08
浏览量:39