uC/OS-II在ARM系统上的移植和实现(2)

2008-02-23 05:28:07来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

其次是对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试验,没有出现错误,跑马灯和数码管正常运转,结果证实移植成功.

参考文献:
[1 ]  雷必成, 吴高标, 吴永良. 嵌入式实时操作系统uC/ OS
- II 的移植探讨[J ] . 自动化技术和应用,2003 , (5) :1 —3.
[2 ]  邵贝贝. 嵌入式实时操作系统uC/ OS - II[M] . 第2 版.
北京:北京航空航天大学出版社,2003. 2 —30.
[3 ]  叶丰桥,黄海. uC/ OS - II 在51XA 上的移植应用[J ] .
工业控制电脑,2002 , (10) :1 —2.
[4 ]  田泽. 嵌入式研发和应用实验教程[M] . 北京: 北京航
空航天大学出版社,2004. 264 —270.
[5 ]  陈赜. ARM嵌入式技术实践教程[M] . 北京:北京航空
航天大学出版社,2005. 189 —203.
[6 ]  王田苗. 嵌入式系统设计和实例研发[M] . 北京: 清华
大学出版社,2003. 62 —89.
[7 ]  朱华军. uC/ OS - II 操作系统在ARM处理器上的技巧
[J ] . 电脑工程,2004 , (S1) :2 —3.
[8 ]  苏中义,杨宇. 嵌入式系统[J ] . 嵌入系统,2004 , (3) :11
[9 ]  曾鸣. uC/ OS - II 实时操作系统在嵌入式平台上进行
移植的一般方法和技巧[ J ] . 今日电子, 2004 , (11) :2 —3.





标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 使用ARM标准C库进行嵌入式应用程式研发

下一篇: 嵌入式Linux的低功耗策略研究