DSP

DSP内存管理配置-1

2019-07-13 10:09发布

动态分配: DSP中有两个动态分配的函数: malloc: 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象calloc: 如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。函数malloc()和函数calloc()的主要区别是前
者不能初始化所分配的内存空间,而后者能。 参考:https://blog.csdn.net/luokh327/article/details/50056973/ DSP里的动态内存分配,其分配的内存区域在在堆(heap)中。这些动态分配的内存放置在.system段的全局池或堆(heap)中。因此当我们需要动态分配大尺寸的内存时,我们的片内内存不够使用,我们将.system段定位到我们的EMIFA内存中,然后在编写cmd文件时,加入对堆大小(heap-Size)的指定 1、当我们使用CCS5.5建立DSP的Project后,编译环境会自动为我们生成链接文件(.cmd)(若没有自动生成,我们可以自己编写.cmd文件),代码如下图所示: *.cmd  
  1. -heap 0x01000000 /* Heap Size */
  2. MEMORY
  3. {
  4. IRAM: o = 0x00000000 l = 0x00040000 /* 256kB Internal RAM (L2) */
  5. EMIFA_CS0: o = 0x80000000 l = 0x10000000 /* 256MB EMIFA CE0 */
  6. EMIFA_CS1: o = 0x90000000 l = 0x10000000 /* 256MB EMIFA CE1 */
  7. EMIFA_CS2: o = 0xA0000000 l = 0x10000000 /* 256MB EMIFA CE2 */
  8. EMIFA_CS3: o = 0xB0000000 l = 0x10000000 /* 256MB EMIFA CE3 */
  9. }
  10.  
  11. SECTIONS
  12. {
  13. .text > IRAM /*可执行代码段的映射*/
  14. .stack > IRAM /*为系统堆栈分配存储器。该段用于将变量传递至函数或者用来分配局部变量*/
  15. .bss > IRAM /*保留全局和静态变量空间。在启动和导入的时候,C/C++编译器会启动程序将.cint段中的数据复制出来,以初始化.bss段中的变量*/
  16. .cio > IRAM /*io口*/
  17. .const > IRAM /*包含由C/C++限定词const定义的字符常量和数据*/
  18. .data > IRAM /*初始化数据段*/
  19. .switch > IRAM /*控制语句段映射*/
  20. .sysmem > EMIFA_CS0 /*初始化系统空间*/
  21. .far > IRAM /*供外部文件调用的变量*/
  22. }
此时我们需要用语句-heap 0x01000000 /* Heap Size */指定我们堆得大小,如果我们后面需要动态分配的内存比较大,此时我们需要将此size指定较大空间。同时我们需要将.sysmem段定位到我们的CE0空间,因为我们的片内RAM尺寸将不够使用。 2、编写程序测试我们的分配 在main.c函数里添加如下代码:  
  1. #include
  2. //#include
  3. int main(void) {
 
  1. int i;
  2. int *f;
  3. f = (int*)malloc(sizeof(int) * 10000);
  4. //f = (int*)calloc(200,sizeof(int));
  5. for(i=0; i<10000; i++)
  6. {
  7. *(f+i) = i;
  8. }
  9. printf("answer = %d ",*(f+9999));
  10. free (f);
  11. printf("end ");
  12. return 0;
  13. }