向总线上写数据时,无法成功赋值。在执行一条总线赋值语句时,从示波器观察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参数进行编译解决呢?
*/