韦东山Linux嵌入式课程社区
直播中

h1654155275.5998

7年用户 174经验值
私信 关注

QQ2440简单裸核程序运行

花了半天时间,研究怎样在QQ2440上跑裸核程序,针对在NAND FLASH运行和RAM运行.

        开发环境:
        1: RED HAT 9 Linux
        2: QQ2440开发板
        3: 嵌入式应用开发完全手册

        针对NAND FLASH运行的源代码
        startup.s

        .text
        .global _start
        _start:
                 LDR R0,=0x53000000
                MOV R1,#0x00
                STR R1,[R0]

               LDR SP,=1024*4
               BL  main
        HALT_LOOP:
               B HALT_LOOP

        led_c.c

        #define  GPBCON (*(volatile unsigned long *)0x56000010)
        #define  GPBDAT (*(volatile unsigned long *)0x56000014)
        int main(void)
        {
               long i,j;
               GPBCON = 0x00000400;
               GPBDAT = 0x00;

               while(1)
               {
                       GPBDAT ^= (1<<5);  
  
                       for(i=0;i<50;i++)
                       {
                                for(j=0;j<5000;j++);
                       }
                }
               return 0;
         }

         makefile

         led_c.dis:led_c_elf
                       ARM-linux-objdump -D -m arm led_c_elf > led_on.dis
                       arm-linux-objcopy -O binary -S led_c_elf led_c.bin
         led_c_elf:startup.o led_c.o
                       arm-linux-ld -Ttext 0x00000000 -g startup.o led_c.o -o led_c_elf
         led_c.o:led_c.c
                       arm-linux-gcc -g -c -o led_c.o led_c.c
         startup.o:startup.s
                       arm-linux-gcc -g -c -o startup.o startup.s
        clean:
                       rm -f *.o led_c_elf led_c.bin led_c.dis

         其中,通过startup.s中LDR SP,=1024*4语句把栈地址设置好,并且通过makefile中的arm-linux-ld -Ttext 0x00000000 -g startup.o led_c.o -o led_c_elf在编译的时候指定程序地址,因为我用的笔记本没有并口,所以我实用NOR FLASH启动,通过NOR的VIVI把程序下载NAND的0x00地址,使用VIVI下载选项.

        针对RAM运行的源代码
        startup.s

        .text
        .global _start
        _start:
                 LDR R0,=0x53000000
                MOV R1,#0x00
                STR R1,[R0]

               LDR SP,=0x40001000
               BL  main
        HALT_LOOP:
               B HALT_LOOP

        led_c.c

        #define  GPBCON (*(volatile unsigned long *)0x56000010)
        #define  GPBDAT (*(volatile unsigned long *)0x56000014)
        int main(void)
        {
               long i,j;
               GPBCON = 0x00000400;
               GPBDAT = 0x00;

               while(1)
               {
                       GPBDAT ^= (1<<5);  
  
                       for(i=0;i<50;i++)
                       {
                                for(j=0;j<5000;j++);
                       }
                }
               return 0;
         }

         makefile

         led_c.dis:led_c_elf
                       arm-linux-objdump -D -m arm led_c_elf > led_on.dis
                       arm-linux-objcopy -O binary -S led_c_elf led_c.bin
         led_c_elf:startup.o led_c.o
                       arm-linux-ld -Ttext 0x30000000 -g startup.o led_c.o -o led_c_elf
         led_c.o:led_c.c
                       arm-linux-gcc -g -c -o led_c.o led_c.c
         startup.o:startup.s
                       arm-linux-gcc -g -c -o startup.o startup.s
        clean:
                       rm -f *.o led_c_elf led_c.bin led_c.dis

         其中,通过startup.s中LDR SP,=0x40001000语句把栈地址设置好,其中0x40001000只是栈指针地址,也可以设置在别的内存地址,只要不是代码段就可以,并且通过makefile中的arm-linux-ld -Ttext 0x30000000 -g startup.o led_c.o -o led_c_elf在编译的时候指定程序地址,因为我用的笔记本没有并口,所以我实用RAM启动,通过NOR的VIVI把程序下载RAM地址,使用DOWNLOAD & RUN下载选项.

         我是新手,虽说很简单,但也向作者请教了好久,在此说给大家看看,不知道是否也有人需要.

回帖(13)

袁钧质

2019-5-24 09:12:28
很好的方法:strong:
举报

李建平

2019-5-24 09:28:39
LDR SP,=0x40001000
QQ2440中SDRAM的地址范围是:0x30000000--0x33FFFFFF
怎么把SP放到0x40001000去了呢?
举报

朱艳丽

2019-5-24 09:39:08
从NOR Flash启动的话,内部的4K RAM地址是0x40000000~0x40001000
举报

孙海燕

2019-5-24 09:52:30
明白了,Thanks
举报

更多回帖

发帖
×
20
完善资料,
赚取积分