【转载】关于2440的MDK平台下移植ucOS2,遇到的问题,及解决办法


转载自: http://blog.sina.com.cn/s/blog_a4acf5ea0101g9lk.html


 这几天,移植想把ucos2移植到自己的2440开发板上,可是苦于没资料啊,于是网上到处找资料,今晚终于调试通过了,把自己的问题及解决办法跟大家分享分享:

    首先,建议大家到网上下载一个简单的ADS的例程,网上的在ADS上移植ucOS的例程很多,我也是随便下的一个,然后像移植单片机程序那样直接移植UCOS2就行了,编译的时候可能会报以下错误:

.\out_put\led.axf: Error: L6238E: 2440init.o(Init) 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 CopyProgramFromNand.

决解办法:在2440init中找到

  AREA   

 Init,CODE,READONLY  

 ENTRY
__ENTRY

在这段断码前面加一句PRESERVE8就可以了

 

   .\out_put\led.axf: Error: L6238E: os_cpu_a.o(UCOS_ARM) 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 OSTaskSwHook.

解决办法:找到Os_cpu_a.s中找到AREA UCOS_ARM, CODE, READONLY,在前面加上个 PRESERVE8,就OK了

 

warning:  #550-D: variable "d" was set but never used
描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.
解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.

warning:  #1-D: last line of file ends without a newline
描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.
解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.

 

warning: A1876W: Use of '|' as a synonym for the :OR: operator is deprecated.

部分源代码:

MSR CPSR_c, #(NoInt|IRQ32Mode) ;进入IRQ模式。

 

warning: A1608W: MOV pc, instruction used, but BX is preferred
解决:把MOV pc, 替换为 BX    即从子程序返回

子程序返回的三种方法

现在总结如下

1.MOV PC,LR

2.BL LR

3.在子程序入口处使用以下指令将R14存入堆栈

STMFD    SP!,{,LR}

对应的,使用以下指令可以完成子程序的返回

LDMFD  SP!,      {,LR}

 

 


你可能感兴趣的:(【转载】关于2440的MDK平台下移植ucOS2,遇到的问题,及解决办法)