查看: 1627|回复: 0

[经验] 知道一些DSP的内存管理

[复制链接]

该用户从未签到

发表于 2020-12-27 13:18:06 | 显示全部楼层 |阅读模式
分享到:

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 <stdio.h>,文件B也需要,则A,B两文件都要写include <stdio.h>,编译器不会自动找的。还包括:

#define......,  #pragma DATA_ALIGN等声明。ps带有数组定义的不可重复声明会报错

11.在程序调试阶段不要优化程序,成功之后在进行优化


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-26 23:18 , Processed in 0.102122 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.