历史上的今天
今天是:2025年02月07日(星期五)
2021年02月07日 | ARM重定向代码字节对齐问题
2021-02-07 来源:eefocus
在ARM学习过程中,用到代码的重定向,链接脚本中字节不对齐时碰到的问题,具体初始化代码如下
1、链接脚本
SECTIONS
{
. = 0xD0020010;
.text : {
start.o
* (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.bss)
}
bss_end = .;
}
2、这段代码的主要功能是将代码拷贝到指定的连接地址运行,
.global _start
_start:
adr r0,_start
ldr r1,=_start
ldr r2,=bss_start
cmp r0,r1
beq clean_bss
copy_loop:
ldr r3,[r0],#4
str r3,[r1],#4
cmp r1,r2
bne copy_loop
clean_bss:
ldr r0,=bss_start
ldr r1,=bss_end
cmp r0,r1
beq run_on_dram
mov r2,#0
clean_loop:
str r2,[r0],#4
cmp r0,r1
bne clean_loop
run_on_dram:
ldr pc,=main
halt:
b halt
3、主函数
char c;
int main()
{
uart0_init();
while(1)
{
c = getc();
putc(c+1);
}
return 0;
}
遇到的问题是加了连接脚本重定向之后程序不能运行了,通过反汇编查处问题所在。
在反汇编代码中看到
d0020060: d002027c andle r0, r2, ip, ror r2 //bss_start
d0020064: d002027d andle r0, r2, sp, rorr2//bss_end
bss_end与bss_end竟然只相差一个字节,也就是说bss段只占用了一个字节,bss清0代码为
str r2,[r0],#4
cmp r0,r1 //r0为bss_start,r1为bss_end
每次清0步进为4字节而由于bss段只有一个字节,第一次比较r0,r1时,不相等,执行循环,bss_start地址加4之后清0在比较,由于多加4个字节,因此也不想等,继续加,这样一直循环下去,到只程序在这里执行死循环。
为什么bss段只有一个字节呢?
bss段是放置未初始化的全局变量和静态变量,由于main中使用了一个全局的char c变量,因此只占用一个字节。
解决办法:
最后的解决办法是将charc定义为局部变量,也可以将清0段代码步进改为1,如果在连接文件中使用ALIGN(4)进行字节对齐,当使用char数组是应该注意每一个char均占用了4byte,因此不能用以往占用一个字节的方式读取char数组中元素;
下一篇:ARM相关概念的区分
史海拾趣
|
1905年初,美国汽车工程师学会(SAE)认识到必须标准化。那个年代的汽车制造商都是小公司,从供应商购买零部件,然后组装成整车。当遍及全国的独立经销商销售各种车辆时,车辆需要经常维修。如果不返回汽车或零部件的原制造厂,就很难找到合适的配件,因此, ...… 查看全部问答> |
|
我在程序中创建了一个主表面,因为不能为独占模式,所以采用用覆盖页面over lay的方式来显示图片。因此创建了带一个缓冲的覆盖页面。基本想法是把yuyv格式的图片copy到其中一个覆盖页面,然后再blt到另一个覆盖页面,最后显示出来,实 ...… 查看全部问答> |
|
硬件线路由我方负责。 现寻高手完成固件开发,AP完成常规功能即可,另要求有 GPIO读写功能,自定义网络数据包函数。详细要求请与我联络 leo@aviosys.com … 查看全部问答> |
|
PE7、PE6都悬空:结果如下 PE7接地(电源地)、PE6悬空:结果如下 PE7接地(与手相连)、PE6悬空:结果见附件 怎么PE6和PE7还相互影响呢? [ 本帖最后由 喜鹊王子 于 2012-3-23 09:44 编辑 ]… 查看全部问答> |
|
如图: 问题如下: 1、全波精密整流后U5B的的输出脚不加电容0.47uF为馒头波,加了电容,波形变平,C1的作用是为滤波,请问这里是怎么算出来的? 2、U5B出来的信号接至U7,U7由2个1N4148和一个电容组成,这个运放是干什么用的? 请指 ...… 查看全部问答> |
|
最近人前几天在头问件上折腾了好久,主要是头文件里面的 嵌套问题, 后来曲线救国了。 现在问题是: 一个key.c文件中有些函数,这些函数有一个在key.c中的全局变量i。但这些函数在key.h中声明,在main.c中被调用,但全局变量i定义 ...… 查看全部问答> |




