省メモリ低機能な組み込み環境を想定した汎用Cライブラリです。
標準ライブラリの拡張、ストリーム、コンテナ、ファイルシステム、マルチタスク、HAL等のモジュールを無節操に詰め合わせています。徹底的に環境依存を排除する作りにしているので、CPU, コンパイラ, OSの有無等の環境に殆ど縛られません。
想定ターゲットは、RAM数KByte, ROM数十KByteの小規模な環境から、組込みLinux(Raspberry Pi含む)まで様々です。アプリケーション開発の基盤として是非利用してみてください。
また、日本語ドキュメントのある低級な組み込み向けライブラリは貴重だと思われます。低級プログラムに興味のある組込みプログラマ初学者〜中級者の学習用途にも最適です。
picoxはこれらのプロトタイピング環境と競合するものではありません。picox単独で使用することもできますし、別のプラットフォームライブラリと共存することも可能です。
ストリームやHAL等の内部実装を持たないインターフェース型を提供しているので、mbedやRaspberry Piのペリフェラルドライバとpicoxインターフェースのグルーコードを用意すれば、mbedでもRaspberry Piでも同じように動作するコードを記述できます。グルーコードはpicox側でもデフォルトのものを提供していく予定です。
PC上でも動作されられることも重視しているので、純粋なロジックはPCでテストし、Raspberry Piでデバイスドライバをテストし、mbedで動作させる、といった柔軟な利用が可能です。
もちろん、CPUベンダが提供するペリフェラルライブラリとも親和性が高くなるように設計しています。特定のプラットフォームに縛られない柔軟な開発基盤。それがpicoxです。
CPUベンダが提供するペリフェラルライブラリの例
- Atmel: ASF(Atmel Software Framework)
- STMicro: STM32Cube
- Texas: Instruments: MSP Driver Library
- Cypress: PDL(Peripheral Driver Library)
- 1バイトは8bitであること
- バイトオーダはビッグ or リトルエンディアンであること
- コンパイラはANSI C99に対応していること
- CPUは16 or 32 or 64bitであること
厳密に条件を列挙すると無駄にややこしく感じますが、現行の多くのCPUとコンパイラに当てはまると思われます。
※
8bitCPUでも現行バージョンでは動作可能だと思いますが、今後の開発で明確に動作対象
外となる可能性があります。
C99はフルサポートである必要はありません。下記のC99機能を使用しています
- stdint.h, stdbool.h等のtypedef定義のヘッダ
- inline関数
- 関数先頭以外での変数宣言
Renesas CA78K0R, CCRLコンパイラ等の未だにC99に非対応のコンパイラもあるため、一部のモジュールについてはC89でもコンパイルできるように調整しています。
CA78K0R, CCRLを使用してビルドをする場合は、不足ヘッダファイルを補うために、インクルードパスに以下のパスを追加してください。
picox/core/stdcompat/{ca78k0r | ccrl}
- 標準Cライブラリ(一部C99の関数を使用) printfやtime.hの関数等の、ハードウェア依存部分が含まれる関数は使用していません。
特定のIDEやMakefileには依存していないので、開発プラットフォームに合わせて必要なモジュールをビルド対象に加えてください。
必要な設定はインクルードパスを通すことだけです。設定するインクルードパスはmod_picox.cmake
を参考にしてください。外部ライブラリを使用しないのであれば、外部ライブラリのインクルードパスは設定不要です。
picoxは汎用ライブラリなので、アプリケーションでは使用しない関数やモジュールが多数含まれると思います。たいていのコンパイラでは、未使用関数の除去機能を持っているはずなので、コードサイズが肥大化しないように、これらのオプションを使用することを推奨します。
gccの場合以下のオプションで未使用関数を除去できます。
# コンパイルオプション
gcc -ffunction-sections -fdata-sections
# リンクオプション
ld --gc-sections
# リンクオプションをgccから指定する場合
gcc -Wl,--gc-sections
組込み開発のIDEでは、デフォルトでこの類のオプションが指定されていることが多いです。
例
- AtmelStudio(Atmel)
- PSoCCreator(Cypress)
- Code Composer Studio (Texas Instruments)
リソース制限のきつい組込み開発ではこの機能は必須だと思うのですが、残念ながらすべてのコンパイラで使用できるわけではないようです。
除去機能がないことが確認できているコンパイラ
- Renesas CA78K0R 1.7.2
除去機能が使用できない場合、極力不要なソースをビルドに含めないようにするしかありません。
ヘッダファイル内のコメントで、おおよその扱い方はわかると思います。詳細はソースコードを確認してもらうしかありませんが、 極端な最適化よりも可読性を重視しているので、コードから動作仕様を確認することは、それほど大変ではないと思います。
Doxygen
で生成したAPIドキュメントもGitHub Pages
にて公開しています。
このライブラリは以下の環境でテストしています。
- MinGW 32 GCC 4.8.1
- MSYS2 MinGW 32 GCC 4.9.2
- MSYS2 MinGW 64 GCC 4.9.2
- Ubuntu 14.04 GCC 4.8.4
- Ubuntu 16.04 GCC 5.3.1
- Renesas CCRL 1.02.00
- Renesas CA78K0R 1.72
- Atmel avr-gcc 4.9.2 (AtmelStudio 7)
- Texas Instruments TI v15.12.1.LTS (Code Composer Studio v6.1)
picoxと同等のライセンス(MIT, BSD, Apache License 2.0, etc)で、有用な外部ライブラリは積極的に取り込んでおり、picox用に一部変更を加えたものろpicox_externalディレクトリにまとめています。各ライブラリのライセンスや使用方法は、それぞれのライブラリの解説を参照してください。
- Unity ユニットテストフレームワーク
- minIni iniファイル操作
- sds 動的文字列
- uthash ハッシュコンテナ を中心に各種コンテナ
- libfixmath 16 x 16固定小数点
- spiffs ウェアレベリング機能付きSPIフラッシュ用ファイルシステム
- FatFs 組込み界隈では誰もが知る、日本産 Fatファイルシステムドライバ
- プロトタイプ
- バグ修正多数
- 細かな機能追加
- 独自printf追加
- 動的文字列クラス追加
- ストリームクラス追加
- バグ修正多数
- 細かな機能追加
- xstrモジュールの廃止(同等の関数はxstring.hで提供)
- 各外部ライブラリのサブモジュール化
- ファイルシステム関連の超絶強化
- バグ修正多数
- 細かな機能追加
- マルチタスクモジュール(xfiber)の実装
- バグ修正多数
- 細かな機能追加
- HAL(Hardware Abstraction Layer)モジュールの追加
- バグ修正
- X_ASSERTのバリエーションの追加
- バッファリングなし出力を意図した、err_printf系関数の追加
- テスト環境
- MSYS2 MinGW 32 GCC 6.3.0
- MSYS2 MinGW 64 GCC 6.3.0
- Ubuntu 16.04 GCC 5.4.0
- xrttiによる実行時型チェック機能の追加
- HALインターフェースの調整
- テスト環境
- MSYS2 MinGW 32 GCC 6.3.0
- MSYS2 MinGW 64 GCC 6.3.0
- Ubuntu 16.04 GCC 5.4.0