搜索
bottom↓
回复: 18

请教坛里高手如何将FLASH中定义的全局静态变量在DSP上电时...

[复制链接]

出0入0汤圆

发表于 2012-10-9 20:40:02 | 显示全部楼层 |阅读模式
你好 爱好DSP2812的同志们  我现在在做一个项目 发现当我把在RAM中调试的程序下载到FLASH中运行时系统的性能整体下降了许多,我想了很多办法改善,最重要的一些改善是把经常调用的函数在DSP上电后加载到RAM中运行,但是我发现还是不是很理想,现在我想把我定义的一个静态全局变量数组也改成在上电时在RAM中运行,请问我该怎么做才能让DSP上电时把FLASH中的全局静态变量加载到RAM中运行 这个对我很重要 可是找了很多资料都没有找到办法 请一起奋斗的同志们帮帮忙 谢谢了!!!

出0入0汤圆

 楼主| 发表于 2012-10-9 20:41:23 | 显示全部楼层
帮自己顶一下 在这里也先谢谢大家的关注了

出0入0汤圆

发表于 2012-10-9 21:24:05 来自手机 | 显示全部楼层
28335好像是定义一个段,这个段映射到RAM区,将变量都定义到这个段,具体怎么操作忘了,有一年没碰它了

出0入0汤圆

 楼主| 发表于 2012-10-9 21:48:51 | 显示全部楼层
nnnkey 发表于 2012-10-9 21:24
28335好像是定义一个段,这个段映射到RAM区,将变量都定义到这个段,具体怎么操作忘了,有一年没碰它了 ...

你好 谢谢你的回答 定义一个段将这个段映射到RAM区不是使用RAM.cmd链接文件的手法吗

出0入0汤圆

发表于 2012-10-9 21:52:54 | 显示全部楼层
定义一个非静态数组,一开始先把静态数组中的内容复制过去?

出0入0汤圆

 楼主| 发表于 2012-10-9 22:14:50 | 显示全部楼层
BBC 发表于 2012-10-9 21:52
定义一个非静态数组,一开始先把静态数组中的内容复制过去?

你程序调好后就全部下载到FLASH中了 怎么一开始就定义一个非全局静态变量啊 变量还是得放在FLASH中的啊 我要具体的实例 多谢帮忙了

出0入0汤圆

发表于 2012-10-9 22:29:48 | 显示全部楼层
定义成非静态, 不就被load到ram里了吗? 还是我没有理解清楚lz的意思呢?

出0入0汤圆

发表于 2012-10-9 23:36:12 | 显示全部楼层
tangcangeng 发表于 2012-10-9 22:14
你程序调好后就全部下载到FLASH中了 怎么一开始就定义一个非全局静态变量啊 变量还是得放在FLASH中的啊  ...

你的静态数组是 const 还是 static ?

出0入0汤圆

 楼主| 发表于 2012-10-10 07:48:25 | 显示全部楼层
BBC 发表于 2012-10-9 23:36
你的静态数组是 const 还是 static ?

你好 我的意思是我是将所有的数据以及程序都是下载到2812的FLASH中的,但是我想将一些变量在DSP上电的时候自动从FLASH下载到片内RAM中运行 具体应该怎么在程序中实现呢? 我自己定义的是const型的

出0入0汤圆

 楼主| 发表于 2012-10-10 07:53:45 | 显示全部楼层
本帖最后由 tangcangeng 于 2012-10-10 07:57 编辑

这是我cmd文件里头的一部分
SECTIONS
{
   .reset           : >  RESET,     PAGE = 0, TYPE = DSECT
   vectors                        : >  VECTORS,   PAGE = 0, TYPE = DSECT
   .cinit           : >  FLASH,     PAGE = 0
   .text            : >  FLASH,     PAGE = 0
   codestart        : >  BEGIN,     PAGE = 0
   
   ramfuncs: LOAD=FLASH, PAGE=0
                    RUN=RAML0,PAGE=0
                     LOAD_START(_RamfuncsLoadStart),
             LOAD_END(_RamfuncsLoadEnd),
             RUN_START(_RamfuncsRunStart)

  .const           : > FLASH,       PAGE = 0
   .econst          : > FLASH,       PAGE = 0

   .data2                         : > RAMM1,                 PAGE = 1
   .stack           : > RAMM0,       PAGE = 1
   .bss                                : > RAML1,       PAGE = 1
   .ebss            : > RAML1,       PAGE = 1
   .sysmem                        : > RAMH0,       PAGE = 1
   .esysmem         : > RAMH0,       PAGE = 1
  /* Allocate IQ math areas: */
   IQmath           : > FLASH,       PAGE = 0                /* Math Code */
   IQmathTables     : > ROM,         PAGE = 0, TYPE = NOLOAD /* Math Tables In ROM */
  PieVectTableFile : > PIE_VECT,   PAGE = 1

难道我要将const或者类似于这些之类的变量改成放在RAM中?比如改成.const           : > RAMM0,       PAGE = 0
? 而我的程序和数据是调试好后全部烧写在FLASH中的啊,难道这样子做了在上电的时候DSP会自动根据CMD文件将FLASH中的数据加载到RAM中运行,而不用额外的将数据从FLASH复制到RAM中的代码?

出0入0汤圆

 楼主| 发表于 2012-10-10 08:04:13 | 显示全部楼层
lkm_unication 发表于 2012-10-9 22:29
定义成非静态, 不就被load到ram里了吗? 还是我没有理解清楚lz的意思呢?

谢谢你的回复,我的意思是我的程序在调试好后是将所有的程序和数据下载到FLASH中了,怎样让DSP在上电后自动的将FLASH中的某些经常用的数据加载到RAM中运行,难道只要比如在CMD中写成:>RAMM0,PAGE=1,之类的就可以了?

出0入0汤圆

发表于 2012-10-10 12:44:32 | 显示全部楼层
那我反问一下, 你的程序里有可以修改的, 而且有初始值的全局变量吧? 那么全局变量的初始值是保存在flash里的, 那么问题来了, 谁把这些全局变量load到ram里的呢? 清楚了这一点, 一切就括然开朗了,如果你自己的程序没有这个初始化步骤, 那么就肯定是编译器帮你做了, 可以看看初始化的代码, 可能是汇编的。

出0入0汤圆

发表于 2012-10-10 13:12:53 | 显示全部楼层
lkm_unication 发表于 2012-10-10 12:44
那我反问一下, 你的程序里有可以修改的, 而且有初始值的全局变量吧? 那么全局变量的初始值是保存在flash ...

对,lkm_unication说得没错~~

在DSP中用C 写程序,编译后,程序一开始是跳转到 _c_init 执行的, _c_init 这段程序是为用户写的C程序建立运行环境的,比如用户定义的一些全局变量等等就会按照CMD来分配储存空间。

假设现在定义一个 CONST int a[10],a[10] 当然是存放在FLASH里。但是如果我们定义一个全局数组 int b[10],那么  _c_init 就会在RAM里面为 b[10] 预留一段空间。

所以,如果楼主希望数组 a[10] 会被分配到RAM的话,去掉 CONST 就可以了。

另外,CONST是常量,STATIC 才是静态变量,静态变量在使用时也是分配到RAM中的。

出0入0汤圆

 楼主| 发表于 2012-10-11 13:09:51 | 显示全部楼层
BBC 发表于 2012-10-10 13:12
对,lkm_unication说得没错~~

在DSP中用C 写程序,编译后,程序一开始是跳转到 _c_init 执行的, _c_in ...

问一下 static 型的全局变量放在CMD中的哪个系统段中

出0入0汤圆

 楼主| 发表于 2012-10-11 13:18:38 | 显示全部楼层
BBC 发表于 2012-10-10 13:12
对,lkm_unication说得没错~~

在DSP中用C 写程序,编译后,程序一开始是跳转到 _c_init 执行的, _c_in ...

明白 但是有没有设置成const的类型的而且要让DSP上电复位后自动加载到RAM中运行的方法呢??

出0入0汤圆

发表于 2012-10-12 00:02:14 | 显示全部楼层
tangcangeng 发表于 2012-10-11 13:18
明白 但是有没有设置成const的类型的而且要让DSP上电复位后自动加载到RAM中运行的方法呢?? ...

按照我的理解,static 是用在子函数中的,全局变量并不需要 static...

假设我有下面这样一个子函数:

void c_plus ( void )
{
    unsigned int c;
    c ++;
}

这个函数看上去好像是每调用一次,c 的值就加一,但是实际上并不一定如此。因为变量 c 是在函数里面定义的,不是全局变量。

在某些编译器中,只有当这个子函数被调用时,程序才在RAM中划分一个空间给变量c ,当函数调用完毕, 程序马上释放变量c 的空间。

这样,有时候当RAM很紧张的时候,很可能变量c 的空间在函数没有被调用时会划分给别的临时变量用,这样,有可能每次c 的值都不同,或者每次c 的值都是从0开始。

而static 就是为了解决这个问题,如下面的函数:

void c_plus ( void )
{
    static unsigned int c;
    c ++;
}

与上面的情况不同,当这个函数第一次被调用时,程序会在RAM中划分一个空间给变量c ;当函数调用完毕后,变量c 的空间并不释放,而是像全局变量一样一直存在于RAM中,可是只有定义它的函数才能调用。当函数再次被调用时,变量c 的值仍然是上次最后操作后的值。因此只有第二个函数才是真正实现每调用一次,c 的值就加一的功能。

所以很明显,static 只是一个修饰的功能,变量c 的实质仍然是unsigned int。因此变量c 存放的位置与全局变量存放的位置相同。

对于第二个问题......数组设置成 const 类型,其中最大一个好处是可以省内存,其中一个原因是编译器不会为const类型的常量分配内存。

如果单纯想让const 类型的变量分配到内存中,只需去掉const 即可,这句话我是第二次说了......

出0入0汤圆

 楼主| 发表于 2012-10-12 19:45:32 | 显示全部楼层
BBC 发表于 2012-10-12 00:02
按照我的理解,static 是用在子函数中的,全局变量并不需要 static...

假设我有下面这样一个子函数:

非常感谢二位 我明白了

出0入0汤圆

发表于 2013-11-18 22:59:26 | 显示全部楼层
BBC 发表于 2012-10-12 00:02
按照我的理解,static 是用在子函数中的,全局变量并不需要 static...

假设我有下面这样一个子函数:

那我请问一下,如果我把.const分配到RAM里,那么是不是也可以解决这个兄弟的问题,其实一上电就在RAM里给数组分配相应空间。

出0入0汤圆

发表于 2013-11-19 15:50:14 | 显示全部楼层
anstxfw 发表于 2013-11-18 22:59
那我请问一下,如果我把.const分配到RAM里,那么是不是也可以解决这个兄弟的问题,其实一上电就在RAM里给 ...

对,关键还是要看编译器和编译设置。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 16:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表