您的位置:首页 > 运维架构 > Linux

arm-linux-gcc半字处理编译参数

2012-02-20 20:36 435 查看
在Ubuntu10.10环境下使用arm-linux-gcc 3.4.1调试16位总线LCD屏的时候遇到问题:

向总线上写数据时,无法成功赋值。在执行一条总线赋值语句时,从示波器观察nGCS1片选时,发现该信号连续2次低电平有效。将该赋值语句反汇编代码列出:
arm-linux-gcc 3.4.1编译代码反汇编结果:

C赋值语句:

*(volatile unsigned short*)lcmreg=0x0052;//lcmreg=0x08000000

反汇编代码:

ldr r3, .L122+12

ldr r1, [r3, #0]

mov r3, #82

mov r2, #0

strb r3, [r1, #0]

strb r2, [r1, #1]

对比裸机环境下已经成功执行的代码,ADS1.2环境编译代码反汇编:

C赋值语句:

*(volatile unsigned short*)0x08000000=0x0052;

反汇编代码:

[0xe3a00022]   mov      r0,#0x52

[0xe3a01680]   mov      r1,#0x8000000

[0xe1c100b0]   strh     r0,[r1,#0]

从以上代码可以发现:

裸机环境ADS1.2下的代码向总线写数据0x0052时,使用1次16位半字处理指令strh将0x0052存入目标地址,数据写入成功。

arm-linux-gcc 3.4.1下编译的汇编语句赋值半字数据0x0052时,使用2次8位字节处理指令strb将0x0052存入目标地址,从而致nGCS1两次有效,数据写入失败。

 

解决方法:arm-linux-gcc编译条件指定cpu类型即可。

本人使用的是S3C2440处理器,指定条件为-mcpu=arm9tdmi,

编译环境是Kdevelop4.0.2,在代码文件夹下的CmakeLists.txt中加入set(CMAKE_C_FLAGS "-mcpu=arm9tdmi")即可。 

重新编译后的结果如下:

C赋值语句:

*(volatile unsigned short*)lcmreg=0x0052;//lcmreg=0x08000000

反汇编代码:

ldr r3, .L122+16

ldr r2, [r3, #0]

mov r3, #82

strh r3, [r2, #0] @ movhi

参考案例1:

原文地址:http://www.unixresources.net/linux/clf/embedded/archive/00/00/70/25/702531.html
/*

Subject: Re: 半字处理 gcc 编译选项 的问题(问题解决)

Author: jerryandtom    Posted: 2008-11-24 10:43    Length: 325 byte(s) 

[Original] [Print] [Top] 

修改 优化 级别没有变化。谢谢。

在网上搜索到 指定 cpu 类型可以达到我的目的。

加上 -mcpu=arm9tdmi 后 ok了。 生成的代码如下:

78: e3a03203 mov r3, #805306368 ; 0x30000000

7c: e1c350b0 strh r5, [r3]

80: e1d330b0 ldrh r3, [r3]

*/

参考案例2:

原文地址:http://www.100ask.net/archiver/showtopic-1782.aspx
/*

sinahot - 2009-7-16 16:24:00

怀着死马当活马医的怨念,对一些arm-linux-gcc的版本进行了测试。一共有2.95.3, 3.3.2, 3.4.1, 3.4.5这几个版本,分别看了一下这段代码的反汇编,其中只有3.3.2版本的arm-linux-gcc编译出来的汇编为单次赋值,运行后可以正常获取FlashID,其他版本均为上面描述的样子,无法获取。

(3.4.5是linux完全开发手册光盘里的,其他版本都是mini2440光盘里的)

请问一下南方大哥此类问题是否能通过加入特定的gcc参数进行编译解决呢?

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 gcc ubuntu c linux byte
相关文章推荐