这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 关于简单启动代码的问题

共2条 1/1 1 跳转至

关于简单启动代码的问题

院士
2006-09-17 18:14:16     打赏
关于简单启动代码的问题



关键词: 关于     简单     启动     代码     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 用实验教程的时候,碰到问题。在这里向大家请教。
书中的开始的几个C语言的例子中,都有简单的启动代码,启动很长一部分是完成RW的数据从载入区向执行区的转移,以及ZI部分的清零。当然此时的设置没有用到分散加载文件,只是使用的了简单的RO RW命令行。
看到后面的TCP实验,这时看启动代码(startup.s),关于转移和清零的部分没有找到。在软件仿真的过程中,执行到 B _Main的时候会出现反汇编窗口,请问窗口中的程序是不是就是用来完成这个功能的?这段代码的源文件在哪里?谢谢
1: answer使用_main,编译时自动会加上初始化应用环境的代码,如果不用_main,则须自行加上. 2: 问题在ARM公司的应用文档(application note 48  scatter loading)中看到,不管时连接器还是C语言的库函数都不会将载入区的数据移动到执行区,或者创建一个初始值为0的区域。你必须自己做这些事。所以对你讲的东西还有不少疑惑,能否给深入讲一下。
网上有很多提到将程序复制到ram中执行,会加快速度,我也想这样做。现在使用的是周立功的模板(LPC22100,片外flash 片外ram),代码在flash中运行。想通过分散加载文件来实现代码从flash到ram的转移。
网上讲的是三星的ARM,它的ROM和RAM可以重新映射,相互交换地址一样。把程序下载到ROM中,在ROM中执行一段程序,完成代码和数据从ROM到RAM的拷贝,然后重新映射一下,就可以从RAM中读取代码执行了。LPC2210好像没有这个功能。
以上讲得不知可对,还请多多指教。
3: RE我做过一次的,也是用LPC2210,程序在片外FLASH。主要是使用了分散加载来实现的。定义一个PI类型的加载区(首地址已知),然后在这个区定义它的执行区,首地址就是RAM里面运行的地址。程序里面需要有copy代码,copy完了就跳到RAM执行区首地址开始运行,当然加载文件中要用(+FIRST)把主函数定义到最开始的地方。 4: 能否具体一点,谢谢! 5: RE程序:
RAMSTRADDR    EQU    0x40001000
ROMSTRADDR    EQU    0x80007000
RamRouteLen    EQU    0x00001000
RETURNADDR    EQU    0x80001000

         AREA    BOOTLOADER,CODE,READONLY
BootLoader
        LDR        R0,=ROMSTRADDR
        LDR        R1,=RAMSTRADDR
        LDR        R2,=RamRouteLen
LoadLoop        
        LDR        R3,[R0],#4
        STR        R3,[R1],#4
        SUBS    R2,R2,#4
        BNE        LoadLoop
        LDR        LR,=RETURNADDR
        LDR        PC,=RAMSTRADDR

分散加载:
ROM_LOAD2      0x80007000 PI 0x1000
{
    ROM2_EXEC 0x40001000 0x1000
    {
        UartLoad.o(MainMenu,+First)
        UartLoad.o(+RO)
        MyFile.o(+RO)
        rt_memcpy_w.o(+RO)
    }
}

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]