はじめに
BSD Linux系のStandardを採用しているRTOSを探しているところ、OSSプロジェクトがありApache Nuttxに辿り着きました。
下記が公式ドキュメントとなります。
https://nuttx.apache.org/docs/latest/index.html
VxWorksのRTOSのようなものでLinuxと似ているカーネル、システムコールの構成を持ちます。
(実際にPOSIXに準拠しているのは確認できてないので確認必要ですが。。)
組み込み系の実装も触りたかったので早速Bule Pillを購入、、届く間にマイコンに書き込む準備をします。
ほとんど公式ドキュメント通りですがmacの開発、ビルド環境について説明が足りない?ような印象があったのでほぼ自分用で作成してます。画面貼り付けはなく、コマンド一覧になります。
ビルド前の準備
- macで必要な依存性を解決します。下記のbrewからインストール。
- brew install libusb
- brew install ncurses
- brew install lsusb
- brew install minicom
- brew install automake
- brew install bison
- brew install flex
- brew install gperf
- brew install libtool
- brew install pkg-config
- nuttxのビルドに必要なライブラリインストール(https://repo.or.cz/libjaylink.git)
- git clone https://gitlab.zapb.de/libjaylink/libjaylink.git
- cd libjaylink
- ./autogen.sh
- ./configure
- make
- make install
- あとは、、ARM系のコンパイラーをインストール
-
https://developer.arm.com/downloads/-/gnu-rm ここからバイナリファイルをダウンロードし、パスを通しました。
- brewでもできますが、nuttxのビルド時にmath.hのエラーが発生し、どうしても解決ができないのでバイナリからインストール、解決してます。
- flashing toolのインストールを行います。openocdを使います。
- git clone http://repo.or.cz/r/openocd.git
- cd openocd
- ./bootstrap
- ./configure --enable-internal-jimtcl --enable-maintaner-mode --disable-werror --disable-shared --enable-stlink --enable-jlink --enable-rlink --enable-vsllink --enable-ti-icdi --enable-remote-bitbang
- make
- sudo make insatall
- openocd --version
- nuttx toolをインストールします。
- git clone https://bitbucket.org/nuttx/tools.git
- cd tools/kconfig-frontends
- patch < ../kconfig-macos.diff -p 1
- ./configure --enable-mconf --disable-shared --enable-static --disable-gconf --disable-qconf --disable-nconf
- make
- sudo make install
- nuttxを公式レポジトリからダウンロード。
- git clone https://github.com/apache/nuttx.git nuttx
- git clone https://github.com/apache/nuttx-apps apps
ビルド手順
- cd nuttx
- ./tools/configure.sh -l stm32f4discovery:nsh (ターゲットのボードを選択します。)
- cd..
- make
ビルド後
- ls -l nuttx.bin
- ビルドが無事終わったらこのファイルが作成されていることを確認できます。
補足
configure.sh から対象ボードを確認する際には
./configure.sh -L
から確認できます。公式ドキュメントにもサポートしているボードの情報があるので確認してからでも問題ないかと。。
上記の手順は必要最低限のタスクを確認してました。そのため設定編集などはほぼ実施してません。
アプリ実装時に使う機能をEnableにしたりなど必要になります。
最後に
まだマイコンは届いてなく待ち状態になりました。
組込み系の実装は初めてなので実装の仕方についてtaskモデルかthreadモデルか判断ができません。。
今回の実装から求めれいるものとしてhard-real time環境で、スケジューリング機能、interrupt、優先順位など確認したいと思うのでtaskモデルがいいかなーぐらいです。
今回は以上ですが初心者なのでツッコミなど大歓迎です。コミュニティなどあれば参加させていただきたいぐらいです。
これから実装することで進捗があればまた記事を作成しようと思います。