• 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
  • 相关阅读:
    Linux文件误删除恢复操作【转】
    segment fault异常及常见定位手段【转】
    Linux AUFS 文件系统【转】
    Linux MTD系统剖析【转】
    Linux UBI子系统设计初探【转】
    python笔记54-re正则匹配替换字符串(sub和subn)
    python笔记53-Leetcode面试题:请实现一个函数,把字符串 s 中的每个空格替换成"%20"
    咏南中间件支持客户端控制数据库事务
    mormot2 tbsonwriter
    firedac获取自增长字段值
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4747395.html
Copyright © 2020-2023  润新知