请教原子哥:数据存储结构问题,小弟实在是想不明白了~

2019-07-21 01:13发布

1>软件平台使用的是keil mdk5.11
2>源码和图片(使用jtag在线debug的截图)
3>我使用的是stm32f407单片机开发板,它的flash地址是从0x8000 0000~0x8010 0000,它的ram的地址是从0x2000 0000~0x2002 0000(不包含CCMRAM)
[mw_shl_code=c,true]int main() { u8 p[] = "abcd"; u8 *q = "abcd"; printf("%s ",p); printf("%s ",q); } [/mw_shl_code]
问题1>指针p(0x200027f0)是存储在ram中,这个我可以理解,那它其中的p[0],p[1],p[2],p[3]都是存储在ram中的,地址依次自增+1个字节?是不是这个意思???
问题2>第一个"abcd"是存储在ram中,还是存储在flash中?为什么?

问题3>指针q是存储在哪里啊?看图中的0x08000250,既不是存储在ram中,也不是存储在flash中啊,小弟想不明白,恳请原子哥指教~~~
问题4>第二个"abcd"是存储在ram中,还是存储在flash中?为什么?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
ianhom
1楼-- · 2019-07-21 01:19
 精彩回答 2  元偷偷看……
liuchang
2楼-- · 2019-07-21 03:03
回复【2楼】ianhom:
---------------------------------
大神:(这个地址很可能就是下面的0x08000250,有的编译器会合并两个完全相同的常量以节省flash)
我实际查看了下,的确是这样,感谢大神指导

再次请问大神:能简单描述下堆栈跟flash,ram联系和区别吗?小弟不是很明白
ianhom
3楼-- · 2019-07-21 04:26
我所说的flash是指掉电后数据不会丢失的储存器,一般存储代码和数据,就arm cortex核的地址分配来看,一般分配在0x0000 0000~0x1FFF FFFF的区域。flash的缺点就是不能单个字节写入,都是按page(比如256个字节)来刷写,所以一般操作flash有具体的函数(先读,再改,最后一起刷进去)。当你定义一个常量,比如“abdc”、const类型的数据的时候,因为这个常量在运行的过程中是不会被修改的,即只读,这样编译器为了节约RAM(size明显低于flash)的消耗,就将常量定义在flash区域中。

我所说的RAM是指掉电后数据会丢失的储存器,单字节可读可写速度快,ram中也是有结构的,可以分为堆、栈(堆和栈是两个不同的东西)、静态、全局存储区等,我有个帖子讲的ram的结构,http://blog.chinaunix.net/uid-29151369-id-5097063.html,不过是给予飞思卡尔的芯片,模型应该差不多,原子哥有篇详解STM32内存http://www.openedv.com/posts/list/24152.htm,可以深入学习一下。

堆和栈是两个东西,常说的堆栈其实指的是栈stack,栈一个是给局部变量使用,比如说你例子中的p[]就在栈中,指针变量q的地址也在栈中;栈还有一个就是子函数调用或中断发生时用于储存现场信息,在处理完子函数或中断后返回现场(就是所谓的压栈,出栈)

堆heap是用于动态分配的,这个区域的使用需要程序员自己写代码去申请和释放,就是malloc和free。

我讲的也不是很清楚,等真正的大神补充
liuchang
4楼-- · 2019-07-21 05:45
 精彩回答 2  元偷偷看……
ianhom
5楼-- · 2019-07-21 05:45
回复【5楼】liuchang:
---------------------------------
相互学习~

一周热门 更多>