我想这是一个很基础的问题
对于x86的pc机和单片机等嵌入式开发系统程序的存储是截然相反的,
即:x86的pc机cpu在运行的时候程序是存储在ram中的,
而单片机等嵌入式系统则是存于flash中
x86cpu和单片机读取程序的具体途径
pc机在运行程序的时候将程序从外存(硬盘)中,调入到ram中运行,cpu从ram中读取程序和数据
而单片机的程序则是固化在flash中,cpu运行时直接从flash中读取程序,从ram中读取数据
造成这种差别的具体原因分析
x86构架的cpu是基于冯诺依曼体系的,即数据和程序存储在一起,而且pc机的ram资源相当丰富,从几十m到几百m甚至是几个g,客观上能够承受大量的程序数据
单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内ram资源是相当有限的,内部的ram过大会带来成本的大幅度提高
单片机的程序能存储在ram中吗
通过上面的分析可得知:单片机的程序能存储于flash中是基于两点考虑,即体系结构和ram资源的多少因此,在技术不但进步片内ram容量不但增多的今天,ram资源已经不再是制约这种差别的主要因素,而对于体系机构我们只要更改cpu读取程序的方式就可以
我仔细研究了一下链接脚本,用的是gnu的linux的交叉工具链地址分配是写在一个ld脚本中的
他们是这样实现的:
1,将你需要在ram中运行的代码写在单独的一个c文件中,然后在脚本中设置其运行地址与存放地址分开设置好必要的代码起始和结束的标志变量
2,在代码中将存放地址处的代码拷贝到运行地址中
冯诺依曼体系与哈佛体系的区别
当然可以,只是编译器需要设置,中断向量表也需要设置。以MDK为例子,请看下面文档55章的串口IAP,选择里面有用的部分即可。
>
PC(x86)采用的是冯诺依曼结构,运行的时候即数据和程序都放在同一个存储器(ram)里,共用一条存储总线。具体 :当PC没电的时候,程序和数据存储在硬盘里,当pc上电的时候,在硬盘里运行的一段小程序把全部程序从硬盘搬运到ram中,然后程序开始在ram中运行;
而嵌入式系统(arm,dsp)采用的哈佛结构,运行的时候程序存储在flash中,数据存储在ram中,所以cpu从flash中取指令,到ram中取数据,指令总线和数据总线也是分开的;2者之所以采用不同的结构,主要因为PC的ram空间足够,而嵌入式的ram太小;
#include "defh"
#include "2410addrh"
#include "2410libh"
#define ARM_ADDR 0x30000000; /定义一个地址,应该是复位之后要跳转到的地址/
void (run)(void); / 一个指针函数 /
void ARM9init(void);
void (CopeFromFlashToRM(U32 FlashAddrU32 ArmAddr,U32 ul);
void copy(void);
void main(void)
{
run=(void()(void)) ARM_ADDR;/ 从ARM_ADDR开始执行,遇到return返回继续下面的函数 /
ARM9init(); / 调用函数 /
copy();
run();
}
CopyFromFlashToRAM(U32 pulFlashAddr,U32 pulArmAddr,U32 ul)
/ 将长度为ul 的内容从pulFlashAddr copy 到 pulArmAddr /
{
U32 pulSource=pulFlashAddr;/ 参数1的数值传递给变量 /
U32 pulDest=pulArmAddr;
U32 i;
ul/=4; / ul = ul/4,ul应该是要copy文件的长度 /
for(i=0;i<ul;i++) / 重复执行copy指令 /
{
pulDest++=pulSource++; / 源地址的内容copy到目的地址 /
}
} / CopyFromFlashToRAM 函数结束 /
copy(void)
{
U32 p1;
U32 p2;
p1=(U32 )0x00200000; / flash 地址/
p2=(U32 )0x30000000; / RAM 地址/
CopyFromFlashRAM(p1,p2,0x20000); / 将长度为0x20000 的内容从p1 copy 到 p2 /
}
我一直在想这个问题,既然可以搬运一部分代码到RAM中运行,那就可以把所有的搬运过去,但是这样又会出现另外一个问题,就是一般的FLASH 存储空间比RAM大,所以不可能完全全部拷贝过去,所以我一直在想一种可能,是不是我们可以分时的把FLASH里的程序往RAM里调。以前TI的一个应用工程师说可以,但是在我们公司没调试出来,那时候我对DSP处于朦胧状态,现在也一直想知道这个是否能实现,不过我们一般的程序,就部分关键的地方运行在RAM里就足够了!
以上就是关于cpu运行时程序是在flash中还是在RAM呢全部的内容,包括:cpu运行时程序是在flash中还是在RAM呢、STM32能实现将FLASH里的程序搬到 RAM中运行吗、讨论:程序是运行在flash中还是Ram中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)