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中?为什么?
---------------------------------
大神:(这个地址很可能就是下面的0x08000250,有的编译器会合并两个完全相同的常量以节省flash)
我实际查看了下,的确是这样,感谢大神指导
再次请问大神:能简单描述下堆栈跟flash,ram联系和区别吗?小弟不是很明白
我所说的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。
我讲的也不是很清楚,等真正的大神补充
---------------------------------
相互学习~
一周热门 更多>