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尺寸将不够使用。
在DSPC6657中通过测试程序验证可行性
(1)修改cmd文件
-heap 0x01000000
-stack 0x1000
MEMORY
{
/* Local L2, 0.5~1MB*/
VECTORS: o = 0x00800000 l = 0x00000200
LL2_RW_DATA: o = 0x00800200 l = 0x0005FE00
/* Shared L2 1MB for C6657 */
SL2: o = 0x0C000000 l = 0x00010000
/* External DDR3, upto 2GB per core */
DDR3_CODE: o = 0x80000000 l = 0x01000000 /*set memory protection attribitue as execution only*/
DDR3_R_DATA: o = 0x81000000 l = 0x01000000 /*set memory protection attribitue as read only*/
DDR3_RW_DATA: o = 0x82000000 l = 0x06000000 /*set memory protection attribitue as read/write*/
//DDR3_RW_DATA: o = 0x82000000 l = 0x1E000000 /*set memory protection attribitue as read/write*///2018.7.3gai
}
SECTIONS
{
vecs > VECTORS
.text > LL2_RW_DATA
.cinit > SL2
.const > SL2
.switch > SL2
.stack > LL2_RW_DATA
GROUP
{
.neardata
.rodata
.bss
} > LL2_RW_DATA
.far > LL2_RW_DATA
.fardata > LL2_RW_DATA
.cio > LL2_RW_DATA
.sysmem > DDR3_CODE
QMSS_Data.linkingRAM1 > SL2
QMSS_Data.Descriptor_SL2 > SL2
PacketData.buffer_SL2 > SL2
QMSS_Data.Descriptor_LL2 > LL2_RW_DATA
PacketData.buffer_LL2 > LL2_RW_DATA
QMSS_Data.Descriptor_DDR > DDR3_RW_DATA
PacketData.buffer_DDR > DDR3_RW_DATA
}
将.system放在ddr3_code中。通过main_process函数测试图片处理
void main_process(void)
{
uint8 *im = (uint8 *)0x81000000;//一次性将数据集导入到DDR3
uint8 *dst = (uint8 *)0x81050000;
uint8 *img;
int i;
img = (uint8*)malloc(307200 * sizeof(uint8));
for (i=0;i<307200;i++){
img[i]=im[i];
}
//IMG_sobel_3x3_8(img,dst,640,480);
IMG_sobel_3x3_8(img,dst,640,480);
while(1){
}
}
结果正常