2014/08/17
mbed NXP LPC1768+☆board Orangeで.WAVファイルの再生(2)
「mbed NXP LPC1768+☆board Orangeで.WAVファイルの再生」の続きです。
出力のPWM値の書込処理時間短縮のために、PWM値を標準の実数値での書込みから整数値での書込みに(かなり強引な方法で)変更しました。
実数値で書込みを行った場合の割込処理時間は約7.6usでしたが、整数値での書込みにしたことで1.85usに短縮されます。
これによって、WAVファイルの読込時間が1.77msから1.21msと短くなりました。
PlayWav.cpp (2014/8/24)
変更したPWM出力部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#define BUFF_SIZE 512 unsigned char Wave_buff[BUFF_SIZE * 2]; #define PWM_CLKMHZ 24 // 24MHz #define PWM_PERIOD 22 // 22us #define PWM_RATIO (65536/(PWM_CLKMHZ*PWM_PERIOD)) int LineL_Vol = 50, LineR_Vol = 50; void PwmLR_Out(short lv, short rv) { unsigned short lw = ((lv+32768) / (PWM_RATIO+LineL_Vol)); unsigned short rw = ((rv+32768) / (PWM_RATIO+LineR_Vol)); //if (lw >= LPC_PWM1->MR0) lw = LPC_PWM1->MR0; //if (rw >= LPC_PWM1->MR0) rw = LPC_PWM1->MR0; #if defined(_ARCH_PRO) // Line_R(P2_0), Line_L(P2_1) LPC_PWM1->MR1 = lw; LPC_PWM1->MR2 = rw; LPC_PWM1->LER |= ((1 << 1) | (1 << 2)); #else // Line_R(p21), Line_L(p22) LPC_PWM1->MR6 = lw; LPC_PWM1->MR5 = rw; LPC_PWM1->LER |= ((1 << 6) | (1 << 5)); #endif } #define _WS16(v) *(int16_t*)&Wave_Buff[v] void ISR_Tick(void) { if (bufGP != bufPP) { statLED2 = LHigh; switch (Wave_bits) { case 8: // (omitted) break; case 16: if (Wave_chs > 1) { PwmLR_Out(_WS16(bufGP), _WSV(bufGP + 2)); bufGP += 4; } else { PwmLR_Out(_WS16(bufGP), _WSV(bufGP)); bufGP += 2; } break; } if (bufGP >= (BUFF_SIZE * 2)) bufGP = 0; statLED2 = LLow; } } |
処理時間計測
上記の「mbed LPC1768」+「☆board Orange」で実行したときの処理時間を再計測しました。
SD上の.WAVファイルの読込処理時間観測(LED1の波形)
読込時間は約1.21msとなり、読込み以外の処理に使える時間は約57%あります。
PWM出力処理時間観測(LED2の波形)
PWM間隔は22usとしました、割込み処理時間は1.85usになっています。
(赤色がLED2の波形、黄色はPWM出力の波形です)
コメント:0