This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【急】关于函数体内申明的数组被分配到保留去内存的情况怎么解决呢?



芯片:C6657LS

平台:CCS5.4

    最近写的程序子函数声明的和某些主函数声明的数组都指向了0x7fffff一下的保留内存区,导致读写时进入子函数就无法出来,这种情况怎么处理呢?

我尝试把SECTIONS设置如下:

SECTIONS {     .text: load >> DDR3     .stack: load > L2SRAM     GROUP: load > DDR3     {         .bss:         .neardata:         .rodata:     }     .cinit: load > DDR3     .pinit: load >> L2SRAM     .init_array: load > L2SRAM     .const: load >> DDR3     .data: load >> DDR3     .fardata: load >> L2SRAM     .switch: load >> DDR3     .sysmem: load > DDR3     .far: load >> DDR3     .cio: load >> DDR3     .code: load >> DDR3     .vecs: load >> L2SRAM }

结果还是出现这样的情况!只能在主函数之前申明变量才能保存到DDR3内存里面而且完成读写操作——而且可以完美跑完程序,我把一些缓存的变量放在子函数里面声明则总是被分配到保留内存区域,请问一下这是什么原因呢?应该怎么解决?

  • 局部变量是放在stack中,可能是cmd中对L2SRAM的定义段包括reserved section。确认对L2SRAM的定义是否是从0x800000开始的1MB空间,而没有超过这个段,或者把stack放在DDR3看是否有问题。

  • 谢谢Andy Yin1的解答!

    --args 0x0

    -heap  0x0

     -stack 0x1000

    MEMORY

    {  

    L2SRAM (RWX) : org = 0x800000, len = 0x100000

    MSMCSRAM (RWX) : org = 0xc000000, len = 0x100000

     DDR3 : org = 0x80000000, len = 0x20000000

     }

     

    这个应该没问题?我还有几个疑问:

    局部变量都是放在stack里面的话我的stacksize是不是应该尽量大呢?

    函数体内声明的大数组总内存超过stacksize一定会导致这种错误吗?

    我测试过使用DaemonNew创建的socket守护进程stacksize好像有限制,超过64K就会出错了?假如我要在里面处理大型数组的话有什么办法呢?

    谢谢

     

  • memory定义的没有问题。如果有很大的局部数组,一定要保证stack足够大,否则会导致stack溢出导致程序异常。对应特别大的数组,建议定义为全局变量即可。stack size并没有上限,你说的超过64k会出错,可能是代码中有做了相应限制。

  • 非常谢谢Andy Yin1 的回答,我之前也是这么解决的,不过觉得有些别扭,不过堆栈大小定义太大了也不大合理,就这样将就解决了吧。