所使用的mm32芯片是32 位 ARM Cortex TM-M3 的处理器内核,128K 字节的闪存程序存储器,20K 字节的 SRAM。在进行音频程序移植的过程当中,音频程序原本是在512K的stm32的单片机上运行,而现在是在mm32上运行,那所谓的连接错误,其实就是空间不足的体现。由于空间不足,导致内部的很多地址全部都是错误的,导致指针根本无法使用。在前面调编译等级的方法其实就是让编译器自动优化代码,使代码减少占用的空间,系统会自动删除掉系统认为不重要的代码。在代码不严谨的情况下,很容易出很大的问题。
![baddbfac710ff22c249d2d88d05a389a.png](https://i-blog.csdnimg.cn/blog_migrate/6ef0a2c37cd47f127bc453a6356ad222.jpeg)
找到了所存在的问题,那么就对整个程序进行裁剪,整个程序实现的功能非常的多,有各种音频的切换,现在只是使用一个固定的音频进行播放,所以有很多不需要的功能。并且程序中有非常多的静态数组,静态数组在内存中位于栈区,在定义的时候就已经给分配好了大小,这样的定义非常占用内存空间,所以重点就是找出不用的静态数组,将其删除。
![bc2fb6014db0153f0cdc939920550d7f.png](https://i-blog.csdnimg.cn/blog_migrate/c66c416c5bf8e332a66dfa0dbb67c026.jpeg)
通过OUTPUT.map这个文件中的相关信息,看齐内存占用的大小,来减少空间的占用。先将其空间降低到128K以内。
![8c5c6f0fef06354af7042138ec7789db.png](https://i-blog.csdnimg.cn/blog_migrate/0cb05b60109f360e083143d790d560da.jpeg)
在进行调试发现还是会产生硬件错误,直接停在下图HardFault_Handler的B位置。
![ab8229d4a0ea11821af08471022a4e41.png](https://i-blog.csdnimg.cn/blog_migrate/11bb35f5bf3d5f488b462e6bfed01664.jpeg)
在细细查看,发现还是地址问题,指针还是会产生变化。首先想到的是内存占用的问题,可能还是占用空间过大,于是在进行程序删减,找到一切能删除的代码,进行注释。到最后占用flash有大约70K。在进行调试,发现还是不能继续向下进行,地址依然会改变。于是只能重新定义一个变量,先记录下来当前变量的地址,在函数调用它之前,重新赋值一下,发现问题可以解决。接下来,慢慢对不符合的地方进行重新赋值,发现,整个程序已经可以正常运行。
![d80bd631e481200ab8d9ae5726578a65.png](https://i-blog.csdnimg.cn/blog_migrate/01f1a9f44d13e737ee6aeb9fced3b2d3.jpeg)
编译等级修改之后,导致整个程序无法正确执行,在进行调试的时候,发现很多的代码都不走,也很难发现程序所存在的问题,导致走了很多的弯路。在程序中间又修改了很多,所以只能够重新进行移植。在地址发生改变的问题当中,我发现在执行子函数的时候,内部定义的一些变量的空间与原来的地址发生了冲突,导致了地址混乱发生错误。目前的处理方法主要就是,先把地址保存一下,在进行重新赋值。可能程序在压栈的时候出现了问题,也可能是程序跑飞等原因。