wzz24 发表于 2014-11-18 16:35:41

请教程序分段(section)的问题

在ok6410上,程序在lds文件里面指定了分段,如下:
mmu.lds:

SECTIONS {
first    0 : { head.o init.o }
second    3072 : AT(2048) { leds.o }
}
---------------------------
head.S:
   
.text
.global _start
_start:

ldr r0, =0x70000013       
mcr p15, 0, r0, c15, c2, 4

ldr sp, =8192                     
bldisable_watch_dog                                       
////////        blcopy_2048_to_3072            
////////        ldr pc, =2048
////////        ldr pc, =3072

bl main

halt_loop:
    b   halt_loop
---------------------------
init.c:

void copy_2048_to_3072(void)
{
unsigned int *pdwSrc= (unsigned int *)2048;
unsigned int *pdwDest = (unsigned int *)3072;       
   
while(pdwSrc < (unsigned int *)(2048+512))       
{
*pdwDest = *pdwSrc;
      pdwDest++;
      pdwSrc++;
}
}
---------------------------
leds.c:

int main()
{
volatile unsigned int k;
volatile unsigned int i,j;      
    GPMCON = 0x11111;
    GPMDAT = 0x00000000;

    while(1)
    {
            for(k=0;k<4;k++)
            {
                GPMDAT=~(1<<k);
for(i=0;i<20000;i++)
                    for(j=0;j<3;j++)
                    ;
            }
    }
return 0;
}
---------------------------

main函数在leds.c里面,用来点亮led   

程序烧到板子led不亮,是从nand flash-steppingstone启动的

然后我把head.S的bl main 改成 ldr pc, =2048试试,因为第二段代码存储在镜像2048的位置,但还是不亮

接着把head.S的bl main 改成 ldr pc, =3072试试,因为第二段代码在3072位置运行,但还是不亮

最后加上 blcopy_2048_to_3072,把2048处的代码拷贝到运行地址3072,bl main 改成 ldr pc, =3072,还是不亮

相同的程序,我不用分段,在makefile里面用
arm-linux-ld -Ttext 0x50000000 -o mmu_elf $^
连接后编译的程序,led可以点亮,说明main点亮函数是没有问题的。

现在能试的都试了,不知道为什么程序分段后,就不好用了,麻烦各位大神帮看看,十分感谢!
页: [1]
查看完整版本: 请教程序分段(section)的问题