历史上的今天
返回首页

历史上的今天

今天是: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数组中元素;


推荐阅读

史海拾趣

DLG Hanbit公司的发展小趣事

面对数字化转型的浪潮,DLG Hanbit公司积极拥抱变革。公司加大了对云计算、大数据、人工智能等技术的研发投入,推出了一系列智能电子产品和解决方案。同时,公司还加强了与互联网企业、电信运营商等合作伙伴的合作,共同打造智能生态圈。未来,DLG Hanbit公司将继续秉承创新、品质、环保的理念,致力于成为全球领先的半导体设计和制造企业。

Franz Binder GmbH & Co公司的发展小趣事

DLG Hanbit公司成立于20世纪90年代初,当时正值电子行业的快速发展时期。公司创始人李先生是一位资深的电子工程师,他看到了半导体行业的巨大潜力,并决定成立一家专注于半导体设计和制造的公司。初创时期,公司面临着资金紧张、技术落后等重重困难,但李先生和团队坚持不懈,通过引进先进技术、加大研发投入,成功开发出了一款具有竞争力的半导体产品,为公司的发展奠定了基础。

Gennum ( Semtech )公司的发展小趣事
确保在断电的情况下进行电路操作,避免触电危险。
Coiltronics公司的发展小趣事

随着市场的不断扩大,Coiltronics公司意识到单凭自身的力量难以满足日益增长的市场需求。于是,公司开始积极寻求与其他企业的战略合作。通过与知名电子设备制造商建立合作关系,Coiltronics成功将其线圈技术应用于更广泛的领域,进一步提升了市场份额。同时,这种合作也带来了双方在技术研发、市场推广等方面的深入交流,为公司的长远发展奠定了坚实基础。

广州盛炬(GZSJ)公司的发展小趣事

随着市场的不断扩大,Coiltronics公司意识到单凭自身的力量难以满足日益增长的市场需求。于是,公司开始积极寻求与其他企业的战略合作。通过与知名电子设备制造商建立合作关系,Coiltronics成功将其线圈技术应用于更广泛的领域,进一步提升了市场份额。同时,这种合作也带来了双方在技术研发、市场推广等方面的深入交流,为公司的长远发展奠定了坚实基础。

Cavium Networks公司的发展小趣事

作为一家在电子行业具有影响力的公司,Cavium Networks 始终保持着持续创新的精神。公司不断投入研发资源,推出了一系列具有创新性和领先性的产品和技术。同时,Cavium Networks 也积极参与国际标准和行业规范的制定工作,为电子行业的健康发展贡献了自己的力量。正是这种不断创新和追求卓越的精神,使得 Cavium Networks 在电子行业中保持了领先地位,并引领着行业的未来发展。

以上五个故事虽然基于虚构,但它们都紧密围绕 Cavium Networks 在电子行业中的发展历程和关键事件展开,展示了公司在技术创新、市场拓展和合作发展等方面的努力和成就。这些故事旨在展现 Cavium Networks 的发展轨迹和行业影响力,同时也反映了电子行业的快速发展和变革。

问答坊 | AI 解惑

SAE各汽车协议和标准的简介

1905年初,美国汽车工程师学会(SAE)认识到必须标准化。那个年代的汽车制造商都是小公司,从供应商购买零部件,然后组装成整车。当遍及全国的独立经销商销售各种车辆时,车辆需要经常维修。如果不返回汽车或零部件的原制造厂,就很难找到合适的配件,因此, ...…

查看全部问答>

ddraw 缩放的问题

   我在程序中创建了一个主表面,因为不能为独占模式,所以采用用覆盖页面over lay的方式来显示图片。因此创建了带一个缓冲的覆盖页面。基本想法是把yuyv格式的图片copy到其中一个覆盖页面,然后再blt到另一个覆盖页面,最后显示出来,实 ...…

查看全部问答>

程序跑飞,系统死机

我的系统基于linux基础加了自己的LCD,触摸屏等驱动,现在这套系统在一套板子上跑的好好的,在另外一套板子上跑2分钟后,系统就瘫痪了,死机了,只好重新上电重启。这第二套板子和第一套在LCD、触摸屏等部分一样,只是第二套在第一套的基础上稍微改 ...…

查看全部问答>

寻broadcom无线AP固件外包开发

硬件线路由我方负责。 现寻高手完成固件开发,AP完成常规功能即可,另要求有 GPIO读写功能,自定义网络数据包函数。详细要求请与我联络  leo@aviosys.com …

查看全部问答>

很有型的摇摆闹钟

这款好似不倒翁一样的摇摆闹钟,设计的精妙之处完全在它的那根天线棒上:通过点触天线尖端,您可以设置闹钟的时间;转动天线棒可以打开或关闭闹铃功能。除此之外,它的妙用还在于当闹铃响起时,如果您还想多睡一会,可以拨动天线棒,使闹钟像不倒翁 ...…

查看全部问答>

老师们帮忙分析一下实验现象【LM3S】

PE7、PE6都悬空:结果如下 PE7接地(电源地)、PE6悬空:结果如下 PE7接地(与手相连)、PE6悬空:结果见附件 怎么PE6和PE7还相互影响呢? [ 本帖最后由 喜鹊王子 于 2012-3-23 09:44 编辑 ]…

查看全部问答>

全波精密整流后加一个运放分析求解

如图: 问题如下: 1、全波精密整流后U5B的的输出脚不加电容0.47uF为馒头波,加了电容,波形变平,C1的作用是为滤波,请问这里是怎么算出来的? 2、U5B出来的信号接至U7,U7由2个1N4148和一个电容组成,这个运放是干什么用的? 请指 ...…

查看全部问答>

CBB电容会烧毁,基本上炸开了,怎么回事? 请高手指点.

最近做一个DC-DC的电源,在调试的时候出现0.22uF的CBB电容会烧毁,基本上炸开了,怎么回事? 请高手指点.…

查看全部问答>

定时器中断复位问题

       最近在使用msp430f5529时候发现在TA0应用UP MODE,选用ACLK(32.768Khz)或者是将SMCLK分频32次,使能TAIE之后将会出现单片机不停复位状况,在选用SMCLK分频系数小的时候就不会有复位情况。分析得出是因为使能TAIE产生T ...…

查看全部问答>

一个C文件的全局变量声明问题

最近人前几天在头问件上折腾了好久,主要是头文件里面的 嵌套问题,  后来曲线救国了。 现在问题是: 一个key.c文件中有些函数,这些函数有一个在key.c中的全局变量i。但这些函数在key.h中声明,在main.c中被调用,但全局变量i定义 ...…

查看全部问答>