12ステップで作る 組込みOS自作入門で開発している組込みOS「KOZOS」を,micro:bitに移植しました.

書籍中では12ステップに分けて開発していくのですが,12ステップぶんのソースコードをすべて移植してあるので,書籍の内容をmicro:bitでなぞることができます.

 

KOZOSのmicro:bit版を公開しました!

 

micro:bit V2 に対応しています.(Cortex-M4)

Cortex-M4の特殊機能みたいなのは使っていないので,おそらくCortex-M3でも動作します.

micro:bitって,県によっては学校で全員に配られたりとかしているようですし遊びで買ったのが家に1枚あるという人もけっこういますし買っても2500円くらいなので,手元にあるmicro:bitでちょっとした組込みOSが動いて実験できる!(しかも12ステップ本という参考書もある!)というのは,組込みシステムの学習にけっこう良いのではと思います.

 

Cortex-M3/M4はOSカーネルなども可能な限りC言語で書けるように工夫されているので,KOZOSも工夫すればアセンブリ部分をかなり削減して共通化などもしてスッキリさせられたのですが,あえてそうせずに書籍のオリジナルコードをなるべく保つようにして移植しました.(書籍の内容をなるべくそのままなぞれるようにするため)

あと,あまり Cortex-M4に依存しすぎて,他CPUに移植しにくくなるのを避けたかったというのもあります.(フツーのマイコンならたいていこういう機能はあるよね,という範囲で書いています)

 

とくに,スレッド用のスタック(PSP)とEXC_RETURNによる復帰をうまく使えば工夫できそうだったのですが,あえてそうしていません.(スタックはMSPしか使っていません)

また,割り込み優先度もすべて0として,多重割り込みの考慮を無くしています.(これはオリジナルコードもそうですが)

 

ついでに追加のステップとして,ROM化nrfx対応もしています.nrfx対応では,公式のSDKが持っているデバイスドライバを使えるようにしているので,いろんなデバイスを動かすことができるようになると思います.

 

おかげでCortex-M3/M4のことがけっこうわかってきました.

気が向いたら12ステップ本のmicro:bit版を書きたいです.

 

C言語でmicro:bitのプログラムを開発する方法について,まとめました.

元々は NLL for micro:bit を開発するためのお試しサンプルとしてやっていたものですが,これはこれで有用かもと思ったので,まとめて公開したものです.(あと,いろいろWeb検索とかしたのですが,この手の情報はあんまり無いみたいです)

ブラウザを使わずに,gccベースで開発できます.

micro:bitへの書き込みは,micro:bitをUSBメモリとしてマウントし,生成されたhexファイルをコピーしてアンマウントするだけでできますので,Debian GNU/Linuxなどの環境だけで(Windowsを使わずに)開発できます.(私はFreeBSDでやっています)

 

 

 

NLL for micro:bitで簡易PWM発振器を作ってみました.

波形や周波数を指定して,PWMで発振できます.(ローパスフィルタを通せば,アナログ波になるはず)

micro:bitに拡張OLEDディスプレイを接続して利用します.

出力先をmicro:bitのスピーカーにすると,ピーピーガーガーと音を出して遊ぶことができます.

先月の簡易オシロスコープと組み合わせて,出力した波形を確認したりして遊ぶことができます.

 

NLL for micro:bit

↑「アプリケーション」の「簡易オシロスコープ」です

 

micro:bit で,簡易オシロスコープを作ってみました.

安価なオシロスコープとして利用できると思います.

 

10kHz〜80kHzのサンプリング周波数でキャプチャできます.

micro:bit用の拡張OLEDディスプレイに表示します.

トリガを設定して,決まった電圧を検出したらスキャンする,みたいなこともできます.

 

Aボタンで再スキャン,Bボタンでキャプチャ画像の保存です.

キャプチャした画像はファイルとして保存され,PCに転送できます.

 

乾電池&PC無しで動作させられるため,出先でちょっとオシロを使いたいときなどに便利かなと思います.

(家に余っているmicro:bitを簡易オシロにできます)

 

NLL for micro:bit のアプリとして作ってあるので,簡単な改造もしやすいと思います.

 

NLL for micro:bit

↑「アプリケーション」の「簡易オシロスコープ」です

 

(2026/01/05追記)

A/Bボタンでの操作をいろいろ追加しました.
・Aボタンを押しっぱなし:繰り返しスキャン
・Aボタンを押しながらBボタンを1回押し,Aボタンを離す:サンプリング周波数を変更
・Aボタンを押しながらBボタンを2回押し,Aボタンを離す:サンプル数を変更
・Aボタンを押しながらBボタンを3回押し,Aボタンを離す:トリガの有無を切替え
・Aボタンを押しながらBボタンを4回以上押し,Aボタンを離す:終了

 

 

NLLのmicro:bit移植を進めていますが,micro:bit shields for Arcadeのゲームパッド上で動作しました.

 

 

NLL for micro:bit

 

対象ハードウェアは以下です.ほぼリファレンス回路どおりのようなので,micro:bit shields for Arcadeの他のハードウェアでも動作するかもしれません.

 

https://kitronik.co.uk/products/56116-kitronik-arcade-for-bbc-micro-bit-makecode-arcade

 

独自言語「NLL」で動作します.テキスト型プログラミング言語で,ゲームを作ったりすることができます.

(NLLがベアメタルで動いています.言いかたを変えると,NLLがOSとして動いています)

 

PCとUSBケーブルで接続し,TeraTermなどの端末エミュレータで接続して操作します.

 

フラッシュROM上にファイルシステムを持っているので,プログラムを保存することができます.プログラムを書き込んで保存し,電源ON時に起動するプログラムを指定することで,PCと切り離して動作することができます.

 

このゲームパッドの標準の開発環境はMakeCodeですが,ディスプレイの下8ラインが使えない(320x240のディスプレイにスムーズに拡張できるようにするためらしい)のですが,NLLだと全画面が使えます.

あとMakeCodeでのグラフィックプログラミングは基本的にキャラクタベースなので(よく知らないですが),線や円を描くようなプログラムを書きたい場合には,NLLのほうがやりやすいかもしれないです.