DSP

DSP学习-----内存管理的一点经验(转)

2019-07-13 10:12发布

https://blog.csdn.net/yf210yf/article/details/7638402 1. 在一个函数里建立一个很大的数组,函数运行完会自动删掉,但那是没法做到的,这个大数组最好是声明为全局变量,并且把它存到外部扩展内存里,不要让它占用有限的片上内存,不然程序很容易跑飞。C语言本身的跑飞现象比较好查,而因为内存问题而跑飞,很隐秘,很难查。 #pragma DATA_SECTION(a_1,"FLASHI");
float a_1[MN*MN+1]; 2. 一般数组的名字代表它的首地址,但是CCS里有些别扭的地方。 如果数组G是在其他文件里声明的,在本文件中想用的话直接extern int G;就可以了。但是要想用一个指针指向这个G,如:G_pointer要指向G,则应写成G_pointer=&G;若写成G_pointer=G;将提示错误。 如果G是本文件定义的静态变量,用指针指向它,可以写成:G_pointer=G; 3. 把大数组作为静态变量并给它独立分配内存空间的必要性: 如果大数组在函数内部定义,其数据会出现莫名其妙的异常,还会经常变化。其实不是你程序的错,是内存的缘故,所以硬着头皮,把他们统统放到程序前面去吧.ps这个实践验证 4. 程序中的printf无法起作用:     当然还是内存的问题。网上唯一一篇相关文章说是-heap的问题,让把heap改成0x400,俺的heap本来就是400,后来改成800也没用。最后把.stack移到片外内存后,printf才好用,光改option里的stack改到800也无济于事. ps:这个函数在dsp中并不好用。 8. 对于CCS来说,对于外部变量G,初始化的语句int G[100]={0};并不能使G的元素变      成 0,所以还是老老实实用memset语句进行初始化吧。或者直接循环赋值     但是对于动态变量{0}用于初始化是可以的。 10.不同文件的声明部分:CCS中每一个文件都要写声明,如文件A需要include ,文件B也需要,则A,B两文件都要写include ,编译器不会自动找的。还包括: #define......,  #pragma DATA_ALIGN等声明。ps带有数组定义的不可重复声明会报错 11.在程序调试阶段不要优化程序,成功之后在进行优化