主题 : 【求助】2440上的逻辑程序,编译无异常,下到开发板不能正常运行 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 123748
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2016-03-24
最后登录: 2016-04-01
楼主  发表于: 2016-03-24 13:12

 【求助】2440上的逻辑程序,编译无异常,下到开发板不能正常运行

程序是使用在S3C2440上运行的,使用的是韦东山的书配套的JZ2440开发板

Makefile:
sdram.bin:   sdram.s     GPIO_LED.c
        arm-linux-gcc  -c  -o  sdram.o sdram.s
        arm-linux-gcc  -c  -o  GPIO_LED.o GPIO_LED.c
        arm-linux-ld   -Ttext 0x30000000 sdram.o GPIO_LED.o -o sdram_elf
        arm-linux-objcopy -O binary -S sdram_elf sdram.bin
        arm-linux-objdump -D -m arm sdram_elf > sdram.dis

clean:
        rm -f  *.dis sdram.bin sdram_elf  *.o  *~


sdram.s

.text
.global _start
_start:
        ldr  sp, =4096
        bl   disable_watchdog                    //关看门狗
        bl   sdram_setup                             //初始化片外内存
        bl   nandcopy2sdram                     //将片内内存里的东西拷贝到片外内存
        ldr  pc, =sdram                                //跳转到片外内存
sdram:        ldr  sp, =0x34000000
        bl   main
        
halt_loop:
        b   halt_loop

帖子长度貌似有限制,在回帖里接着写
[ 此帖被duhan666在2016-03-24 13:36重新编辑 ]
级别: 新手上路
UID: 123748
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2016-03-24
最后登录: 2016-04-01
1楼  发表于: 2016-03-24 13:23
GPIO_LED.c                                               //点亮开发板上的LED灯
#define        GPFCON           (*(volatile unsigned long *)0x56000050)
#define        GPFDAT           (*(volatile unsigned long *)0x56000054)
#define        WDCON           (*(unsigned long*)0x53000000)
#define        SDRAMCON      0x48000000
#define        GPF4_out        (1<<(4*2))
#define        GPF5_out        (1<<(5*2))
#define        GPF6_out        (1<<(6*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;                // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出
        while(1){
                wait(30000);
                GPFDAT = (~(i<<4));                 // 根据i的值,点亮LED1,2,4
                if(++i == 8)
                        i = 0;
        }
        return 0;
}

void disable_watchdog()
{
        WDCON  =  0 ;      //禁用watchdog
}

void sdram_setup()
{
        unsigned long const sdramfig[] = {
                0x22011110,
                0x00000700,
                0x00000700,
                0x00000700,
                0x00000700,
                0x00000700,
                0x00000700,
                0x00018005,
                0x00018005,
                0x008c07a3,
                0x000000b1,
                0x00000030,
                0x00000030,
        };
        int i = 0;
        volatile unsigned long *p  =  (volatile unsigned long *) SDRAMCON;
        for(;i<13;i++)
        {
                p= sdramfig;
        }
}

void nandcopy2sdram()
{
        volatile unsigned long *p = (volatile unsigned long *) 0x0;
        volatile unsigned long *q = (volatile unsigned long *) 0x30000000;
        int i = 0;
        for(;i<4096;i++)
                q = p;
}


如果我将程序中的sdram_setup换成汇编语言的代码,就能正常运行。
汇编版本的sdram_set程序如下:
.equ       mem_ctl_base    0x48000000
sdram_setup:
    ldr   r1,  =mem_ctl_base      @mov   r1,  #mem_ctl_base
    adr   r2,  mem_cfg_val       @adrl  r2,  mem_cfg_val
    add   r3,  r1, #52
    
1:
    ldr   r4,  [r2],#4
    str   r4,  [r1],#4
    cmp   r1,  r3
    bne   1b
    mov   pc,  lr

.align  4
mem_cfg_val:
        .long 0x22011110             @BWCOM
        .long 0x00000700             @BANKCON0
        .long 0x00000700             @BANKCON1
        .long 0x00000700             @BANKCON2
        .long 0x00000700             @BANKCON3
        .long 0x00000700             @BANKCON4
        .long 0x00000700             @BANKCON5
        .long 0x00018005             @BANKCON6
        .long 0x00018005             @BANKCON7
        .long 0x008c07a3             @BANKCON5
        .long 0x000000b1             @BANKSIZE
        .long 0x00000030             @MRSRB6
        .long 0x00000030             @MRSRB6

实在不知道是哪里出的问题,请大侠不吝赐教!!!
[ 此帖被duhan666在2016-03-24 22:43重新编辑 ]