自作CPUとベースボードのバージョン管理
問題背景
ComProcプロジェクトの規模が拡大するにつれ、バージョン情報を取得する必要がだんだん出てきた。 バージョン管理を考慮すべきものに次の要素がある。
https://raw.githubusercontent.com/uchan-nos/comproc/refs/heads/main/doc/components-relationship.png
CPU上で動作するOSから、これらのバージョンを識別できるようにしたい。
用途
ちょっと古いボードを持っている人が、最新のCPUを焼いて使う。
バグ報告やデバッグ作業で環境を特定する。
バージョン番号から環境(CPU、MCU、OS、ボード、コンパイラなど)が一意に特定できて欲しい。
最新のボードで古いバージョンのMCUを試す。
古いバージョンのサンプルアプリを最新のコンパイラでビルドする。
OSからどのバージョンが見えるべきか?
多くしすぎるとバージョン判定が煩雑になりすぎるし、バージョン番号を適切に上げていく作業も面倒。
必要最低限のバージョン番号付与に押さえたい。
ちょっと古いボードを持っている人が、最新のCPUを焼いて使う
主流の用途その1?
ComProc開発者(uchan)以外は、毎バージョンのボードを全部持っているわけではないので。
OSは以下のことを前提としても問題ないはず。
CPUとMCUはOSがビルドされたバージョンと同一のものが入っている。
CPUやMCUはGitHubで公開されており、任意のバージョンを入手可能なため。
OSのバージョンをビルドできるコンパイラとアセンブラを持っている。
したがって、OSは以下の仮定をする。
OS、CPU、MCUは同一バージョン
敢えてそれぞれ違うバージョンを使いたいという人のことまでは考慮しない。
ボードはそのOSリリース時に存在していたいずれかのボード
「ComProcボード(FPGA部)」にバージョン番号を埋め込むと良いか。
ComProcボード(FPGA部)は概念的にボードと一体であるため、ボードが変更されるたびに新しいバージョン番号が振られるのは自然だ。
バグ報告やデバッグ作業で環境を特定する
主流の用途その2?
この場合、全コンポーネントのバージョンが列挙できると嬉しい。
仮に「OS、CPU、MCUは同一バージョン」と仮定したとしても、手違いで異なるバージョンの組み合わせを使ってバグが出ているかもしれない。
なので、同一バージョンか否かが分かるだけでも、最低限の役には立ちそう。
最新のボードで古いバージョンのMCU(CPU)を試したいケース
このケースは少数派だろう。
CPUのバージョン毎に処理速度を比較したい
バージョン間で何らかのバグが修正されたかを確認したい
とか?
OS、CPU、MCUを全部同一バージョンにすると仮定すると
古いMCU=古いOSであり、そのOSが作られた時点では存在しないボードで動かすことになる。
すると、OSが知らない周辺機器だったりピン配置だったりするかもしれない。
ということでOSは最新を使うとすると
新しいOSで古いMCU&CPUを使うことになる。
OSが想定する機能(CPU命令やMCU内蔵機能)が存在しなかったり、仕様が異なるかもしれない。
OSは異なるMCU&CPUバージョンを認識すべきか
具体的には、OSの中に if (MCUバージョンA) {...}のような記述を入れるかどうかという話。
これをやるとOSの開発・メンテナンスコストが上昇する。
また、OSだけが古いMCU&CPUバージョンを認識できたとしても、コンパイラやアセンブラが古いCPUを対象としたビルドができないと意味がない。
最新CPUでしかサポートされない命令を出力されては、せっかくのif文が台無しである。
最新のOSで古いMCU&CPUを使いたくなったら、その都度OSやコンパイラ・アセンブラを調整してもらうことにする。
古いバージョンのサンプルアプリを最新のコンパイラでビルドするケース
さらに考えを進めると、サンプルアプリのバージョンとOS、CPU、MCU、ボードのバージョンをどう対応させるかという話になる。
例えば、LCDに文字列を表示するサンプルアプリ lcd.c があったとする。
初期は単に文字列を出すだけだったが、とあるボードではLCDがバックライト付きになり、lcd.c にバックライト点灯制御が追加された。
バックライトをON/OFFするスイッチがGPIOの特定のピンに接続されているとする。
バックライト無しのLCDが搭載された古いボードで新しいサンプルアプリを動かすと、意味なくGPIOに信号が出てしまう。
GPIOを別目的で使っていた場合、誤動作の原因となる。
系統名
単なるバージョン情報だけでなく、系統名も欲しい。
MCUや基板が、近い将来「ロボット向け」とか「パソコン向けMCU」とか分化していく可能性があるから。
ロボット向けにはディスプレイ出力回路は搭載されてなくて、パソコン向けには搭載されているとか。
table:ボードのバージョン
ビット位置 ビット数 フィールド名 内容
5:0 6 REVISION リビジョン番号(1~)
9:7 4 予約
15:10 6 TYPE 系統を表す値
table:ビルドバージョンビット列
ビット位置 ビット数 フィールド名 内容
0 1 RELEASE リリース用公式ビルドなら1、それ以外のビルドでは0
6:1 6 MINUTE ビルド分(0~59)
10:7 4 HOUR ビルド時(0~23)
15:11 5 DAY ビルド日(1~31)
19:16 4 MONTH ビルド月(1~12)
25:20 6 YEAR ビルド年(2020年からの経過年数0~63)
31:26 6 TYPE 系統を表す値
table:系統
TYPE 系統名
1 ComProc CPU Board
2 ComProc PC
3 BuntanPC