2007/01/25
第
12回 信号処理演習
割り込み処理プログラミング
教官:小澤 助教授
本日の予定
ポーリングと割り込み
割り込み処理の仕組み
割り込み処理による
アナログループバックの作成
ボイスチェンジャーの作成
ポーリング
(Polling)
ある監視対象 X (レジスタや変数など) の値が変化したら教えてほしい 例: 電話がかかってきたら(呼び出しの電波が届いたら)教えてほしい目的
(1) X の値が期待する値になったかどうか調べる (2) もし期待する値でないならば (1) に戻るX の値が期待する値になるまで,一定の判断ルーチンを
繰り返し実行する処理のこと
期待値になるまでの間,
CPU は他の処理ができない
while ( X != 10 ) ;割り込み
(Interrupt)
ある監視対象 X (レジスタや変数など) の値が変化したら教えてほしい 例: 電話がかかってきたら(呼び出しの電波が届いたら)教えてほしい目的
(1) 別の単純な回路 A に X を監視させ,CPU には他の処理をさせておく (2) 回路 A は X の値に変化があると,CPU に通知する(割り込み信号を送る) (3) 割り込み信号を受け取った CPU は,それまで実行していた処理を中断し, 割り込みサービスルーチン (ISR) と呼ばれる関数を実行するポーリングによる
ALB
(第11回のプログラム)
through_polling.c
void main() {
while (1) /* Endless loop */
{
xn = McBSP0ReadRdy(); /* input */
yn = xn & 0xFFFE; /* Remove LSB of data */
McBSP0Write(yn); /* output */ } } DSK_polling.c short McBSP0ReadRdy() {
while ( (*(v_short *)McBSP0_SPCR & 0x2) != 0x2);
return (*(v_short *)McBSP0_DRR); }
データが受信されるまで待ち続ける
ポーリングの問題点
1つの監視対象の値を調べ続けるので,
他の仕事を
することができない
例えば...
メールの作成中に電話を受けることができない
ファイルのダウンロード中にユーザがそれを停止できない
CPU パワーを無駄に消費
電力を無駄に消費
“監視” のような単純な仕事は,CPU のような高機能な IC
ではなく,もっと単純で低消費電力の
IC に任せるべき
割り込み処理による
ALB
プロジェクト
ALB_Intr
を新規作成
以下のソースファイル群を
¥ti¥myprojects¥ALB_Intr に
保存せよ
DSK_polling.c:初期化,アナログ入出力用関数 DSK_intr.c:割り込み処理用関数 through_LED_int.c:main関数 vec_Reset_INT4_14.asm:割り込みベクタテーブルを定義 c6x11dsk.h(DSKヘッダファイル) link.cmd (Helloプロジェクトのものと同じ)<参考>教科書
「3.3 割り込みを使うプログラミング」 p.46 「B.1.7 割り込み」 p.273プロジェクト
ALB_Intr
プロジェクトには以下のファイルを登録すること
C ソースファイル
through_LED_int.c割り込みベクタテーブル
vec_Reset_INT4_14.asm C6711 用ライブラリファイル C:¥ti¥c6000¥cgtools¥lib¥rts6200.lib リンカコマンドファイル link.cmdコンパイル&(エラー修正)&ロード&実行せよ
動作確認
同時に複数の処理が実行されていることを確認せよ
処理
1:マイクから入力した音声が,スピーカから出力される
処理
2:ボード上の LED が点滅する
例えば,携帯電話で通話中にメール受信を通知するよ
うなイメージ
割り込みの流れ
(p.274, 図B.10)
割り込み要因を 割り込み 要因が発生 ユーザが許可を 与える必要がある割り込み要因
(p.276, 表B.5)
McBSP1 受信割り込み 0xF McBSP1 送信割り込み 0xE McBSP0 受信割り込み 0xD McBSP0 送信割り込み 0xC 予約 0xB 予約 0xA 予約 0x9 EDMA (0 ~ 15) 割り込み 0x8 外部割込みピン7 0x7 外部割込みピン6 0x6 外部割込みピン5 0x5 外部割込みピン4 0x4 EMIF SDRAM タイマ割り込み 0x3 タイマ1割り込み 0x2 タイマ0割り込み 0x1 ホストポートのホストからの割り込み 0x0 割り込み要因の説明 割り込み要因番号 一定時間毎に発生 音声が入力されると発生割り込み要因を
CPU 割り込みに対応づける
タイマ0割り込み0x1
McBSP0 受信割り込み0xD
割り込み要因の説明 割り込み要因番号through_LED_int.c内
void main()
{
:
INT4
INT14
割り込み要因を CPU 割り込みに対応付けCPU 割り込み
ALB_Intr の main 関数
void main() {
InitDSK(cach_bk3); /* Initialize DSK, Cashe size: 48 KByte */ IntrClearFR(); /* Clear all pending interrupts */ TimerSetStart(tm_ch0, 37500); /* period = 1 ms */ count = 0;
tmp = 0x07000000;
*(u_v_int *)IO_PORT = tmp; /* trun off LEDs */
IntrSetIER_IMUX(0xD, 4); /* Assign RINT0 to INT4 and NMIE & IER enable */ IntrSetIER_IMUX(0x1, 14); /* Assign TINT0 to INT14 and NMIE & IER enable */ IntrGEnable(); /* GIE: Global interrupt enable */
while(1) {} /* Endless loop */
}
割り込み要因が発生すると
…
割り込みサービスルーチン(
ISR)
が実行される
through_LED_int.c内
// McBSP0 へデータが届くと(INT4),呼び出される関数 interrupt void McBSP0_RX_ISR()
{
xn = McBSP0Read(); /* input */
yn = xn & 0xFFFE; /* Remove LSB of data */
McBSP0Write(yn); /* output */
割り込み要因が発生すると
…
through_LED_int.c内
// LEDを点滅させる関数(200msおき) interrupt void Timer0_ISR() { count++; /* count up to 199 */ if (count>=199) { tmp = tmp - 0x01000000; *(u_v_int *)IO_PORT = tmp; count = 0; } }
割り込み INT4, INT14 が発生したときに,どの ISR を呼び出すのか?
その対応関係を定義しているのが
.sect "vectors"
.ref _c_int00 ; C entry point
.ref _McBSP0_RX_ISR ; Entry point of McBSP0 RX intr. service routine .ref _Timer0_ISR ; Entry point of Timer0 intr. service routine
RESET: ; reset vector: address = 0x00000000 MVKL _c_int00,B0 ; B0: start address of _c_int00
MVKH _c_int00,B0
B B0 ; branch to address pointed by B0 NOP
NOP NOP NOP NOP
.space 0x20*3 ; Reserve 0x60 bytes
INT4: ; INT4 vector: address = 0x00000080 STW A0,*B15--[1] ; push A0
MVKL _McBSP0_RX_ISR,A0 ; A0: start address of _McBSP0_RX_ISR MVKH _McBSP0_RX_ISR,A0
B A0 ; branch to McBSP0 RX intr. service routine
LDW *++B15[1],A0 ; pop A0 NOP
NOP NOP 2
.space 0x20*9 ; Reserve 0x180 bytes
INT14: ; INT14 vector: address = 0x000001C0 STW A0,*B15--[1] ; push A0
MVKL _Timer0_ISR,A0 ; A0: start address of _Timer0_ISR MVKH _Timer0_ISR,A0