前段时间将UCOS/MINIGUI移到2440上,最近在搞驱动,但音频驱动调试正常后, 将LIBMAD移到板子上遇到了麻烦.
首先是在ADS上移了LIBMAD(移植起来方便),编绎后速度很快(用-O2优化),播放没有问题,但用arm-elf-gcc -O2编绎后,LIBMAD解码速度跟不上,不知其原因,找了好久,各种可能都想到了,更换编绎器版本,在不同的平台上编绎,还是找不到原因,后面忽然试着将-O2改成-O1编绎LIBMAD库后,下到板子上,播放正常了.这就让人感觉有点摸不着头脑了.
照理说,-O2优化应该经-O1优化更好,为什么解码速度会跟不上呢?
后来试着用-O2先将所有LIBMAD的源文件都编绎成.o(此时编绎出来是不能正常播放的),再逐个将源文件用-O1编绎(编绎一个.c文件,就要试一次,这样一个一个排除),后面发现synth.c这个文件用-O1编绎后(其它.c文件都是-O2优化),播放正常.看来问题就在synth.c这个文件里面.但我到现在没有找到为什么会这样,只是简单地看了一下-O2/-O1编绎出来的反汇编文件,发现在-O2时,会有很多栈操作,而同样的代码在-O1时大多用的是寄存器操作,至于为什么会这样,正在研究当中,如有结论再贴出来分享.