Skip to content

Latest commit

 

History

History
 
 

common

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

共有、便利、ライブラリー

概要

色々な環境で共有する事が出来る、抽象化されたクラス、テンプレート・クラス、便利関数
などを網羅したものです。 ※一部、boost が必要です。

構成について

  • 組み込みマイコンでは、メモリーは限られており、標準の STL や boost などのメモリー
    モデルでは、どうしても、利用が難しい場面があります。
  • そのような場合を想定して、有限のクラスなどを多く提供しています。
  • 動的に記憶を割り当てる必要が無い場合には重宝します。
  • 多くの場合、設計を最適化する事で、有限のメモリーでも、十分な機能を提供できます。
  • 例外をスローする事を極力控えています。(現段階では、それが「良い」か「悪い」か判断できない)

FatFs について

  • 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 カードに関連するライセンスは、製品を作る場合において注意を要します。
  • このフレームワークでは、それらに関わるいかなる法的な義務や保障を行いません。

start.s

  • RXマイコン用のスタートアップ用アセンブラプログラムです。
  • ハードウェアースタック、ユーザースタックの設定。
  • スタックのサイズは、リンカースクリプト「.ld」ファイルで行います。
  • 割り込みベクターテーブルの開始アドレスを設定。
  • 割り込みベクターは、柔軟性を考えて、RAM 上に展開しています。
  • RAM 領域の全クリア。(本来必要無いものです)
  • bss セクションの初期化。
  • 初期値付変数のコピー。(ROM 領域からの転送)
  • スーパーバイザモードでのみ設定可能なレジスターの初期化。(MEMWAIT)
  • RX71M では、240MHz 動作を行うのに必要なメモリー設定は、スーパーバイザモードで行います。
  • 割り込みの許可。
  • ユーザーモードへの移行。
  • init 関数へのジャンプ。

init.c

  • 割り込みベクターの初期化。
  • C++ 関数、コンストラクターの実行。(C++ では、static に定義されたクラスにお いて、コンストラクターを実行する必要があります、CTOR と呼ばれるテーブルに格納)
  • 割り込みレベルの設定。
  • main 関数の呼び出し。

vect.h, vect.c

  • 割り込みテーブルの登録。
  • このフレームワークでは、割り込みベクターは RAM 上に配置する仕組みを使っています。

syscalls.c

  • 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 を使う事も出来ますが、非常に多くのリソースを消費します。(推奨しません)

byte_order.h

  • CPU バイトオーダー、エンディアンの設定
  • RX マイコンは、ビッグ・エンディアン、リトル・エンディアンを切り替えできますが、あらゆる
    場面で「リトル・エンディアン」の方が効率が高いのが証明されている為、ビッグ・エンディアン
    を使う理由はありません。
  • また、ビッグ・エンディアンは、多くのライブラリがテストされていません。

time.h, time.c

  • 時間関数定義と実装
  • newlib には POSIX 標準の時間関数が用意されていますが、より少ないメモリで実装されたものです。
  • time.h ヘッダーは、newlib 標準の time.h と「当たる」ので注意が必要です。
  • 将来的には、newlib の標準関数へ移行するでしょう。
  • 現状では、R8C, RL78 等との互換性などの理由から、この実装をしばらく利用します。
  • 「うるう秒」の補正は行われません。

renesas.hpp

  • 各種 RX マイコン固有のヘッダーを一括で切り替える仕組みを内包しています。
  • 「byte_order.h」をインクルード
  • 「delay.hpp」をインクルード
  • RX マイコン内臓デバイスの定義を全てインクルードしています。(未実装なデバイスもあります)
  • Makefile 内で、「SIG_XXXX」を定義します。(SIG_RX64M)

delay.hpp

  • 各種マイコン、周波数に応じた、ソフトウェアーループなどを提供します。

format.hpp

  • boost::format に似た機能を提供する、文字列整形クラスです。
  • C 言語における、printf 関数を置き換えるものです。
  • 一般的に、組み込みマイコンのリリースビルドでは、printf の使用を禁止しています。
  • 最近では、文字整形文の解析を行い、ある程度のエラーをコンパイラが検出しますが十分ではありません。
  • format クラスは、表示フォームと、入力の不整合を起こしても、安全なように実装してあります。
  • また、利便性の面でも、printf とほぼ同じか、より良い機能を提供します。
  • printf の可変引数は、構造上スタック経由なので、安全ではありません。
  • format クラスは、「%」オペレーターを使って変数を渡す機構なので、安全です。
  • format クラスの文字整形では、二進数表記、整数による固定小数点表記など、便利な機能を提供します。
  • IEEE-754 浮動小数点フォーマットのパースを独自に行います。(整数計算のみで実装されています)
  • 外部の関数(sprintf)などを一切使用していません。

input.hpp

  • C の関数、scanf に相当する C++ 関数。
  • 可変引数を使わず、スタックベースでは無いので安全。

License

MIT