stm32中的Code在程序运行时要不要拷贝到RAM里执行呢?还是直接从Flash中取程序指令执行?
不是nand flash不能运行程序吗?难道32里用的是nor flash?

STM32的flash是代码存储区。SRAM是程序运行过程中中间变量存储区。

参考这边博文:https://blog.csdn.net/zd845101500/article/details/91370939

以下内容摘自论坛帖子https://bbs.csdn.net/topics/392020439 /****************************************************************************/ 如果你有研究过单片机编程的分散加载机制,在编程中写过分散加载脚本。你问的第一个问题就解决了。 如果你有写过nand flash的驱动程序,你问的第二个问题就解决了。

STM32中的code可以不用拷贝到RAM中运行,也可拷贝到RAM中运行,这些不是技术问题,而是要看这段code有没有加载到RAM中运行的必要。后面再解释。

nand flash不支持片上执行,不能在nand flash中执行程序,但nor flash支持。 但不能因此就断定STM32用的外置flash都是nor的。只要STM32带nand flash的控制器,就可以把nand中的code加载到RAM中运行。至于能不能用IO模拟nand 的接口协议,我没搞过不清楚。

首先,应该所有的单片机都是片内集成RAM和ROM(在加载域和运行域的角度看,Flash就是ROM)。 一般容量小的单片机,RAM和ROM都小,不会把flash中的代码加载到RAM中。 但有时确实需要加载,怎么办呢。就把code中比较关键的,调用很频繁的,对响应速度有要求的,就会加载到RAM中。 例如高频率中断的定时器中断ISR,就可以在分散加载脚本中修改这段code的运行域到RAM中。程序在刚上电后会在main函数之前加载这段code到RAM中。这样做的好处就是,这段code的执行速度快,我们知道ROM和RAM执行代码的速度比差距是很大的。RAM比ROM中执行速度快得多! 当然,如果你的RAM很大,你甚至可以把全部的Code加载到RAM中运行。

nand flash不是直接接到CPU的三总线上的,所以CPU不能直接从nand中取得可执行的指令,而是通过nand的控制器! 而nor是在总线上的,所以nor中的code可以直接执行。(nor的这个观点仅是我个人看法,仅供参考)。

再说外置RAM的问题,单片机在带SDRAM的控制器之后,就可以支持SDRAM了。 SDRAM在初始化好之后,SDRAM的使用方法和内置的SRAM没有差别。

如果你的单片机支持SDRAM和Nand flash,你可以把nand flash中的code加载到SDRAM中运行。 如果你知道怎么写分散加载脚本,这个功能分分钟就能实现。 /****************************************************************************/

/**************************************************************************** 一般容量小的单片机,RAM和ROM都小,不会把flash中的代码加载到RAM中。 请教一下大神,如果是代码中的全局变量,静态变量,也不会把flash中的代码加载到RAM中吗,那如果需要修改这些变量,flash中可以直接修改吗,另外感觉大神这一块研究很深,但是还是没给出答案,stm32内部既不是nor flash,也不是nandflash吗,最近我也是在用这个突然想到的,我觉得应该算是nor flash,因为总线可以直接访问到,我的一点疑惑 和大神探讨一下 ****************************************************************************/

/****************************************************************************/ 其实我也不是大神,真正的大神似乎都很少来论坛。。。。。。

“一般容量小的单片机,RAM和ROM都小,不会把flash中的代码加载到RAM中” 不好意思,我这句话有些背景概念没有交代清楚,看来已经误导了人。但是要说清楚,也不是一两句就说的清楚的。还是先直接回答你的问题吧。

1.flash中的代码,怎么加载到RAM中,有两种做法 A.编写或改写分散加载脚本,编译出来的程序,在启动时,也就是在进入你的main函数之前,会按照分散加载脚本的要求, 把全部或部分代码加载到RAM中。这个比较通用,也还算是比较简单。 B.自己编写加载代码,自己将自己的某个部分或全部加载到RAM中,如果没有特殊需要,建议用A方法。 什么是特殊需要呢,我一下展开不了,你看看嵌入式的bootloader,就是这么干的,非常普遍。

一般A的做法,是为了让某些被调用得非常频繁的函数,运行速度更快,这个你也知道单片机内的flash,执行速度比片内RAM慢。 你可以试试。如果是为了让某些函数被运行得更快,建议你用A方法,例如中断频率非常高的定时器ISR,把代码直接加载到RAM中, 以后就直接在RAM中运行这段代码了,而不去flash中拿这段代码了。 不过这些都已经优化的高级阶段了,实际产品开发中你知道这个优化方法,但也可能不会用得很多。

如果单片机本身的RAM就很小,你自然不能把太多的代码加载到里面,不然就没有足够的RAM给程序的其他代码用了,对不对。 你的代码中有没有用到静态变量(全局变量和静态变量),和代码要不要加载到RAM没有什么关系。 请注意,静态变量不是代码。静态变量属于数据段,定义时无初始化值的静态变量在ZI区,定义时有初始化值的在RW区,不过我有一点也很模糊,我不知道定义时有初始化值的,但初始值是0的,是不是也在ZI区。对应到嵌入式Linux的说法,叫ZI->BSS,RW->DATA,RO->text 建议你关注以下概念: 加载域,运行域。数据段,代码段,堆栈段。RO,RW,ZI. text,data,bss 书籍推荐杜春雷的《ARM体系结构与编程》 ,王宇行的《ARM程序分析与设计》,高阶的可以看《程序员的自我修养:链接、装载与库》 ,这几本书中都有上面这些概念的相关章节,可以挑着看。

2.怎么修改这些静态变量。 如果这些静态变量,不需要做到断电保存,那就没什么要说的。 如果你要做成断电保存,那你一定得要知道它在flash中的地址,对不对。 做法,我还是不写了,你上网找找资料吧,这个很多,做法也有几种。

3.STM32内部的flash是nor还是nand,其实我也不知道,说不定还有第三种答案呢。 但是没所谓,这几种flash的特点你都知道,这几种你都会用,就好了。硬要说是哪种,我觉得似乎更接近nor的特性。 /****************************************************************************/