以前,为了定义一个大的全局数组,我们已经探过一条路DSP_cmd学习1_定义一个大的全局数组_dsp将数字读入数组-CSDN博客
而本篇文章将会尝试一个更灵活的操作, 看能否将上一篇全局数组的极限进一步提升(不能)。
不卖关子了,这个更灵活的、令人恍然大悟的操作就是:page0可用的富余存储空间是可以定义在page1的。
本文结论:page0和page1的内存确实是可以灵活地匀点给对方的,但FLASH不能用来存储全局变量。所以本文尝试的操作并不能进一步提升全局数组的极限。
着急解决问题的,不用往下看了。 闲来无事的最强摸鱼王可以继续往下看,当个趣闻看就行。
以前我们的操作是在page1里面把富余存储空间全部叠加在RAML4上,然后全部给.ebss分区(这个分区就是管全局变量的)
图中上面红色框中,将RAML5~RAML7的存储空间全部叠加到了RAML4。RAML4的length从0x1000变成了0x4000。全局变量的存储空间扩大到了原来的4倍。这样的做法,基本上已经是只在page1里面操作的极限了(这确实就是操作极限了,别折腾了)。
1 探索实验1
以前我做过这样一个探索,就是我把page0的分区扩大,然后给这个.ebss用。
如果目前的全局变量需要的存储空间不超过 RAML4,编译只会报一个warning。
但是如果目前的全局变量需要的存储空间超过了RAML4,编译就会报错了。
因为.ebss指定的分页是page1,而FLASHH的分页是是page0。 所以编译的时候,程序是在page1里面找不到FLASHH的,更别说用上他的空间了。
2 探索实验2
根据上一个实验的结果,这样,我可不可以把.ebss指定的分页,换位page0呢?让我们来进一步实验。
编译神奇的通过了。实验到这里的时候,可能大家觉得,难道修改page1为page0这样的操作也可以? 然而事实并不像你想象的那么简单。 把编译好的程序烧写到dsp进行仿真的时候,我们发现,程序并不能正常运行,所有的数据全部变成了NaN。
也就说,这种操作也是不行了。
3 探索实验3
在进行探索实验3之前,我给大家看两段注释
这两段注释给了我们两个信息
- 第一个信息是page0是程序内存,page1是数据内存。.ebss是管全局变量的,全局变量自然是数据内存。 因此我们只能将page1的内存分配给它。
- 第二个信息是page0的内存可以moved to PAGE1用于数据分配,page1的内存也同样可以moved to PAGE0用于程序分配。 这个信息也就是本文所要讲的令人恍然大悟的信息了。
你看,其实人家的注释早就把事情给我们说清楚了。然后我现在才醒悟。 我们来做个测试吧
编译通过了, 运行程序测试一下(上面真的的一顿分析、一顿操作猛如虎)
结果还是有问题, 全局变量还是不能存数据(结果伤害却只有250)
总结:写这篇文章的起因是昨天听某个前辈给我讲他对cmd的操作,我一听恍然大悟,然后今天打算验证一下然后写篇文章把好东西分享给大家。结果通过几组严谨的实验,发现这个操作并不能如我的愿,这件事告诉我们:code is cheap,show me the result。 代码谁都会写,但结果好不好就不知道了。
如果不喜欢这篇文章的,请给我点个赞,我先看看有多少摸鱼的。