错误现象见下面:
出了一个buserr,又是我们熟悉的0xdeadbaad,进程自杀。
这个进程退出了,android还是能正常起来。
问题大家跟踪了很久没有发现原因,最后倒内核版本发现是内核配置了一个宏引起的,CONFIG_ARCH_USES_GETTIMEOFFSET。
该宏是干嘛的呢,就是在gettimeofday获得时间的时候会调用一个arch_gettimeoffset函数,用来获得比一个时间片更小的时间,简单的说就是获得获得更精确的时间。
问题来了,配了这个宏为什么会导致这个音频的进程退出呢?又琢磨了一段时间,经过大胆的尝试,发现当连续两次获得时间,第二次时间比第一次时间小的时候,就会触发这个buserr。
然后就怀疑到gettimeofday的问题了,写了一个小case,发现连续gettimeofday,第二次的时间有时候会比第一次小。
接着把timer中断的频率还改成4ms一次,原先是10ms一次,就不会出现这个问题了。
在V10的板子上发现一个现象,就是当总线频率为40M的时候没有问题,总线频率为45M以上就会有问题。
这个是个关键的发现,从而怀疑到了数据溢出的问题。
见下:
是timer驱动(arch/csky/silan_suv3/timer.c)中的函数csky_timer_offset出错。
如下图1,当“tcn”大于429496时,“tcn”乘以“1000000 / HZ”会导致结果数值超过unsigned long型的0xffffffff,导致溢出,从而出错。(乘法操作对应于图2反汇编红框部分)
I/AwesomePlayer( 544): track of type 'audio/vorbis' does not publish bitrate arch/csky/kernel/traps.c(131): Bus Error Trap CURRENT PROCESS: COMM=.vorbis.decoder PID=666 TEXT=00008000-00008d8c DATA=00009000-00009184 BSS=00009184-000fa000 USER-STACK=7fd3ec60 KERNEL-STACK=92b494c0 PC: 0x2ab34868 orig_a0: 0x0000016c PSR: 0x00020140 r0: 0x0000016c r1: 0x00000027 r2: 0x00000000 r3: 0x00000000 r4: 0x2d23a88c r5: 0x000007cc r6: 0x2ab9b000 r7: 0x2ab336b0 r8: 0x00000000 r9: 0x2d23ad58 r10: 0x2b296a0c r11: 0x00000084 r12 0x00000000 r13: 0xdeadbaad r15: 0x2ab34860 r16:0x000cfae8 r17: 0x000cfafc r18: 0x00000001 r19: 0xffffe6b0 r20 0xffffe6b8 r21: 0xffffe6c0 r22: 0x2ab16340 r23: 0x0000008a r24 0x0000000b r25: 0x00000001 r26: 0x00000000 r27: 0x00000000 r28 0x2ab8e684 r29: 0x00000000 r30: 0x00000000 r31: 0x2d23af00 hi 0x0000832b lo: 0x196e9c09 CODE: 2ab34848: d27c3001 7bd10824 e9039263 ea12ffcd 2ab34858: d7810001 7bcd0832 0021ea8d 11013127 2ab34868: 0000dc2d 0827d01c ea8c7bdd d19c001f 2ab34878: 31060826 33007bd9 1000ea39 0000ea17 KERNEL STACK: 92b4df30: 000cfae8 000cfafc 80002b8a 803b2388 92b4df40: 92b4df40 92b4deb8 00000004 2d23af00 92b4df50: 00009184 000fa000 92b4df70 000007cc 92b4df60: 2ab9b000 80002e34 2d23a88c 800009c2 92b4df70: 2ab34868 0000016c 00020140 0000016c 92b4df80: 00000027 00000000 00000000 2d23a88c 92b4df90: 000007cc 2ab9b000 2ab336b0 00000000 92b4dfa0: 2d23ad58 2b296a0c 00000084 00000000 92b4dfb0: deadbaad 2ab34860 000cfae8 000cfafc 92b4dfc0: 00000001 ffffe6b0 ffffe6b8 ffffe6c0 92b4dfd0: 2ab16340 0000008a 0000000b 00000001 92b4dfe0: 00000000 00000000 2ab8e684 00000000 F/SoftVorbis( 544): frameworks/base/media/libstagefright/codecs/vorbis/dec/SoftVorbis.cpp:272 CHECK_EQ( 0,_vorbarch/csky/kernel/traps.c(131): Bus Error Trap