uCOS-II在ARM系统上的移植与实现_第1页
uCOS-II在ARM系统上的移植与实现_第2页
uCOS-II在ARM系统上的移植与实现_第3页
uCOS-II在ARM系统上的移植与实现_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、uC OS - II 在 ARM系统上的移植与实现摘要:使用 ARM公司提供的 ADS 开发工具,将 uC/ OS - II 移植到 ARM处 理器 上, 并将移植结果应用在跑马灯和数码管的实现上 ,运行正常,表明移植成功 .关键词:uC/ OS - II ;ARM; 移植0 引言在开发嵌入式系统时 , 一般选择基于 ARM和 uC/ OS - II 的嵌入式开发平台 , 因 为 ARM微 处理器具有处理速度快、超低功耗、价格低廉、应用前景广泛等优点1 . 将 uC/ OS - II 移植到 ARM系 统之后 ,可以充分结合两者的优势 . 如果 一个程序在一个环境里能工作 , 我们经常希望能将

2、它移植到另一个编译系统、处 理器或者操作系统上 , 这就是移植技术 . 移植技术可以使一种特定的技术在更加 广泛的范围使用 ,使软件使用更加灵活 , 不局限于某一条件 .uC/OS - II 是由 Jean J . Labrosse 先生编写的完整的可移植、固化、裁剪的占先式实时多任 务内核.uC/ OS - II 的源代码完全开放 , 这是其他商业实时内核无法比拟的2 . 它是针对嵌入式应用设计的 ,在设计之初就充分考虑了可移植性 , 它的大 部分源代码都是用高可移植性的 ANSIC 编写的3 . uC/ OS - II可以移植到从8 位到 64 位的不同类型、不同规模的嵌入式系统 ,并能在

3、大部分的 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 个头文件 . 功能分别是 内核管理、事件管理、消息队列管理、存储管理、消

4、息管理、信号量处理、任 务调度和定时管理 . 设置代码部分包括 2 个头文件 , 用来配置事件控制块的数 目以及是否包含消息管理相关代码 . 而与处理器相关的移植代码部分则是进行 移植过程中需要更改的部分 ,包括 1 个头文件 OS CPU. H ,1 个汇编文件 OS CPU A. S 和 1 个 C 代码文件 . 实际上将 uC/ OS - II 移植到 ARM处 理器上 , 需 要完成的工作主要是以下三个与体系结构相关的文件 :OS CPU. H ,OS CPU. C 以及 OS CPU A. S5 .1. 1 OS CPU. H 的移植文件 OS CPU. H 中包括了用 # defi

5、ne 语句定义的与处理器相关的常数、宏以 及类型 . 移植时主要修改的内容有 : 与编译器相关的数据类型的设定 ; 用#define 语句定义 2 个宏开关中断 ; 根据堆栈的方向定义 OS STK GROWT等H.在将 uC/ OS - II 移植到 ARM处 理器上时 , 首先进行基本配置和数据类型定义 .重新定义数据类型是为了增加代码的可移植性 , 因为不同的编译器所提供的同一 数据类型的数据长度并不相同 ,例如 int 型,在有的编译器中是 16 位,而在另外 一些编译器中则是 32 位. 所以,为了便于移植 ,需要重新定义数据类型 ,如 INT32U 代表无符号 32 位整型. ty

6、pedefunsigned int INT8U ,就是定义一个 8位的无符号整型数据类型 . 其次就是对 ARM处 理器相关宏进行定义 ,如 ARM处 理器中的退出临界区和进入临界区的宏定义 , 退出临界区宏定义 5 : # define OS EXITCRITICAL () ARMDisable Int ( ) / /关中断, 进入临界区宏定义# define OS ENTER CRITICAL ( ) AR2MEnableInt () / /开中断. 最后就是堆栈增长方向的设定 . 当进行函数调用时 , 入口参数和返回地址一般都会保 存在当前任务的堆栈中 , 编译器的编译选项和由此生成的堆

7、栈指令就会决定堆栈 的增长方向 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 进行功能扩展 . 这 些

8、函数为用户定义函数 ,由操作系统调用相应的 HOOK函数去执行 ,在一般情况下 他们都没有代码 ,所以实现为空函数即可 . 而函数 OSTaskStkInit ( ) 对堆栈 进行初始化 , 在 ARM系 统中,任务堆栈空间由高到低依次为PC ,LR ,R12 ,R11 , ?,R1 ,R0 ,CPSR ,SPSR. 在进行堆栈初始化以 后,OSTaskStkInit ( )返回新的堆栈栈顶指针 .1. 3 OS CPU A. S 的移植OS CPU A. S 文件的移植需要对处理器的寄存器进行操作 ,所以必须用汇编语言 来编写. 这个文件的实现集中体现了所要移植到处理器的体系结构和uC/ O

9、S -II 的移植原理 6 . 它包括 4 个子函数 :OSStartHighRdy() , OSCtxSw() , OSIntCtxSw() ,OSTick2ISR() . 其中难点在于 OSIntCtxSw() 和 OSTickISR() 函数的实现 , 因为这两个函数的实现与移植者的移植思路以及相关硬件定时器、 中断寄存器的设置有关 . 在实际的移植工作中 , 这两处也是比较容易出错的地方 .OSIntCtxSw( ) 函数由 OSIntExit ( ) 函数调用 , 而 OSIntExit () 函数又由 OSTickISR() 调用. OSIntCtxSw() 函数最重要的作用就是它

10、完成在中断 ISR 中 直接进行任务切换 , 从而提高了实时响应的速度 . 它发生的时机是在 ISR 执行 到 OSIntExit ( )时 , 如果发现有高优先级的任务因为等待 time tick 的到来获得了执行 ? 7 2 ? 第 4 期李学桥等 :uC/ OS - II 在 ARM系统上的移植与实 现的条件 ,就可以马上被调度执行 , 而不用返回被中断的那个任务之后再进行任 务切换. 实现 OSIntCtxSw() 的方法大致也有两种情况 7 : 一是通过调整 SP 堆栈指针的方法 ,根据所用的编译器对于函数嵌套的处理 , 通过精确计算出所需 要调整的 SP 位置来使得进入中断时所作的

11、保护现场的工作可以被重用 . 二是 设置需要切换标志位的方法 , 在 OSIntCtxSw( ) 里面不发生切换 , 而是设置一个 需要切换的标志 ,等函数嵌套从进入 OSIntExit ( ) = OS ENTER CRITI2CAL() = OSIntCtxSw( ) = OS EXIT CRITICAL() = OSIntExit ( )退出后 , 再根据标志位来判断是否需要进行中断级的任务切换 .其次是对 OSTickISR() 修改 .OSTickISR() 首先在被中断任务堆栈中保存 CPU 寄存器的值 , 然后调用 OSIntEnter () .随后调用 OSTimeTick()

12、 , 检查所有处于延时等待状态的任务 , 判断是否有延时结束就绪的任务 . 最后调用 OSIntExit ( ) . 如果在中断中 ( 或其他嵌套的中断 ) 有更高优先级的任务就绪 , 并且当前 中断为中断嵌套的最后一层 ,OSIntExit ( ) 将进行任务调度 . 如果进行了任务 调度,OSIntExit () 将不再返回调用者 ,而是用新任务的堆栈中的寄存器数值恢 复 CPU 现场, 然后实现任务切换 . 如果当前中断不是中断嵌套的最后一层 , 或中 断中没有改变任务的就绪状态 , OSIntExit ( )将返回调用者 OSTickISR( ) ,OSTickISR() 返回被中断的

13、任务 . 最后就是退出临界区和进入临界区函数 进入临界区时 ,必须关闭中断 ,用 ARMDisableInt () 函数实现. 在退出临界区 的时候恢复原来的中断状态 ,通过 ARMEnableInt ( ) 函数来实现 7 . 至于 进行任务级上下文切换 , 则是由汇编子程序 OSCtxSw实 现.2 在 ARM系统上的实现 以跑马灯和数码管为例 ,说明 uC/ OS - II 的移植过程 :跑马灯是 4 个小灯轮流 变明变暗 ,很方便看出效果 . 跑马灯在日常中使用很多 , 比如状态栏跑马灯、文 字跑马灯、图片跑马灯、单片机跑马灯等 8 . 本文采用的是单片机跑马灯 . 实现单片机跑马灯的

14、程序中 ,只有地址口为低电平 (接地) 时,发光管才会亮 . 所 以只要循环控制地址口的各个引脚的电平高低变化就可使LED 循环点亮 : 首先是全不亮 ,接着第 1 个灯亮,第 2 个灯亮,第 3 个灯亮,第 4 个灯亮,第 5 个灯 亮 , 最后所有的灯一起亮 .笔者使用 6 个共阳极 LED 数码管来实现在 7 段数码管上循环显示 09 ,A F 字符. 每个显示位的段选线与一个 8 位并行口线对应相连 , 只要在显示位上的 段选线上保持段码电平不变 , 则该位就能保持相应的显示字符 . 这里的 8 位并 行口可以直接采用并行 I/ O 口, 也可以采用串入 / 并出的移位寄存器或是其他

15、具有三态功能的锁存器等 . 当采用动态显示接口时 ,在多位 LED 显示时,为了简 化电路,降低成本,将所有位的段选线并联在一起 ,由一个 8 位 I/ O 口控制. 而 共阴(或共阳) 极公共端分别由相应的 I/ O 线控制, 实现各位的分时选通 . 由 于各个数码管是共用同一个段码输出口分时轮流通电的 , 从而大大简化了硬件线 路,降低了成本 .对于数码管的实现分为 3 个步骤 :1) 制作 LED 字符与码段对应表2) 扫描控制3 ( (U8 3 ) 0x02000006) = 0x3E; / 3 使能第一个数码管3 /3) 段码输出( (U8 3 ) 0x02000004) = seg

16、7table0 ;根据上面的 LED 字符与码段对应表 , 控制相应的数字进行输出 . 数码管扫描控 制地址为 0x02000006 ,8 位访问,比如 Bit0 控制数码管 0 , 并且低电平有 效,Bit5 控制数码管 5 , 低电平有效 ,数码管显示试验系统中采用的是动态显示 接口,其中数码管扫描控制地址为 0x02000006 , 位 0 5 分别对应一个数码管 将其中每位清 0 来选择相应的数码管 ; 地址 0x02000004 为数码管的数据寄存器 控制数码管的段码输出 .3 多任务应用程序uC/OS - II 的移植及跑马灯和数码管的实现如下 9 : 首先是 C 语言入口函 数

17、Main ( 所有 C 程序的入口 ) . 它里面包括调用函数 ARMTargetInit () 初始 化 ARM处理器 , 调用 OSInit ( ) 进行 uC/ OS - II 操作系统初始化 , 然后调用 OSTaskCreate ( ) 函数创建任务 TaskLED 和 TaskSEG,最后调用 ARMTargetStart () 函数启动时钟节拍中断 , 并且调用 OSStart ( ) 启动系统 任务调度 ,由于在程序当中使用 for ( ; ;) ,这是一个永无止境的回路 ,所以装置可以一直进行下去 , 直到关闭装置 .void Main(void)ARMTargetInit

18、() ;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 结

19、语使用创建好的模板 Temp 新建一个工程 Temp , 并将模板中的 Core 和 Assemble 文件夹中的文件加入到工程 Temp 中. 1) 新建一个文件 Temp. c , 并将其添加 到 Temp 工程的 App 文件夹中 . 2) 打开 Temp. c 文件, 添加两个任务 , 它们的任 务处理函数分别为 TaskLED() 和 TaskSEG() . 3) 在 TaskLED( ) 函数中每隔 50 个时钟节拍使所有跑马灯闪烁一次 (即按顺序亮 ,然后全亮,最后全灭,顺序循 环) . 4) 在TaskSEG() 函数中每隔 50 个时钟节拍切换一次数码管显示 (循环 从 0F 显示) . 5) 编译工程 Temp ,如果出错 , 则进行修改后再编译 . 6) 将 Temp 下载并运行 ,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论