本帖最后由 犹豫的大三 于 2016-6-1 16:26 编辑
在用STM32F103VET6芯片做IAP时发现一个不解的地方。IAP和APP程序除了要定义不同的中断向量表外,RAM和ROM都要分区,不能有重叠区域。但是多大区域才合适呢?有没有计算的方法?
我用的是IAR7.3。程序在编译完成后,在下方的Messages栏可以看到3个数据。如下图1:
29958字节的只读code和9970字节只读数据。这两类数据都是在ROM区的,因此可以估算出ROM的占用空间是(29958+9970)字节。6268字节的读写数据是在RAM区的,但RAM区包含3类区域,RW数据区、CSTACK(栈)区、HEAP(堆)区。一般程序里的静态变量和全局变量都是在RW区的,在程序结束时释放内存。函数的形参、局部变量等都是在栈区的,由编译器自动分配释放。堆区里存放的数据一般都是我们自己分配释放,C中典型的malloc和free函数就是分配和释放的过程。 在IAR里options选项的linker项可编辑内存范围。如下图2所示:
点击Edit弹出对话框,在这里可以修改向量表、内存范围和堆栈大小。打开STM32F103VET6的默认icf文件,即stm32f103xE.icf。看到他的内容如图3:
堆栈的对齐方式是8字节对齐吗????
修改Vector Table、Memory Regions和Stack/Heap Size就可修改icf文件的相应值。
如果堆栈是8字节对齐的话,那RAM最小空间是不是可以这样计算?
RAM Size = RW Size(本例中是6268) +STACK Size * 8 + HEAP Size * 8
堆栈的大小取决于程序,一般都是设置较大些。
|