* 概要 [#bd646d0f]
 OpenSSMのファームウェアは、[[RTOS>http://ja.wikipedia.org/wiki/RTOS]]等の OSを使わず独自の環境下([[プログラムライブラリ>http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA]])に構築されています。最初は分かりにくい/理解しにくいと思われるところも多々あると思いますので、各ライブラリの説明ページを設けました。

 RTOSでは[[マルチタスク>http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%82%B9%E3%82%AF]]が使えるため大変便利ですが、OpenSSMでは各タイマ割込をタスク代わりに使っています。また一部の処理では、[[イベント>http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29]]もどきの概念(あるいは、[[コルーチン>http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3]]に近い)を導入しています。

#ref(1.png)
''Fig.1'' アプリケーション層とライブラリ(ドライバ)の関係

** 開発環境 [#yba9ddf5]
 C言語で開発されています。ごくごく一部に、インラインアセンブラが使用されています。


+ Microchip MPLAB
+ Microchip C Compiler for PIC24


** ライブラリについて [#p356e397]
 ライブラリとなる対象は、他のソフトウェアへの流用が可能かどうかという点において決められています。そのハードウェアあるいはアプリケーション固有となる機能の場合は、ライブラリ化されていません。
 ライブラリは、lib〜.c, lib〜.hと、libが接頭辞としてファイル名が決められています。また必ず lib〜.c, lib〜.hとペアでファイルが存在します。場合によっては、外部のテーブルを参照することがあり、その場合は table.hが必要になります。

|ソースコード名|ヘッダ名|機能|備考|h
|libadc.c|libadc.h|A/D変換ドライバ||
|libdac.c|libdac.h|D/A変換ドライバ||
|libeeprom.c|libeeprom.h|I2C対応の EEPROMドライバ||
|libfontx2.c|libfontx2.h|FONTX2ドライバ (ASCIIフォントのみ)|FONTX2のフォントファイルが別途必要|
|libps2.c|libps2.h|PS/2対応キーボードドライバ||
|librtc.c|librtc.h|Software RTCドライバ||
|libuart.c|libuart.h|Software FIFO対応 UARTドライバ||
|libvideo.c|libvideo.h|NTSCビデオ出力/スーパーインポーズドライバ||
|table.c|table.h|数値参照用のテーブル||
||types.h|BOOL型など変数型の定義||


** アプリケーションについて [#occ5f15a]
 OpenSSMのアプリケーション層に相当する部分は、下記のコードにまとめられています。
 
|ソースコード名|ヘッダ名|機能|備考|h
|main.c|main.h|各初期化の呼び出し、main関数、メインループなど||
|config.c|config.h|EEPROMへのバックアップ/リストアを行う||
|event.c|event.h|イベント処理を行う||
|extmeter.c|extmeter.h|外付けメータの制御を行う||
|screen.c|screen.h|画面表示の制御及びキーボード入力処理を行う||
|ssm.c|ssm.h|プロトコル処理を行う||

** その他 [#gbdc7e27]
 開発の後半でスタックメモリが足りなくなってしまったので、かなりの関数を inline展開しています。ROMは比較的余裕があるので、実際のところは大したことないですが...