5.06.2010

Log : trace tcpmp exception on CE 6.0 - remove exception

只好啟動 KITL,作 單布執行。
  • enable debug ouput ,rebuild all。
  • copy all the files in release folder (其實重要的是 pdb) to WINCE600 project release folder
  • copy language filt (*.txt) to release WINCE600 project release folder
  • 啟動 KITL 連線,設定 player.exe, common.dll, interface.plg 都由 release folder 取得
  • 啟動 target control,s player.exe
  • 選一個 mp3 file
  • exception 發生!!
  • 從 call stack 看exception 位置
查到是 common\pcm\pcm_soft.c 的 PCMConvert( ),在執行
p->Entry(p,Dst,Src,*DstLength,&p->State,Volume);

中 發生 exception。

trace code,看到 pcm_arm.c
這個好像是在作 arm assembler.....
            CodeStart(&p->Code);
PCMCompile(p);
CodeBuild(&p->Code);
if (p->Code.Size)
p->Entry = (pcmsoftentry)p->Code.Code;
其中 PCMCompile()..
    // dst pointers
I2C(LDR,R11,R1,0);
I3(ADD,R14,R11,R3); // dstend

// src pointers
I2C(LDR,R9,R2,0);

I2C(LDR,R4,SP,OFS(stack,State));
I2C(LDR,R7,R4,OFS(pcmstate,Step));
I2C(LDR,R8,R4,OFS(pcmstate,Pos));

不知道這一段 assmbly code 為什麼不能在 CE 6.0 (或是因為 arm11 的關係?)。
在播放wav時,entry( ) 的內容是:
10A0000 00000000             andeq       r0, r0, r0
010A0004 00000000 andeq r0, r0, r0
010A0008 00000000 andeq r0, r0, r0
010A000C 00000000 andeq r0, r0, r0
010A0010 E59D4028 ldr r4, [sp, #0x28]
010A0014 E5947004 ldr r7, [r4, #4]
010A0018 E5948008 ldr r8, [r4, #8]
010A001C E59D002C ldr r0, [sp, #0x2C]
010A0020 E3570C01 cmp r7, #1, 24
010A0024 1A000006 bne 010A0044
010A0028 E0D920F2 ldrsh r2, [r9], #2
010A002C E0020290 mul r2, r0, r2
010A0030 E1A02442 mov r2, r2, asr #8
010A0034 E0CB20B2 strh r2, [r11], #2
010A0038 E15B000E cmp r11, lr
010A003C 1AFFFFF9 bne 010A0028
010A0040 E8BD9FF0 ldmia sp!, {r4 - r12, pc}
010A0044 E1A03428 mov r3, r8, lsr #8
010A0048 E1A03083 mov r3, r3, lsl #1
010A004C E19920F3 ldrsh r2, [r9, +r3]
010A0050 E0888007 add r8, r8, r7
010A0054 E0020290 mul r2, r0, r2
010A0058 E1A02442 mov r2, r2, asr #8
010A005C E0CB20B2 strh r2, [r11], #2
010A0060 E15B000E cmp r11, lr
010A0064 1AFFFFF6 bne 010A0044
010A0068 E8BD9FF0 ldmia sp!, {r4 - r12, pc}

所以這一段不用 assembly code 改用 UniversalType( )
#if 0 //(defined(ARM) || defined(SH3) || defined(MIPS)) && defined(CONFIG_DYNCODE)
CodeStart(&p->Code);
PCMCompile(p);
CodeBuild(&p->Code);
if (p->Code.Size)
p->Entry = (pcmsoftentry)p->Code.Code;
#else
p->SrcType = UniversalType(&p->Src);
p->DstType = UniversalType(&p->Dst);
p->Entry = PCMUniversal;
還要記得把 UniversalType( ) 的 define guard um-comment 掉。

!!這樣就可沒有 exception 了。

沒有留言: