Code在程序运行时要不要拷贝到RAM里执行呢?
Keil编译ARM程序成功后,编译窗口显示:
Program Size: Code=7658 RO-data=314 RW-data=72 ZI-data=8504
我百度来的解释是:
Code为程序代码部分
RO-data 表示 程序定义的常量 const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
Code, RO-data, RW-data .............Flash
RW-data, ZIdata ....................RAM
(初始化时RW-data从Flash拷贝到RAM)
我想问:那么Code在程序运行时要不要拷贝到RAM里执行呢?还是直接从Flash中取程序指令执行?
[解决办法]
arm的话在分散装载配置文件里会有配置,关于code的地址,有两个设置,一个是存储地址(这个地址配置的是烧写器把代码段写到flashrom的何处),一个是装载运行地址,也就是你程序在什么地方运行,装载地址当然可以是flashrom(nor型的),所以你的程序是可以在flashrom里执行的。
当然如果系统时钟非常高,flashrom的读取速度不能满足,又或者你需要更新固件程序的话,那么你的程序就要在ram里运行,注意,把code从rom拷贝到ram里需要你手动写程序完成。
至于中断向量表的重定位就是另外的话题了,先说这么多。
建议lz google下arm的分散装载。
[解决办法]
2楼正确,KEIL的链接脚本是在Project->option for Target xxx->Linker下
如果选了Use Memory Layout from Target Dialog表示按Target表单下定义的存储设备来自动分配
这几个空间,keil会在工程目录下生成一个默认的.sct文件,如果没选,就需要在下面设置Scatter file。
关于Scatter file,Keil的帮助里讲的很详细。
建议楼主仔细看一下,网上也有中文的Keil帮助。
[解决办法]
至于程序是否要在RAM里执行,看的的需求了。在RAM里程序执行的更快。
如果是一般的嵌入式系统应用,如STM32和LPC2XXX,LPC1XXX系列,基本都带片内FLASH,和一个还算过的去的片内RAM.这样的芯片一般用作控制领域,而且芯片本身可以跑到72MHZ,因此一般情况下会将程序放在FLASH中直接执行,此时,不需要将程序和RO-DATA拷贝到RAM中,只是在程序启动时将RW区从加载地址拷贝到执行地址。
如果用的是keil的默认启动汇编程序,而且在汇编中跳转到__main去(此时C的入口是main函数,注意main标号和__main是不同的)。__main是keil的库函数中的一个标号地址,__main处的代码会将RW区从加载地址拷贝到执行地址,然后还会初始化堆等空间。最后跳到应用程序的main函数去。
如果有速度要求或需要擦写程序所在的FLASH时,就需要将程序拷贝到RAM中取执行了,此时需要在scatter文件中设置执行地址,keil同样会在__main中将代码拷贝到ram然后跳到RAM中的main地址去执行。
不过keil中__main中执行的拷贝操作有时候不正确,一般这种情况下可以考虑自己写执行上述功能的代码,完成后直接跳到main去执行。
[解决办法]
主流的ARM芯片大都需要使用操作系统,程序都比较大,程序都是在并行的SDRAM中运行。
一般的,程序下载到廉价的NANDFLASH中保存,上电复位后,再将程序从串行的NANDFLASH中,引导到并行的SDARAM中运行。
极少的情况,使用昂贵、大体积、并行的NORFLASH保存、并运行程序。
[解决办法]
具体情况具体分析,没办法具体说明你的程序是什么问题,这里只能给你个参考方向:
(1). Project->option for Target xxx->Utilities->Setting中的FLASH类型和参数是否设置对了
(2). 程序是否有问题,调试一下就知道了,也许你添加了新代码导致程序哪里发生错误了