描述:
这两天在看uds方面的资料,其中要求将flash drive 下载到ram中运行,这个我在dsp 28xx系列上看到过,可以进行程序搬移且在ram中运行。
在其他单片机中,我觉得有的没办法做到。ti dsp采用的是统一编址方式,而如果单片机采用的是独立编址,即程序代码空间和数据代码空间不能互相访问,则程序没办法在ram中运行,
个人觉得pc指针应指向的是程序空间,又由于是独立编址,所以不可能跳转到ram区空间来执行ram区中的代码。
如果需要在ram中运行程序代码,需要是哈佛结构统一编址或者冯.诺依曼结构。
这是个人的一些理解,看看对不对,请大家指点。
解决方案1:
首先,单片机种类很多,结构也不一定只有哈佛的,楼主说的单片机估计是51系列。大部分标准结构的单片机都可以在RAM中运行程序,主要取决于该部分存储器是否可以被程序总线寻址
其次,即使是51单片机,由于程序存储器和数据存储器地址线公用,可以通过外部存储器共享地址空间达到在RAM中运行的目的。实际上早期(70~80年代)的开发系统就是这么做的
最后,主流单片机为了提高运行速度都可以在RAM中运行程序,例如ARM的CortexM系列,TI的2000系列,甚至用作通信协处理的变种51系列都可以在RAM中运行程序。
能不能在RAM中运行程序跟总线结构没有关系。
1、CPU能不能访问RAM中代码跟CPU的寻址能力有关。由PC指针决定
2、CPU能不能访问RAM中的数据同样跟寻址能力有关。由SP指针决定
既然由这两个指针决定,那就很明显可以看出,这个两个指针的指向是在程序编写好后,由编译器决定如何指向的。也就是说编译器决定了CPU能否实现在RAM中运行程序。这里涉及到了两个概念,加载时域/LOADTIME,运行时域/RUNTIME。
LOADTIME是指程序存放地址,RUNTIME是指程序运行地址。
以下为例:
ROM 地址为0到10000,RAM地址为10000到20000
MAIN程序增加编译选项,将其运行地址定义在10000,加载地址定义到0,
将MAIN程序烧录到加载地址,运行时出现如下情况:
如果MAIN程序没有搬到到运行地址中,那么跳转到MAIN时出现死机,因为RAM,10000处没有可执行的指令。