前言
最近在做基于dsp平台的无通信接口系统辨识,辨识的时候会有很大的数据需要存到一个数组当中,而dsp如果定义一个很大的全局数组,编译会报错。 本文将探索如何解决这个报错以及全局数组的大小极限。
正文
首先,我们定义了一个长度为50000的float的数组,float y[50000]; 然后编译报错如下:
熟悉dsp的朋友应该知道,这个时候就需要修改.cmd文件了, 另外,管全局变量的section名称叫做'.ebss', 说白了,我们要去改 2837xD_FLASH_lnk_cpu1.cmd(其他型号的dsp请对号入座)里面的这一行(红色→)。
为了达到想要的目的,本人是经过几番摸索的,愚蠢的过程就省略了,直接给出关键信息,我参考了以下博文:
CCS软件报错:“第0页“.text”大小为0x1041的节的对齐/分块放置失败。”_css 仿真 1041error_渡己之道的博客-CSDN博客
其中,最让我受启发的是下面我截的这段话。
float y[50000];是一个很大的数据块 size = 5w * 2 = 10w(dsp一个size 16位,float32位需要2个size), 而.ess的分区最大的也才 0x1000 = 4096(d), 4096是远远小于10w的。 所以我们需要搞一个大的分区分配给.ess。.cmd的关键修改如下
// RAMGS2 : origin = 0x00E000, length = 0x001000
// Δ ↓ 分区大小改大RAMGS2 : origin = 0x00E000, length = 0x00C000/*RAMGS3 : origin = 0x00F000, length = 0x001000RAMGS4 : origin = 0x010000, length = 0x001000RAMGS5 : origin = 0x011000, length = 0x001000RAMGS6 : origin = 0x012000, length = 0x001000RAMGS7 : origin = 0x013000, length = 0x001000RAMGS8 : origin = 0x014000, length = 0x001000RAMGS9 : origin = 0x015000, length = 0x001000
// RAMGS10 : origin = 0x016000, length = 0x001000RAMGS11 : origin = 0x017000, length = 0x001000RAMGS12 : origin = 0x018000, length = 0x001000 // Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices.RAMGS13 : origin = 0x019000, length = 0x001000 // Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices.
*/
我把 从 RAMGS2 到 RAMGS13 这 12个分区,合并成了1个分区,都合并成了RAMGS2。分区大小从0x1000改成了0xC000 = 49152,这应该是可以合并的分区极限了。
另外一处,.ebss section的分区分配也需要做相应的修改。
SECTIONS
{/* Allocate program areas: */.cinit : > FLASHB PAGE = 0, ALIGN(4).pinit : > FLASHB, PAGE = 0, ALIGN(4).text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4)codestart : > BEGIN PAGE = 0, ALIGN(4)/* Allocate uninitalized data sections: */.stack : > RAMM1 PAGE = 1//.ebss : >> RAMLS5 | RAMGS11 | RAMGS12 PAGE = 1// Δ ↓ 这个分区大小是0xC000.ebss : >> RAMLS5 | RAMGS2 PAGE = 1.esysmem : > RAMLS5 PAGE = 1... 省略 ...
现在,我们给全局变量分配的分区最大size是49152,float数组的极限应该是49152/2 = 24576。但实验证明,float数组极限大小最多达到24544, 分区保留64个size。
也就是说float数组极限大小为:(最大分区大小 - 64)/ 2
对上述结论,我们有做了一组对比测试,把分区大小改为0xB000, [ 0xB000(h) - 64(d)] / 2 = 22496。
分别测试定义 22496大小的数组和22497的数组,编译结果如下:
22496大小的数组通过了编译,而22497大小的数组未通过编译,说明结论是成立的。
那么本文讨论的内容就到此结束了,感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。