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参数进行编译解决呢?
*/
向总线上写数据时,无法成功赋值。在执行一条总线赋值语句时,从示波器观察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参数进行编译解决呢?
*/
相关文章推荐
- fedora14 编译arm Linux make menuconfig error处理方法
- hi3531 SDK 编译 kernel, 修改 参数 分类: arm-linux-Ubuntu HI3531 2014-05-07 11:23 1120人阅读 评论(0) 收藏
- 【Linux开发】如何在./configure的时候将编译参数传入,改变默认的编译器gcc成arm-linux-gcc
- 如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux-gcc 【转】
- hi3531 SDK 编译 uboot, 修改PHY地址, 修改 uboot 参数 . 分类: arm-linux-Ubuntu HI3531 2014-06-18 08:55 1204人阅读 评论(0) 收藏
- 【原创】arm-linux-gcc “missing braces around initializer”编译错误处理
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)【转】
- 如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux-gcc
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)
- Linux内核移植 part1:arm gcc 编译与链接参数
- linux下处理大文件程序的编译参数
- linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)
- 优化Linux内核参数,提高服务器并发处理能力
- minicom 在arm linux平台的交叉编译
- 【教程】在Ubuntu下搭建ARM处理器 arm-linux-gcc 交叉编译环境以及OpenJTAG + openocd 烧写环境
- 建立 arm-linux 交叉编译环境
- 建立arm linux编译环境
- 安装arm-linux-gcc交叉编译工具