在AMR芯片中内存空间是越来越大了,而我们的使用需求也是水涨船高。而不同ARM芯片的内存分配也是截然不同。例如同样是64K的STM32,只要你的数组定义在64K内就可以操作的,而64K的LPC芯片则不能定义64K的数组。这个问题恐怕困扰了不少网友。产生这一问题的主要原因是不同芯片内存架构是不一样的。下面我们主要探讨一下LPC1768的内存空间是使用情况。
下图是LPC1768的内部结构框图:
从上图我们可以看出LPC1768的64K SRAM被分为了3大块:1块是内部32K,另外两块16K是外挂在AHB总线上的。这样分配的原因是一块16K被分配给USB,一块16K被分配给以太网。所以,真正给用户的只要32K。然而,我们往往不使用USB或以太网,那么这32K内存空间既不是浪费了。
下面我们在看看,MDK对内存空间的定义:
有图我们可以看出,MDK中同样把内存空间分成了两大块,一块是默认的内部32K,一块是AHB总线上的32K。而默认只够选了前面的32K。使用如果我们没有使用USB或以太网也只能使用这32K SRAM。如果要想使用其他32K就必须勾选这部分空间。
但是需要注意一下问题:
1.单个数组的定义不能大于任何一块的最大空间,这是因为数组的存放是需要连续空间的,而这里的连续空间不会大于32K。
如:uint8 buf[30720]; // 32K,是可以定义的,但是绝对不能大于32K,否则报错。
2.单个文件理的数组定义不能大于任何一块的最大空间,这里需要注意,如果只是在一个文件里边定义,而没有初始化是可以的,如果在一个C文件的定义并初始化或使用了这些空间,那么这些空间也不能大于任意一块的最大空间,这应该编译器在分配内存时也是按照连续存放来分配同一个文件里的空间的。
如:uint8 buf[30720]; // 32K,是可以定义的,但是绝对不能大于32K,否则报错。
uint8 buf1[20000]; // 20K,是可以的,但是绝对不能初始化,否则会包错
如果把它们分别放到不同的文件中定义,并初始化是没有问题的。
[ 本帖最后由 zhaojun_xf 于 2011-12-8 14:35 编辑 ]