第 12 回 信 号 処 理 演 習 割 り 込 み 処 理 プログラミング 教 官 : 小 澤 助 教 授 渡 邉 ( 非 常 勤 講 師 ) 2007/01/25
本 日 の 予 定 ポーリングと 割 り 込 み 割 り 込 み 処 理 の 仕 組 み 割 り 込 み 処 理 による アナログループバックの 作 成 ボイスチェンジャーの 作 成 2
ポーリング (Polling) 目 的 ある 監 視 対 象 X (レジスタや 変 数 など) の 値 が 変 化 したら 教 えてほしい 例 : 電 話 がかかってきたら( 呼 び 出 しの 電 波 が 届 いたら) 教 えてほしい (1) X の 値 が 期 待 する 値 になったかどうか 調 べる (2) もし 期 待 する 値 でないならば (1) に 戻 る while ( X!= 10 ) ; X の 値 が 期 待 する 値 になるまで, 一 定 の 判 断 ルーチンを 繰 り 返 し 実 行 する 処 理 のこと 期 待 値 になるまでの 間,CPU は 他 の 処 理 ができない 3
割 り 込 み (Interrupt) 目 的 ある 監 視 対 象 X (レジスタや 変 数 など) の 値 が 変 化 したら 教 えてほしい 例 : 電 話 がかかってきたら( 呼 び 出 しの 電 波 が 届 いたら) 教 えてほしい (1) 別 の 単 純 な 回 路 A に X を 監 視 させ,CPU には 他 の 処 理 をさせておく (2) 回 路 A は X の 値 に 変 化 があると,CPU に 通 知 する( 割 り 込 み 信 号 を 送 る) (3) 割 り 込 み 信 号 を 受 け 取 った CPU は,それまで 実 行 していた 処 理 を 中 断 し, 割 り 込 みサービスルーチン (ISR) と 呼 ばれる 関 数 を 実 行 する 4
ポーリングによる 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); } データが 受 信 されるまで 待 ち 続 ける その 間, 他 の 処 理 を 実 行 することはできない 5
ポーリングの 問 題 点 1つの 監 視 対 象 の 値 を 調 べ 続 けるので, 他 の 仕 事 を することができない 例 えば... メールの 作 成 中 に 電 話 を 受 けることができない ファイルのダウンロード 中 にユーザがそれを 停 止 できない CPU パワーを 無 駄 に 消 費 電 力 を 無 駄 に 消 費 監 視 のような 単 純 な 仕 事 は,CPU のような 高 機 能 な IC ではなく,もっと 単 純 で 低 消 費 電 力 の IC に 任 せるべき 6
割 り 込 み 処 理 による 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 7
プロジェクト ALB_Intr プロジェクトには 以 下 のファイルを 登 録 すること C ソースファイル through_led_int.c 割 り 込 みベクタテーブル vec_reset_int4_14.asm C6711 用 ライブラリファイル C: ti c6000 cgtools lib rts6200.lib リンカコマンドファイル link.cmd コンパイル&(エラー 修 正 )&ロード& 実 行 せよ 8
動 作 確 認 同 時 に 複 数 の 処 理 が 実 行 されていることを 確 認 せよ 処 理 1:マイクから 入 力 した 音 声 が,スピーカから 出 力 される 処 理 2:ボード 上 の LED が 点 滅 する 例 えば, 携 帯 電 話 で 通 話 中 にメール 受 信 を 通 知 するよ うなイメージ 9
割 り 込 みの 流 れ (p.274, 図 B.10) ユーザが 許 可 を 与 える 必 要 がある 割 り 込 み 要 因 が 発 生 割 り 込 み 要 因 を CPU 割 り 込 み INT4 ~ 12 に 変 換 INT4 ~ 12 に 対 応 するビットが 1 に ( 記 録 係 ) すべての 割 り 込 みの 許 可 / 不 許 可 フラグ ( 大 元 締 ) 個 別 の 割 り 込 み (INT4~15) の 許 可 / 不 許 可 フラグ マスカブル 割 り 込 みの 許 可 / 不 許 可 フラグ ( 子 元 締 ) 10
割 り 込 み 要 因 (p.276, 表 B.5) 割 り 込 み 要 因 番 号 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA 0xB 0xC 0xD 0xE 0xF 割 り 込 み 要 因 の 説 明 ホストポートのホストからの 割 り 込 み タイマ0 割 り 込 み タイマ1 割 り 込 み EMIF SDRAM タイマ 割 り 込 み 外 部 割 込 みピン4 外 部 割 込 みピン5 外 部 割 込 みピン6 外 部 割 込 みピン7 EDMA (0 ~ 15) 割 り 込 み 予 約 予 約 予 約 McBSP0 送 信 割 り 込 み McBSP0 受 信 割 り 込 み McBSP1 送 信 割 り 込 み McBSP1 受 信 割 り 込 み 一 定 時 間 毎 に 発 生 音 声 が 入 力 されると 発 生 11
割 り 込 み 要 因 を CPU 割 り 込 みに 対 応 づける 割 り 込 み 要 因 番 号 割 り 込 み 要 因 の 説 明 CPU 割 り 込 み 0xD McBSP0 受 信 割 り 込 み INT4 0x1 タイマ0 割 り 込 み INT14 through_led_int.c 内 void main() { : InterSetIER_IMUX(0xD, 4); InterSetIER_IMUX(0x1, 14); : 割 り 込 み 要 因 を CPU 割 り 込 みに 対 応 付 け 12
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 */ 注 目! 割 り 込 み 要 因 の 対 応 づけ 13
割 り 込 み 要 因 が 発 生 すると 割 り 込 みサービスルーチン(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 */ } 14
割 り 込 み 要 因 が 発 生 すると 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 を 呼 び 出 すのか? その 対 応 関 係 を 定 義 しているのが 割 り 込 みベクタテーブル vec_reset_int4_14.asm 15
.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 B A0 ; branch to Timer0 intr. service routine LDW *++B15[1],A0 ; pop A0 NOP NOP NOP 2
本 日 の 課 題 プログラムの 理 解 AD/DAを 行 う 関 数 内 で 信 号 処 理 を 行 わせる 割 り 込 みによるボイスチェンジャープログラムを 作 成 440Hz の 正 弦 波 を 掛 け 合 わせてみよ 100Hz の 正 弦 波 を 掛 け 合 わせてみよ 1000Hz の 正 弦 波 を 掛 け 合 わせてみよ 17
レポート 課 題 C 言 語 の Signal 関 数 について 調 べ,A4 1 枚 にまとめよ.OS を 明 記 すること. 信 号 処 理 テキスト p.124 図 7.1 を 他 者 に 説 明 するつもりで 解 説 せよ(A4,1 枚 ) 時 間 波 形 の 特 徴 変 換 名, 変 換 式 スペクトルの 特 徴 18