共2条
1/1 1 跳转至页
问
用实验教程的时候,碰到问题。在这里向大家请教。
书中的开始的几个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)
}
}
书中的开始的几个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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |