DSP解决malloc函数分配内存时片内RAM空间不足的问题

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){

		}

 }

结果正常

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhengky6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值