ターミナルへの表示
ここまでは,C言語でプログラムを書く前に知っておくべき予備知識を学んできた.ここからはプログラムを作り,実際にミームスを動かしていく.
まず,PC上の hterm 上への表示と,キーボードからの読み込みを行うプログラムを作成する.
この仕組みを用いることにより,今後のプログラム開発中に「変数の値を知りたい」などの要求にこたえることができるようになる.
プログラムの仕組み
「マイコンの開発環境の構築」の回で説明したように,モニタプログラムには printf( )と scanf( ) 関数が組み込まれている.ハードウェアごとに異なる標準入出力に対して,標準ライブラリでは対応できないので,MEMEsのモニタプログラムに組み込まれている関数の実体を使用するのである.
ユーザプログラムの中で printf( ) や scanf( ) を使用したときに,標準ライブラリを呼び出すのではなく,図1のようにモニタプログラム中の printf( ) や scanf( ) を呼び出すようにするというのが今回の重要なポイントとなる.
図1:printf と scanf の実体
printf( ) のテスト
まず printf( ) 関数の簡単な動作確認を行う.すでに説明したように,モニタプログラム内の printf( ) を呼び出すと,表示される情報はSH7085 の SCI モジュールからシリアル通信データとして出力され,シリアルーUSB変換 IC により USB に変換され,PCへと送信され,hterm 上に表示されるのである.
ワークスペースを開く
まず,下記のワークスペースをダウンロードして,C:¥Workspace に展開する.
次にHEWを起動して,[ファイル]メニューの[ワークスペースを開く]をクリックして
C:¥Workspace¥TERMINAL_prog¥TERMINAL_prog.hws
というファイルを開く.
このワークスペースには,2つのプロジェクトが入っているので,図2のようにTERMINAL_prog1というプロジェクトを有効にする.これを [アクティブプロジェクトに設定]と言う.
図2:2つのプロジェクトが存在
具体的には,図3のようにHEW画面の左側で,TERMINAL_prog1 を右クリックして[アクティブプロジェクトに設定]を選択する.すると選択されたプロジェクトが太字になるので,選択されたことが確認できる.
図3:アクティブプロジェクトに設定
アクティブプロジェクトに設定後,[F7] キーを押すか,図4のように[ビルド]メニューからビルドをクリックしてソースファイルをコンパイルし,必要なライブラリと結合してSH7085 が実行できる形式のファイルを作成する.
図4:ビルド
ビルドで出来上がったファイルを,htermとモニタプログラムの機能を使って,MEMEs の SRAM にダウンロードし実行させる.
hterm を起動し,MEMEs と接続し電源を投入する.モニタプログラムの起動メッセージが表示される.
[F9] を押すか,図5のように[コマンド]メニュー内の [Load] をクリックし,ファイルを選択する.選択するファイルは,
C:¥WorkSpace¥TERMINAL_prog¥TERMINAL_prog1¥Debug¥TERMINAL_prog1.mot
である.
図5:hterm からプログラムのダウンロード
ダウンロードするファイルは,図6のように C:¥WorkSpace¥「ワークスペース名」¥「プロジェクト名」¥Debug の中に作成される.
図6:ダウンロードファイルの選択
ダウンロードするファイルの拡張子は,mot である.図7のように「ファイルの種類」を mot にしておくと良い.デフォルトでは,拡張子は abs となっている.
図7:拡張子の変更
ダウロードが終了したら,図8のように,コマンドメニューから「GO」を選択するか,[F5]キーを押すと実行される.
図8:プログラムの実行の様子
TERMINAL_prog1.c のリスト
/* * TERMINAL_prog1.c : printf()関数のテストプログラム */ #define printf ((int (*)(const char *,...))0x00007c7c) #define scanf ((int (*)(const char *,...))0x00007cb8) void main(void) { printf("Hello Worldn"); }
プロジェクトはいくつかのCソースコードやヘッダファイルなどで構成されているが,プログラミングの対象は主に”TERMINAL_prog1.c”である.HEW画面の左側にあるファイル名をダブルクリックすることにより,表示/編集できるようになる.
このプログラムの要点は,5行目と6行目である.printfを0x00007c7c番地へのポインタと定義している.同様にscanfを0x00007cb8番地へのポインタとしている.これにより,ソースコード中のprintfは0x00007c7c番地を呼び出すようになる.
printf( ) の引数である文字列を変更することにより任意の文字列を表示可能なので,ソースコード修正→コンパイル→ダウンロード→実行,を繰り返し,各自試してみること.
printf( ) を実行し終わると,main( ) は終了する.main( ) 自体も関数であるので,終了すると呼び出し元へ戻るはずである.組込みプログラムの場合は,通常main( ) は無限に続くように作るか(電源が入っている限り,機器を制御し続ける),安全な状態を作ってスリープまたはHaltするようにしておく.
今回のプログラムは,main()の呼び出し元である”resetprg.c”を確認すると,main()が終了するとwhile(1);文で無限ループするようになっている.
PCのプログラムであれば,ウィンドウを閉じて終了,となるのだが,組込みプログラムの場合は,main()が終了しても装置が不安定な状態にならないように考慮が必要である.
演習問題
- printf( ) 関数を使用して,hterm 上に1, 2, …, 100 の数字を出力するプログラムを作成せよ.
- プロジェクト(TERMINAL_prog2)をアクティブプロジェクトにして,TERMINAL_prog2.c のmain ( ) 関数にhterm から入力された文字列をそのまま出力するプログラムを下記の実行例を参考にして作成せよ.
図9:実行例