中科蓝讯 SDK 开发——编译提示 region overflowed

    在前一篇博文 《中科蓝讯 SDK 开发——中断使用中的重启问题》 中有跟大家提到在中科蓝讯的芯片程序编写时需要注意 com 区和 bank 区,其中 com 区的程序代码会在代码运行前加载到芯片的 RAM 中并且常驻在 RAM 中,也就是说在芯片的 RAM 中是有一部分固定的空间来分配给 com 区的,这一部分空间的大小我们是不能随意去改动的。
一、RAM 空间的查看

    首先,在使用 SDK 开发的过程中可以通过查看 SDK 中 ram.ld 文件了解 RAM 中区域的分配情况,平时开发过程中最常涉及到的就是 com 区和 data 区,以 BT892xA2 为例,在 ram.ld 文件中可以查看到 com 区和 data 区的大小分配情况。

          

    在 MEMORY 中可以看到 RAM 的其他分配情况。

          

二、编译提示 region overflowed

    当我们在开发的过程中发现工程编译时报错 riscv32-elf-ld.exe: region ‘xxx’overflowed by yyy bytes ,这时就说明 xxx 区域中的内容已经超出了原区域分配的大小,这种情况通常就会出现在 com 区和 data 区中,一个是当我们添加过多的功能代码到 com 区时就会导致 com 的溢出。data 区的分配通常会比较小,用于存放全局变量或数组,在程序编写的过程中,没有对定义的全局变量或数组去指定存放的位置(可以指定这部分变量或数据放到某个有剩余 ram 的区域中),那么就会默认放在 data 区中,一旦定义的变量或数组过多,就会导致 data 区域溢出。

          

 三、解决 region overflowed

    那么在实际开发中,遇到了 region overflowed 情况应该怎么办呢?首先是 data 区域的溢出,要确保我们在代码中定义的全局变量和数组是不是必须的,如果有些只是用于某个功能的测试,那么在我们测试完后记得将不需要的变量或数组删去,但是需要注意千万不能因为定义的全局数组过大导致区域溢出,就将这个大数组挪到函数中变成局部变量,可以看到 ram.ld 中分配的栈大小为 1k,定义大的局部变量容易导致爆栈。当全局数组过大没办法避免时,我们可以查看其他的 ram 分区是否还有空间,将数组指定到对应的 ram 区域中,例如 AT(.com_text) u8 test[]; 将其放入 com 区中,当然如果 com 区中本来空间就很紧张那么可以考虑放入其他的 ram 区域中,具体的空间剩余情况可以在工程的 bin 文件夹查看 map.txt 文件。



         

    对于 com 区溢出,通常可以从一下几个方面着手,第一,先确认是否需要将代码放入 com 区,通常是中断等需要较快相应的函数会放入 com 区中,其他的一些在开发过程中添加的功能代码,可以判断下是否需要放入 com 区,这样可以节省一些空间。

    第二,修改删减一些没有用到的功能,通过 map 文件查看 com 区中的内容,根据 ram 中的定义,从 0x17000 开始往后的 36K 就是 com 区的全部内容,在 map 文件中查看 com 区是否包含不需要的功能,然后在工程代码中进行屏蔽。

          

     第三,将 com 区中的一些内容移到其他区域,跟 data 区溢出时的解决方式类似,查看其他的 ram 区域是否还有多余的空间来存放 com 区中多出的内容,这里大家可以注意因为 com 是 512 对齐的,当我们想要了解 com 究竟溢出多少时,可以将 512 对齐注释掉,重新编译可以看到具体溢出的大小。

          

    最后,则是对代码进行精简和优化,在确保功能的情况下,对代码进行精简,节省代码占用的空间,如果还是溢出,则可以求助原厂对库进行优化修改,得到更大的 com 空间,好了以上就是今天分享的全部内容,如果有错误或者不足的地方欢迎大家在评论区中提出讨论,共同学习。


[1] 蓝皮书:芯片框架简述                                                                     — 中科蓝讯

[2] 中科蓝讯蓝牙:公共区(com 区)空间不够一般优化方案,https://blog.csdn.net/m0_46079499/article/details/103895474

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论