智能车制作

标题: ARM的flash与ram的使用。 [打印本页]

作者: 尕玍紿    时间: 2014-1-2 14:27
标题: ARM的flash与ram的使用。
注:基于我用的K60,IAR6.5,讲点我知道的,问些我不懂的。红色字体为问题,望解答。

1.flash断电不丢失(ROM的一种,只读、不可写);ram断电丢失(可读写)。
2.代码运行方式:①存在flash中,并在flash中运行。(节省ram,速度慢)   
                       ②存在flash中,上电后拷贝到ram中运行。(消耗ram,速度快)
  (注:将代码烧写至ram中的情况不讨论,这种方式主要用来调试代码用。)
3.ARM内存空间(ram)的使用分配:  
(摘抄至http://blog.sina.com.cn/s/blog_7e741b830100qe3q.html及http://blog.csdn.net/xiaoweiboy/article/details/6889112)
不管选择什么代码运行方式,都存在将 '变量数据' 从flash中拷贝到ram中的步骤,原因很简单:flash(ROM)是只读的,而变量是需要改变的,在flash上无法实现更改变量的值;所有要拷贝至ram中。那ram是怎么被使用的呢?
   在这里就涉及到了“ARM的空间属性”——“程序的空间属性”:程序其本质由代码(text段)和数据组成的,其中数据又细分为 已初始化数据段(data段)和 未初始化数据段(BBS段)。所以在使用ram的时候,ram会被分成两部分:一部分是代码段用于储存代码(如果选择的是在flash中运行,那么ram中就省下了这部分的ram空间),一部分是数据段用来存放变量(data段在前,BBS段在后)。而剩余下来的ram就用来作为 ‘堆’ 和 ‘栈’的空间。
   '栈'stack:我们又常称为堆栈,这部分空间主要用来 函数跳转时对“现场信息的保护”。另外函数中定义的局部变量也是使用这片空间的,并不是使用数据段空间。栈的大小是预先设置好的,不可变的。
   '堆'heap:这部分空间主要用来动态内存分配。即malloc(),new()等函数申请内存时都是从这里中分配出去的。有人说,设置堆的大小意义不大,设置大小只是为了通过编译而已,在使用的过程中,当堆不足时会自动拿空闲空间补充。这里我不是很理解:既然堆是拿来动态内存分配的,也就是说我们事先根本不知道需要多大,那又怎么说设置堆的大小只是为了通过编译呢?编译器怎么知道堆为多大时才算正确?还有heap的大小真的是可变的吗?有的人说IAR不同于其它的IDE软件,IAR的heap是固定不变的,但是我一直找不到在哪里可以设置到堆和栈的大小,百度上找到的由于IAR版本的不同,好像不通用...我的是IAR6.5的。懂的望 不吝赐教!先谢过..
     综上所述,ram从低地址至高地址被分成:
     ①text段:存放代码,也有可能包含一些只读的常数变量,例如字符串常量等。
     ②data段:存放已初始化的全局变量 和 任何地方(函数内外)定义的 静态变量。
     ③BBS段:存放未初始化的 或 初始化为0 的全局变量。
     ④堆heap:存放动态分配的变量。
     ⑤栈stack:存放 现场信息 和 局部变量。
模糊的:#defined 的常量 存放在哪个段里?代码段 还是 data段?提供的两个链接内容不会太长,建议看下,有些地方我没说清楚的。


作者: 野火    时间: 2014-1-2 17:43
堆 是 malloc 的时候 才 用到,如果你的代码 没用到 malloc (new) ,就没用到 堆

#defined 的常量  ,都是 放在 flash 里面, 即 rodata

看 我们 的 三天入门 K60 教程, 开头 就有详细的讲解的。

堆和栈的大小 设置,看 我们教程,同样 也有 设置 ,不同版本 通用的 (最起码 我没用过 不通用的版本)
作者: 尕玍紿    时间: 2014-1-2 18:46
野火 发表于 2014-1-2 17:43
堆 是 malloc 的时候 才 用到,如果你的代码 没用到 malloc (new) ,就没用到 堆

#defined 的常量  ,都 ...

谢谢 火爷...
我用到了malloc,所以才会考虑到这些的。
这些天加了malloc后程序老死机,所以才怀疑起是不是内存溢出了。
不过现在发现,不加malloc也会死机了,即只实现简单的图像采集都会死机。不知火爷有没有什么可以指点下的。
额...提下我不是弄飞思卡尔的,只是以前参加过,所以这里有个号,就来这问问了。所以电机噪声,跑道静电的就不在我的范围内了。

作者: 尕玍紿    时间: 2014-1-2 19:56
野火 发表于 2014-1-2 17:43
堆 是 malloc 的时候 才 用到,如果你的代码 没用到 malloc (new) ,就没用到 堆

#defined 的常量  ,都 ...

是我自己之前理解错了,还是你们笔误啊?
[attach]54016[/attach]
cstack 是栈  , heap 是堆 才对吧!


作者: 野火    时间: 2014-1-2 23:44
尕玍紿 发表于 2014-1-2 19:56
是我自己之前理解错了,还是你们笔误啊?

cstack 是栈  , heap 是堆 才对吧!

那两个 地方 是 设置 堆栈大小嘛,所以 就 写 在 一起

作者: 野火    时间: 2014-1-2 23:46
尕玍紿 发表于 2014-1-2 18:46
谢谢 火爷...
我用到了malloc,所以才会考虑到这些的。
这些天加了malloc后程序老死机,所以才怀疑起是 ...

有时候,数组 越界 也会 导致 这类的问题的,如果 是 用 K60 ,我们 的 K60 视频 在 讲 IAR 使用的那部分,有讲 如何 查找 死机问题的。
没用到 malloc ,那就 不是 堆 的问题。






欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2