您现在所在的是:

嵌入式系统

回帖:1个,阅读:1160 [上一页] [1] [下一页]
1203
TE2410
文章数:102
年度积分:50
历史总积分:1203
注册时间:2007/4/27
发站内信
发表于:2010/11/18 12:36:00
#0楼
关于uCOS-II的种种阿呆就不说了,很多初学者从此踏上操作系统之路
uCOS-II在ADS上的移植很常见,而在KEIL MDK下的移植却不是很多,阿呆根据ADS下的移植范例,结合自

己最近使用KEIL MDK的稍许心得,记录一下uCOS-II在KEIL MDK下的移植过程。

一:准备源码
在官网上下载了uCOS-II的源码,好像似乎是2..91的了.

二:编写OS移植文件
1.编写OS_cpu_c.c
这个文件阿呆是在ADS下的移植范例里面copy的,直接使用就可以了
注:2.89开始添加了OS_TaskReturn(),它会调用OSTaskReturnHook(),如果copy的版本低于2.89则需要

自己添加一下。
2.编写OS_cpu_a.s
这个文件也是阿呆在ADS下的一直范例里面copy的,同样的S3C2440平台,这下函数一样的,而KEIL MDK

与ADS相比,在语法上没有什么特别的要求。
3.添加系统心跳定时器
阿呆使用没有输出引脚的Timer4作为系统心跳定时器,具体实现参看:OS_Timer4_c.c

三:修改启动代码
1.如果直接将ADS下的启动代码copy到MDK下,编译会提示出错,一般错误是:.\OutPutFiles\uCOS-

II_Uart.axf: Error: L6238E: 2440_init.o(Init_2440) contains invalid call from '~PRES8 (The

user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to

'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function

App_Main.
解决方法是在代码段前部添加:PRESERVE8,如图1



2.将IRQ中断交给uC/OS-II管理
代码如下:
;****************************************************
;将OS_CPU_IRQ_ISR地址装入HandleIRQ中,IRQ中断交给uCOS-II管理      
;****************************************************
 LDR     R0,=HandleIRQ    ;This routine is needed
  LDR     R1,=OS_CPU_IRQ_ISR   ;if there isn't 'subs pc,lr,#4' at 0x18,

0x1c
  STR     R1,[r0]
即发生IRQ中断时系统跳转到OS_CPU_IRQ_ISR处执行uC/OS-II中断服务函数,具体事件由它负责。
四:设置MDK编译参数信息
1.选择CPU:



2.填写存储器信息:



3.编写scatter
如果不想自己编写此文件,KEIL会自动生成文件模板,选择如下:

但是阿呆不推崇这中方法,这种方法让人有种雾里看花的感觉,不明了
还是自己编写吧:
设置如下:



Scatter文件内容:
/*-------------------------------------------------------------
运行域在SRAM中,可使用以下写法,也可直接将WR,ZI段跟在ROM后面
-------------------------------------------------------------*/
LR_ROM1 0x30000000 0x01000000  {    ; load region size_region
 RO 0x30000000 0x01000000  {  ; load address = execution address
  2440_init.o (Init_2440, +First)
  .ANY (+RO)
 }
 RW 0x31000000 0x01000000  {  ; RW data
  .ANY (+RW)
 }
 ZI  +0 {
  .ANY (+ZI)
 }
}
很多同志会遇到.\OutPutFiles\uCOS-II_Uart.axf: Error: L6218E: Undefined symbol

Image$$RO$$Base (referred from 2440_init.o).
从ADS copy过来的和KEIL默认的标号是不一致的,修改scatter文件里面的ER_ROM1为RO标号,RW_RAM1为

RW,以此类推即可。

阿呆安排运行域地址从0x30000000-0x31000000,数据域地址:0x31000000-0x32000000
安排方式纯属个人爱好。
由于MDK默认生成的输出文件时HEX的,要使之生成BIN的需要添加一条命令:
如下:


在RUN #1,中添加:D:\ProgramFiles\KEIL\MDK\ARM\BIN40\fromelf.exe --bin -o

./OutPutfiles/uCOS-II_Uart.bin ./OutPutfiles/uCOS-II_Uart.axf
具体路径需调整。

至此为止,uCOS-II的移植已经完毕,阿呆没有在uC/OS-II的具体细节上纠结,而是将精力放在MDK环境

的使用上,简单介绍了一下在KEIL MDK下编写程序的基本步骤。

编译之:



OK啦。

企业精神
※ 注重信誉、敬业、务实、高质、高效
※ 以一流的技术,提供专业的服务
※ 为中国嵌入式技术的传播和发展作出贡献
匿名用户
文章数:N/A
年度积分:0
历史总积分:0
注册时间:2010/11/23
发站内信
发表于:2010/12/7 13:52:49
#1楼
该用户被锁定,回复内容不予显示!

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003