2つのマイコンを1つにする難しさ

少し前からマイコンについてのあれこれを書いてきたのだが、

これは仕事でとあるシステムを構築するための検討に関連しての話である。

これぐらいなら書いてもいいんじゃないかということで、どんなものを作ろうとしているかという話。


ことはシステムに搭載された2つのマイコンが製造中止になる話から始まる。

けっこう古いマイコンだったんですね。

単純に新しいマイコンに置き換えられればよかったのだが困難な事情もあり、

元々搭載されていたFPGAをマイコン入りのFPGAに置き換えることになった。

FPGAにマイコンの周辺回路を作り込めるのがポイントだったんですね。

で、このマイコン入りFPGAには複数のコアが搭載されているので、

2つのマイコンの役割をコア1つずつ割りあてようとした。


発想としてはありそうな話なのだが、これがそう簡単なことではない。

というのもこの手のマルチコアのプロセッサーはコアを個別にリセット・起動することは想定されていないからである。

使い方の例として、複数のコアを使ってLinuxを立ち上げる例や、

コアの一部をLinux、一部をリアルタイムOSで使う例が書かれているのだが、

外部信号で個別に起動・停止を行うハードウェアの仕組みは備わっていない。


マイコンが変わることでリアルタイムOSも新しいのを買わないといけない。

それで問い合わせたところ、全コアまとめて1つのOSでマネージメントした上で、

タスク群Aはコア1に、タスク群Bはコア2に割り付けて動作させるという構成を提案された。

元々複数のマイコンでやってた仕事を1つのマルチコアシステムにまとめるのはよくある話なんだろう。

タスク群ごとにコアを分けておけば、他方のタスク群の処理時間が増えても影響を受けずに済む。

全コアまとめてOSに渡せば、そこからはOSで対応してくれるし、

コア間の通信はOSの一般的なシステムコールで対応できるのもよい。


ただ……このシステムは元々2つのマイコンに分かれている前提の要素が多すぎた。

個別での起動・停止、個別でのファームウェアアップデートなどがある。

個別の起動・停止をタスクの生成・破棄で代替出来ないか。

個別でのファームウェアアップデートをアプリケーション部のみの差し替えで対応できないか。

1つのOSで全コアをマネージメントする方式でどこまで互換性を保てるか。


一方でコアごとにOSを分けるという構成もあるはずじゃないかと。

Linuxを動かすコアと、リアルタイムOSを動かすコアに分けられるなら、

コアを分けて2つのリアルタイムOSを起動させることはできないか。

これ、起動させるだけならば、そこまで難しいことではない。

問題は個別に起動・停止を行う仕組みである。

ウォームリセットとコールドリセット

これはマイコンにもよると思うのだが……

ここで書いたソフトウェアから見たウォームリセット、リセットハンドラへのジャンプぐらいしかない。

いくつか候補にあったマイコンも見たけど、ほぼこれしかないね。

(1つは他のコアからのレジスタ操作でハードリセットできそうにも見えたが)


一方でこの方法でのリセットができないシステムはないだろう。

割り込みを受けてリセットハンドラへのジャンプというのは誰でもできる。

この方法でどれぐらい完全なリセットになるかという問題はあるが、

OSを立ち上げなおすという動作は概ね実現できるように思える。

個別で停止して、個別にアップデートして、個別に起動する。

起動部分を多少注意して作れば実現できなくはない話である。


もっともOSを分ける構成でも全コアで共通的な機能は分けることができない。

このためコアごとにOSを分けることにどれぐらいメリットがあるかという指摘はけっこうある。

多少なりともブートローダーやOSに手を加える部分が増えるのは事実。

とはいえOSを1つにする場合にはアプリケーション側での工夫が多くなるので、

どちらの方が容易かという話なんだろうなという気もする。


というわけでマルチコアのプロセッサーに複数のマイコンをまとめるのは、

発想としてはありそうだけど、実際には簡単じゃないねという話だった。

他にもいろいろ難題があるんですけどね。Blogに書ける愚痴はこれぐらいで。