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

来源:互联网 发布:御姐的穿着风格知乎 编辑:程序博客网 时间:2024/05/16 13:07
 
在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参数进行编译解决呢?
*/