DSP⾥动态内存分配malloc函数的使⽤
DSP⾥的动态内存分配,其分配的内存区域在在堆(heap)中。同时DSP⾥动态分配内存的函数还有calloc以及reclloc。这些动态分配的内存放置在.system段的全局池或堆(heap)中。因此当我们需要动态分配⼤尺⼨的内存时,我们的⽚内内存不够使⽤,我们将.system段定位到我们的EMIFA内存中,然后在编写cmd⽂件时,加⼊对堆⼤⼩(heap-Size)的指定。具体操作如下介绍:
1、当我们使⽤CCS5.5建⽴DSP的Project后,编译环境会⾃动为我们⽣成链接⽂件(.cmd)(若没有⾃动⽣成,我们可以⾃⼰编写.cmd ⽂件),代码如下图所⽰:
*.cmd
-heap 0x01000000 /* Heap Size */
MEMORY
{
IRAM: o = 0x00000000 l = 0x00040000 /* 256kB Internal RAM (L2) */
EMIFA_CS0: o = 0x80000000 l = 0x10000000 /* 256MB EMIFA CE0 */
EMIFA_CS1: o = 0x90000000 l = 0x10000000 /* 256MB EMIFA CE1 */
EMIFA_CS2: o = 0xA0000000 l = 0x10000000 /* 256MB EMIFA CE2 */
EMIFA_CS3: o = 0xB0000000 l = 0x10000000 /* 256MB EMIFA CE3 */
}
SECTIONS
{
.text > IRAM /*可执⾏代码段的映射*/
.stack > IRAM /*为系统堆栈分配存储器。该段⽤于将变量传递⾄函数或者⽤来分配局部变量*/
.bss > IRAM /*保留全局和静态变量空间。在启动和导⼊的时候,C/C++编译器会启动程序将.cint段中的数据复制出来,以初始化.bss段中的变量*/ .cio > IRAM /*io⼝*/
.const > IRAM /*包含由C/C++限定词const定义的字符常量和数据*/
.data > IRAM /*初始化数据段*/
.switch > IRAM /*控制语句段映射*/
.sysmem > EMIFA_CS0 /*初始化系统空间*/
.far > IRAM /*供外部⽂件调⽤的变量*/
}
此时我们需要⽤语句-heap 0x01000000 /* Heap Size */指定我们堆得⼤⼩,如果我们后⾯需要动态分配的内存⽐较⼤,此时我们需要将此size指定较⼤空间。同时我们需要将.sysmem段定位到我们的CE0空间,因为我们的⽚内RAM尺⼨将不够使⽤。
2、编写程序测试我们的分配
在main.c函数⾥添加如下代码:
#include <stdio.h>
//#include <malloc.h>
int main(void) {
int i;
int *f;
f = (int*)malloc(sizeof(int) * 10000);
//f = (int*)calloc(200,sizeof(int));
for(i=0; i<10000; i++)
{
*(f+i) = i;
}
printf("answer = %d\n",*(f+9999));
free (f);
molloc函数printf("end\n");
return 0;
}
我们通过单步调试,将可以看到我们的指针f的地址与其所指的内存⾥int值。若我们不讲-heap定位于CE0,我们运⾏程序将会出错。
我们使⽤的是CCS5.5的软件仿真模式(Simulator)进⾏仿真。关于CCS5.5如何建⽴Simulator⼯程,请看另⼀篇博⽂。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论