历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | 2440裸板程序之代码重定位

2019-04-26 来源:eefocus

LED对应的引脚是GPF4、GPF5、GPF6。 

使用的编译器为arm-linux-gcc-4.5.1。 

包括四个文件head.S main.c main.lds Makefile。


实验目的:将main.c中点灯程序从存放地址0x400重新加载到0x800,并跳到0x800执行。 

涉及到地址无关码、伪指令等概念。还有编译器链接脚本中存放地址、运行地址等概念。


对于2440,有两种存放数据的介质,NOR、NAND。其中NOR是内存接口,可以执行代码,但只读不能写入。NAND只能读,如果开关拨到NAND启动,2440会硬件把NAND开头的4K搬运到可执行、可读写的SRAM中。我们利用这4K的来做重定位的实验。对于不同启动方式时,内存是如何分布的可以看2440用户手册。



这里写图片描述

head.S


.text

.global _start

_start:

            ldr     r0, =0x53000000     @Close WATCHDOG

            mov     r1, #0x0                     

            str     r1, [r0]


            mov     r1,#0x400           @relacate

            mov     r2,#0x800

            mov     r3,#0x600

1:

            ldr     r4,[r1],#4

            str     r4,[r2],#4

            cmp     r1,r3

            bne     1b


            ldr     sp, =1024*4         @Call C

            ldr     lr,=loop


            bl      main

            @ldr            pc,=main            @0x800

loop:

            b       loop


main.c


#define GPFCON          (*(volatile unsigned long *)0x56000050)

#define GPFDAT          (*(volatile unsigned long *)0x56000054)


#define GPF4_out        (1<<(4*2))

#define GPF5_out        (1<<(5*2))

#define GPF6_out        (1<<(6*2))

#define GPF7_out        (1<<(7*2))


void  wait(volatile unsigned long dly)

{

        for(; dly > 0; dly--);

}


int main(void)

{

        unsigned long i = 0;


        GPFCON = GPF4_out|GPF5_out|GPF6_out;            //Configure the gpio of led  


        while(1){

                wait(30000);

                GPFDAT = (~(i<<4));                     //Turn 

                if(++i == 8)

                        i = 0;

        }


        return 0;

}



main.lds


SECTIONS {

        . = 0x0;

        first  0x00000000 : { head.o }

        second 0x800      : AT(0x400){ main.o }


PS: 

0x800是运行地址,程序链接时会假定为这个地址。 

0x400是程序实际存放地址,我们需要把main.o从0x400搬运到0x800才能执行。 

这里写图片描述


Makefile


objs =  head.o main.o

all: $(objs)

        arm-linux-ld -T main.lds $^ -o main.elf

        arm-linux-objcopy -O binary -S main.elf main.bin

        arm-linux-objdump -D main.elf > main.dis

clean:

        rm -f *.bin $(objs) *.elf *.dis

%.o : %.c

        arm-linux-gcc -march=armv4 -c -o $@ $<

%.o : %.S

        arm-linux-gcc -march=armv4 -c -o $@ $<


推荐阅读

史海拾趣

Geo Semiconductor Inc公司的发展小趣事
采用更合理的电路布局和元件选型,减少因设计不当导致的故障。
成都振芯/国腾(CORPRO)公司的发展小趣事

在北斗卫星导航系统的发展过程中,CORPRO始终扮演着重要角色。作为北斗终端的最大供应商之一,CORPRO通过不懈的技术研发和产品迭代,成功实现了北斗设备零部件的国产化。同时,公司还构建了“元器件-终端-系统及运营”的完整产业链,在高性能集成电路板块取得了显著成就。此外,CORPRO还是首批承担“核高基”核心电子器件项目企业中唯一的一家民营企业,体现了其在电子行业的领先地位和创新能力。

AXTAL公司的发展小趣事

创新是AXTAL公司不断发展的动力源泉。公司注重研发投入,持续推出具有竞争力的新产品和技术。同时,AXTAL还积极与高校、科研机构等合作,共同开展前沿技术的研发和应用。这些创新举措不仅提升了公司的技术实力和市场竞争力,也为整个电子行业的发展注入了新的活力。

这五个故事只是AXTAL公司发展起来历程中的一部分。它们从不同的角度展示了公司在创立、技术与品质追求、全球布局、应对市场挑战以及持续创新等方面所取得的成就和进步。未来,随着电子行业的不断发展和变革,相信AXTAL公司将继续保持其领先地位,为行业的进步和发展做出更大的贡献。

BOSER公司的发展小趣事

在国内市场取得一定成绩后,BOSER公司开始积极寻求海外市场的扩张。公司加强与国际知名企业的合作,通过参加国际展览、举办技术研讨会等方式,不断提升品牌知名度和影响力。同时,BOSER还针对不同国家和地区的市场需求,推出定制化的产品和服务,成功打开了多个海外市场。

Amptek Inc公司的发展小趣事

随着科技的不断发展,BOSER公司意识到只有不断创新才能在激烈的竞争中立于不败之地。因此,公司投入大量研发资源,致力于开发具有自主知识产权的新技术。经过不懈努力,BOSER成功推出了一系列创新产品,引领了电子行业的技术发展潮流。

COMPUTAR公司的发展小趣事

COMPUTAR公司的前身是日本CBC株式会社,成立于1925年,总部设立在繁华的东京。自创立之初,CBC便致力于光学技术的研究与应用,为后续的镜头制造奠定了坚实的基础。在随后的几十年里,CBC不断积累技术经验,逐步在光学领域建立起自己的声誉。

问答坊 | AI 解惑

C64X DSP EDMA小结及实例详解(ZZ)

C64X DSP EDMA小结 (1)EDMA概要          ①EDMA数据传输有两种发起方式:          CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1 ...…

查看全部问答>

C51键盘程序

各位有知道   键盘程序中  if ((P1&0xf0)!=0xf0)        ;scancode = 0xfe;                         while((scancode&0x10)!=0)  & ...…

查看全部问答>

关于串口的一个小问题

#include #define uchar unsigned  char #define uint  unsigned  int unsigned char a        ,flag,i; void init() {    TMOD=0X20;    TH1=0XFD;     ...…

查看全部问答>

关于在程序中实现GPRS猫TCPip协议

最近因为工作需要,要开发一个多口GPRS猫发送彩信的工作。 在这里请教搞过相关开发的大侠,可以考虑酬金问题邮件地址199184796@qq.com 实现内容: 在软件中实现ppp拨号连接 本人已经完成mms的内容所有主要是关于如何实现TCPIP协议…

查看全部问答>

YLP2440为何复位不了?

各位大侠,本人菜鸟一枚,我昨天烧了一个程序之后,就复位不了,原来的显示屏只亮白屏,不显示,各各位大侠,请问怎么回事啊?不能刚开始就被我弄坏了吧?…

查看全部问答>

I2C怎么连续写

 为什么连续写不进去AT2402呢?大家帮忙看看吧 !谢谢了#include<reg52.h> #include<intrins.h> sbit SCL=P3^0; sbit SDA=P3^1; char tmp,i,*ap; char code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x6 ...…

查看全部问答>

PCIe DMA、Nand Flash、DRAM、RocketIO/SRIO、SERDES

NAND FLASH Controller IP Core标准NAND FLASH Controller标准NAND FLASH控制器 我是一位在职者(北京),专业从事FPGA接口设计,有较多的空余时间,对FPGA有比较丰富的项目经验(6年)。熟练使用Xilinx/Altera FPGA,熟悉NAND FLASH接口时序 ...…

查看全部问答>

MSP430寄存器如何记

我们知道一款功能强大的单片机会有众多的寄存器来操作这些强大的外设和内部设备,430也是如此,因为强大所以内部结构复杂,所以TI给每个外设起名字的时候已经考虑到这些问题了,实际上所有的单片机设计商都在头文件里给寄存器起了易于记忆的名字, ...…

查看全部问答>

提问+TI无线手表大家都怎么用?

TI无线手表大家都怎么用? 是不是出去运动的时候用用,还有他的时间怎么设置!现在无线智能手表越来越多,TI的这个你应用了没? …

查看全部问答>