共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
汽车+汽车电子电阻解释与分析被打赏5分 | |
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 |