酔漢電子工作手帳

2007-02-24

小さなプログラム

| 09:23 | 小さなプログラム - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 小さなプログラム - 酔漢電子工作手帳

PizzaFactoryが生成してくれるプログラムを基に、もっと小さなTOPPERS/JSPプログラムを作ってみました。

プロジェクトのコピー

最初にプロジェクトをコピーします。プロジェクト・ビューの中で基となるプロジェクトを右クリックし、copyを実行します。次に同じビューの中でpasteを実行します。プロジェクト名を聞いてきますので適当に付け直してください。デフォルトではプロジェクト名がフォルダ名になります。私はarm_sample02にしました。

コピーが終わるとビルドが始まります。ビルド時のパラメータは、すべてもとのプロジェクトのものをそのまま引き継いでいますので、ビルドは問題なく通るはずです。ただし、生成ファイルの名前まで基のプロジェクトと同じなので、これは変更します。具体的にはプロジェクトのpropertiesを開き、C/C++ Build ⇒ Build Steps ⇒ Build output ⇒ Artifact nameを、変更します。私はプロジェクト名と同じくarm_sample02にしました。

コンフィグレーション・ファイル

コンフィグレーション・ファイルはタスクセマフォといったTOPPERS/JSPの資源を、プログラム実行前に静的に用意しておくためのものです。TOPPERS/JSPはコンフィグレーターを使ってこのファイルから、タスクセマフォなどの基本的な資源をあらかじめ生成します。

_MACRO_ONLYは、「プロトタイプ宣言を解釈できない」という意味の宣言です。

/* sample1.cfg */
#define _MACRO_ONLY
#include "sample1.h"

INCLUDE("\"sample1.h\"");
CRE_TSK(
	MAIN_TASK, { 	/* タスクを作る */
		TA_HLNG|TA_ACT,   /* 高級言語で記述。最初からアクティブ */
		0,                /* パラメータは渡さない*/
		task,             /* タスク実体の関数はtask() */
		PRIORITY,         /* 初期優先順位 */
		STACK_SIZE,       /* スタックサイズ(byte) */
		NULL              /* スタックはシステムが割り当てる */
		}
	);

    /* 必須機能 */
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/timer.cfg"
    /* 定番補助タスク */
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/serial.cfg"
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/logtask.cfg"

ヘッダ・ファイル

カーニハン&リッチーの"Programming Language C"に掲載されていた"Hello, World"プログラムは、独自のヘッダ・ファイルを持ちませんでした。TOPPERS/JSPアプリケーションでは必ず持ちます。なぜならば、コンフィグレータが吐き出したヘッダ・ファイルを必ず読まなければならないからです*1。また、コンフィグレータに読ませるためのヘッダ・ファイルも必要になります。

以下のヘッダ・ファイルは、コンフィグレータに読ませるためのものです。アプリケーションでも読み込みます。スタック・サイズ、タスク優先順位、タスクの実体となる関数プロトタイプ宣言を有しています。スタック・サイズやタスクの優先順位はコンフィグレーション・ファイルに直接定数を書いてもかまいません。しかし、関数の宣言だけはヘッダ・ファイルで行います。

/* sample1.h */
#include <t_services.h>

#define PRIORITY        5       /* タスク優先順位 */
#define STACK_SIZE    256       /* タスクスタック */
#ifndef _MACRO_ONLY
	extern void	task(VP_INT tskno);
#endif

プログラム

実行プログラムの本体です。t_services.hは、TOPPERS/JSPの資源を宣言するヘッダ・ファイルです。kernel_id.hは、コンフィグレータが生成するファイルです。

printf()関数は使えませんので、代わりにsyslog()関数を使います。syslog()関数シリアル・ポートに文字列を出力します。

PizzaFactoryが自動生成するADuC7026用のコンフィグレーションでは、シリアル・ポートは9600bpsで通信を行います。

/* sample1.c */
#include <t_services.h>
#include "kernel_id.h"
#include "sample1.h"

void task(VP_INT exinf)
{
	syslog(LOG_NOTICE, "Hello, Aduc7026" );
}

インテルhexへの変換

| 09:23 | インテルhexへの変換 - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - インテルhexへの変換 - 酔漢電子工作手帳

PizzaFactoryを使うとTOPPERS/JSPのこけら落しプログラム、"sample1"を数クリックで簡単構築できます。

ただ、生成されるのはELFフォーマットの.outプログラムです。ADuC7026に焼きこむためのARMWSDプログラムは、インテルhexフォーマットしか受け付けません。そこでビルド後にインテルhexフォーマットに変換するようプロジェクトを設定します。

プロジェクトのpropertiesを開き、C/C++ Build ⇒ Build Stepsを選びます。Post-build steps:のcommand:として次の命令をタイプしてください。

arm-elf-objcopy -O ihex -S ${BuildArtifactFileBaseName}.out ${BuildArtifactFileBaseName}.hex

${BuildArtifactFileBaseName}はPizzaFactoryが作るマクロです。詳細はhelpをどうぞ。この設定を行っておけば、ビルドの後に.hexファイルがインテルhex形式で生成されます。

*1:まあ読まなくていいときもあるけど、いつも読むようにしたほうが楽