2012年04月13日
PARTNER-JetでU-bootを追いかける(2)
昨日の再掲です。
U-bootのシリアルコンソールにプロンプトが出たところでEscを押して止めたところ。(クリックで拡大表示)
ファンクションキーF3を押してソースコード表示に切り替えたところ。(クリックで拡大表示)
char NS16550_getc (NS16550_t com_port) { while ((com_port->lsr & LSR_DR) == 0) { #ifdef CONFIG_USB_TTY extern void usbtty_poll(void); usbtty_poll(); #endif } return (com_port->rbr); }
while文の中でシリアルコントローラのレジスタの受信データ有りのビットが立つのを待っています。
割り込みを使わずにシリアルインターフェイスから受信するときによくある手順です。
その上にある NS16550_putc はシリアルインターフェイスにデータを送信する関数です。ここにブレークポイントを設定してみましょう。
行番号のところをクリックするだけです。
行番号が細字になっている行は、それに対応するコードが存在しないことを示しています。
コンパイラの最適化によって不要になってしまった部分や#ifdefの条件コンパイルで外れている部分です。
関数NS16550_getcのところでは、CONFIG_USB_TTYは定義されていないことがわかります。
これでGo させると、(緑の三角形をクリックするか、コマンドウインドウで g を入力。)
NS16550_putc のところでブレークします。
バックトレースは画面右下に表示されています。
バックトレース画面の行をダブルクリックすると、その部分がコードウィンドウに表示されます。
NS16550_putc+C(com_port=*E1030000,c=D) _serial_puts+18(s=*4109A3BE "\r\n\0",port=2) fputs+24(file=E1030000,s=*0000000D "\xE5\x14\xE5\x14..") readline_into_buffer+A8(prompt=*41099AEA "KZM-A9-D..",buffer=*410A0380 "\0") main_loop+F0() start_armboot+1C4()
ソースコードを見るときには、まずこのスタックトレースに出てきた関数から見ていくとよいです。
(続く。)