色々な環境で共有する事が出来る、抽象化されたクラス、テンプレート・クラス、便利関数
などを網羅したものです。
※一部、boost が必要です。
- 組み込みマイコンでは、メモリーは限られており、標準の STL や boost などのメモリー
モデルでは、どうしても、利用が難しい場面があります。 - そのような場合を想定して、有限のクラスなどを多く提供しています。
- 動的に記憶を割り当てる必要が無い場合には重宝します。
- 多くの場合、設計を最適化する事で、有限のメモリーでも、十分な機能を提供できます。
- 例外をスローする事を極力控えています。(現段階では、それが「良い」か「悪い」か判断できない)
- SD カードのファイルシステム操作などに ChaN さんの FatFs を使っています。
- このライブラリは、FAT ファイルシステムの操作、文字コード変換など利用しています。
- C++ で実装する、SD カードのハードウェアードライバー、コンテキストと FatFs を繋ぐ仕組みを実装
する必要があります。
extern "C" {
DSTATUS disk_initialize(BYTE drv) {
return sdh_.disk_initialize(drv);
}
DSTATUS disk_status(BYTE drv) {
return sdh_.disk_status(drv);
}
DRESULT disk_read(BYTE drv, BYTE* buff, DWORD sector, UINT count) {
return sdh_.disk_read(drv, buff, sector, count);
}
DRESULT disk_write(BYTE drv, const BYTE* buff, DWORD sector, UINT count) {
return sdh_.disk_write(drv, buff, sector, count);
}
DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void* buff) {
return sdh_.disk_ioctl(drv, ctrl, buff);
}
DWORD get_fattime(void) {
time_t t = 0; // RTC が無いので、1970年1月1日を使う。
return utils::str::get_fattime(t);
}
};
- 上記のように、C の関数から呼べるように、FatFs が要求する低レベルドライバーをアサインします。
- また、ファイル書き込みのタイムスタンプとして、「get_fattime」を実装します。
- 上記関数では、RTC から読み取った「time_t」形式の時間を FatFs が要求する形式に変換しています。
- このフレームワークでは、ソフト SPI、ハード SPI(RSPI)、SDHI などを選択できます。
- SD カードに関連するライセンスは、製品を作る場合において注意を要します。
- このフレームワークでは、それらに関わるいかなる法的な義務や保障を行いません。
- RXマイコン用のスタートアップ用アセンブラプログラムです。
- ハードウェアースタック、ユーザースタックの設定。
- スタックのサイズは、リンカースクリプト「.ld」ファイルで行います。
- 割り込みベクターテーブルの開始アドレスを設定。
- 割り込みベクターは、柔軟性を考えて、RAM 上に展開しています。
- RAM 領域の全クリア。(本来必要無いものです)
- bss セクションの初期化。
- 初期値付変数のコピー。(ROM 領域からの転送)
- スーパーバイザモードでのみ設定可能なレジスターの初期化。(MEMWAIT)
- RX71M では、240MHz 動作を行うのに必要なメモリー設定は、スーパーバイザモードで行います。
- 割り込みの許可。
- ユーザーモードへの移行。
- init 関数へのジャンプ。
- 割り込みベクターの初期化。
- C++ 関数、コンストラクターの実行。(C++ では、static に定義されたクラスにお いて、コンストラクターを実行する必要があります、CTOR と呼ばれるテーブルに格納)
- 割り込みレベルの設定。
- main 関数の呼び出し。
- 割り込みテーブルの登録。
- このフレームワークでは、割り込みベクターは RAM 上に配置する仕組みを使っています。
- POSIX 関数の実装。
- stdout, stdin, stderr を SCI の入出力に接続する仕組み。
- printf、scanf では、固定されたディスクリプタ(stdout, stdin)を使って、ファイルの 読み書きを行います、その機能を経由して、sci_putch、sci_getch を使います。
- 「sci_putch、sci_getch」は C の関数として、「extern」宣言しておく必要があります。
- FatFs を使う場合、Makefile 内で「FAT_FS」を宣言し、fatfs 関係 C 言語ソースをリンク します。
- FatFs で、ロングファイル名をサポートしない場合、FatFs のヘッダー内で行います。
- FatFs では、ファイル名のコードはファイルシステム固有のコードになっています、それで は不便なので、UTF-8 から、固有のコードに変換を行います。
- 日本語のファイル名は、UTF-8 にする必要があります。
- FatFs の API を直接呼ぶ場合は、ファイルシステム標準の文字コードを使います。
- UTF-8、固有のコードの相互変換等は、FatFs ライブラリが行っています。
- 複数ファイルを同時オープンする場合のリソースを Makefile 内で定義します。(FAT_FS_NUM)
- POSIX の fopen, fclose, fread, fwrite, fseek などを使う事ができます。
- fopen 系のファイルアクセスは便利ですが、メモリーを多く消費します。
- C++ では、iostream を使う事も出来ますが、非常に多くのリソースを消費します。(推奨しません)
- CPU バイトオーダー、エンディアンの設定
- RX マイコンは、ビッグ・エンディアン、リトル・エンディアンを切り替えできますが、あらゆる
場面で「リトル・エンディアン」の方が効率が高いのが証明されている為、ビッグ・エンディアン
を使う理由はありません。 - また、ビッグ・エンディアンは、多くのライブラリがテストされていません。
- 時間関数定義と実装
- newlib には POSIX 標準の時間関数が用意されていますが、より少ないメモリで実装されたものです。
- time.h ヘッダーは、newlib 標準の time.h と「当たる」ので注意が必要です。
- 将来的には、newlib の標準関数へ移行するでしょう。
- 現状では、R8C, RL78 等との互換性などの理由から、この実装をしばらく利用します。
- 「うるう秒」の補正は行われません。
- 各種 RX マイコン固有のヘッダーを一括で切り替える仕組みを内包しています。
- 「byte_order.h」をインクルード
- 「delay.hpp」をインクルード
- RX マイコン内臓デバイスの定義を全てインクルードしています。(未実装なデバイスもあります)
- Makefile 内で、「SIG_XXXX」を定義します。(SIG_RX64M)
- 各種マイコン、周波数に応じた、ソフトウェアーループなどを提供します。
- boost::format に似た機能を提供する、文字列整形クラスです。
- C 言語における、printf 関数を置き換えるものです。
- 一般的に、組み込みマイコンのリリースビルドでは、printf の使用を禁止しています。
- 最近では、文字整形文の解析を行い、ある程度のエラーをコンパイラが検出しますが十分ではありません。
- format クラスは、表示フォームと、入力の不整合を起こしても、安全なように実装してあります。
- また、利便性の面でも、printf とほぼ同じか、より良い機能を提供します。
- printf の可変引数は、構造上スタック経由なので、安全ではありません。
- format クラスは、「%」オペレーターを使って変数を渡す機構なので、安全です。
- format クラスの文字整形では、二進数表記、整数による固定小数点表記など、便利な機能を提供します。
- IEEE-754 浮動小数点フォーマットのパースを独自に行います。(整数計算のみで実装されています)
- 外部の関数(sprintf)などを一切使用していません。
- C の関数、scanf に相当する C++ 関数。
- 可変引数を使わず、スタックベースでは無いので安全。
MIT