S5PV210的IRAM应用

准备分析
 

        IRAM的大小96k,其实前两个程序都在这里运行的,程序都小于16K。要实现的是从把IRAM从的前16k从IRAM的起始地址0xD0020000拷贝到0xD0024000 处,调用main。堆栈指针设置到了0xD003_7D80处。程序的链接地址是0xD0024010.用图表示如下。本程序只涉及到IRAM,重点为在于重定向。

        
 
资源工具

        同《 S5PV210的LED应用(一)
 
着手写程序
        start.S中的代码拷贝很重要,Makefile中的链接地址很重要。
[cpp] view plaincopy
 
  1. @******************************************************************************  
  2. @ File:start.S  
  3. @ 功能:启动代码,设置栈,拷贝16k到0xd0020000处  
  4. @******************************************************************************    
  5.   
  6. .text  
  7.   
  8. .global _start  
  9.   
  10. _start:  
  11.       
  12.     ldr sp, =0xD0037D80       @ 设置栈,以便调用c函数                       
  13.       
  14.     adr r0, _start                @ 重定位   
  15.                             @ _start当前所位于的地址:0xd0020010 (前边放有16bit的头信息)  
  16.       
  17.     ldr r1, =_start           @ _start的链接地址:0xd0024010    
  18.       
  19.     ldr r2, =0xd0028000       @ 0xd0028000 = 0xd0024000 + 0x4000(16k)   
  20.     cmp r0, r1  
  21.     beq run_on_dram  
  22.       
  23. copy_loop:  
  24.     ldr r0, =0xd0020000       @ 源 起始地址  
  25.     ldr r1, =0xd0024000       @ 目的 起始地址  
  26. 1:    
  27.     ldr r3, [r0], #4          @ 源  
  28.     str r3, [r1], #4          @ 目的  
  29.     cmp r1, r2  
  30.     bne 1b  
  31.   
  32.       
  33. run_on_dram:               
  34.     ldr pc, =main             @ 跳转        
  35.   
  36.   
  37. halt:  
  38.     b halt  
[cpp] view plaincopy
 
  1. /******************************************************************************/  
  2. /* File:main.c 
  3. /* 功能:LED闪烁 
  4. /******************************************************************************/   
  5.   
  6. #define     GPJ2CON     (*(volatile unsigned long *) 0xE0200280)  
  7. #define     GPJ2DAT     (*(volatile unsigned long *) 0xE0200284)  
  8.   
  9. // 延时函数  
  10. void delay(unsigned long count)  
  11. {  
  12.     volatile unsigned long i = count;  
  13.     while (i--)  
  14.         ;  
  15. }  
  16.   
  17. void main()             //LED 闪烁  
  18. {  
  19.     GPJ2CON = 0x00001111;       // 配置引脚  
  20.     while(1)                    // 闪烁  
  21.     {  
  22.         GPJ2DAT = 0;            // LED on  
  23.         delay(0x100000);  
  24.         GPJ2DAT = 0xf;          // LED off  
  25.         delay(0x100000);  
  26.     }  
  27. }  

Makefile:

[plain] view plaincopy
 
  1. link.bin: start.o main.o   
  2.     arm-linux-ld -Ttext 0xD0024010 -o link.elf $^  
  3.     arm-linux-objcopy -O binary link.elf link.bin  
  4.     arm-linux-objdump -D link.elf > link_elf.dis  
  5.     gcc mkv210_image.c -o mkv210  
  6.     ./mkv210 link.bin 210.bin  
  7.   
  8. %.o : %.S  
  9.     arm-linux-gcc -o $@ $< -c   
  10.   
  11. %.o : %.c  
  12.     arm-linux-gcc -o $@ $< -c   
  13.   
  14. clean:  
  15.     rm *.o *.elf *.bin *.dis mkv210 -f  
下载运行
 
        同《 S5PV210的LED应用(一)
 
运行调试
       
        程序简单,运行正常。
 
遗留问题
  
        1.无
 
 
原文:http://blog.csdn.net/kangear/article/details/8993247
原文地址:https://www.cnblogs.com/Ph-one/p/4747395.html