自作CPUとベースボードのバージョン管理
問題背景
ComProcプロジェクトの規模が拡大するにつれ、バージョン情報を取得する必要がだんだん出てきた。
バージョン管理を考慮すべきものに次の要素がある。
https://raw.githubusercontent.com/uchan-nos/comproc/refs/heads/main/doc/components-relationship.png
ComProc CPU
ComProc MCU
ComProcボード
ComProcアセンブラ
ComProcコンパイラ
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