OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5966|回复: 5

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

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2015-10-29 22:36:29 | 显示全部楼层 |阅读模式
5金钱
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\r\n",p); printf("%s\r\n",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中?为什么?

最佳答案

查看完整内容[请看2#楼]

1、是的 2、有两个“abcd”,一个是作为常量储存在flash中,用于初始化p[]数组;另一个就是在p[]数组中;至于在flash的“abcd”位置在哪里,你可以搜索一下flash区域,通过关键字0x61,搜到后再看看后面是不是0x62,63...,(这个地址很可能就是下面的0x08000250,有的编译器会合并两个完全相同的常量以节省flash) 3、指针q储存在栈中,如果你&q的话就可以发现这个值在就在0x200027F0附近;这里的q的值0x0800250是常量“abcd ...
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-10-29 22:36:30 | 显示全部楼层
1、是的
2、有两个“abcd”,一个是作为常量储存在flash中,用于初始化p[]数组;另一个就是在p[]数组中;至于在flash的“abcd”位置在哪里,你可以搜索一下flash区域,通过关键字0x61,搜到后再看看后面是不是0x62,63...,(这个地址很可能就是下面的0x08000250,有的编译器会合并两个完全相同的常量以节省flash)
3、指针q储存在栈中,如果你&q的话就可以发现这个值在就在0x200027F0附近;这里的q的值0x0800250是常量“abcd”在flash中的地址(这里只有一个“abcd”)你这里的q就是指向这个常量“abcd”。一般情况下,arm地址分配中flash的区域是0x0000 0000~0x1FFF FFFF,所以你的RAM是从0x2000 0000开始的,至于你说的0x8000 0000~0x8010 0000区域,我不是很了解这个芯片;
4、如上,这个“abcd”在flash中

补充一个cortex-m3的图,不知道是否和你芯片的一样:


机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2015-10-30 09:36:32 | 显示全部楼层
回复【2楼】ianhom:
---------------------------------
大神:(这个地址很可能就是下面的0x08000250,有的编译器会合并两个完全相同的常量以节省flash)
我实际查看了下,的确是这样,感谢大神指导

再次请问大神:能简单描述下堆栈跟flash,ram联系和区别吗?小弟不是很明白
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-10-30 10:03:28 | 显示全部楼层
我所说的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。

我讲的也不是很清楚,等真正的大神补充
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2015-10-30 15:53:39 | 显示全部楼层
回复【4楼】ianhom:
---------------------------------
大神,感谢您的指导~小弟学习了~
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-10-30 15:56:04 | 显示全部楼层
回复【5楼】liuchang:
---------------------------------
相互学习~
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 12:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表