628|0

4693

帖子

0

资源

纯净的硅(中级)

知道一些DSP的内存管理

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.在程序调试阶段不要优化程序,成功之后在进行优化


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

关闭
站长推荐上一条 1/6 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表