♨️

ここまで進化している!?車載向けSoCとその活用

2023/12/08に公開

はじめに

Turing の Vehicle チームの徳弘 (@res_circuit) です。

Turing は、完全自動運転システムを搭載した車を商品として販売することを目指しており、量産を見据えた独自の車両システムの設計に取り組んでいます。Turing ではその一環として、ECU (Electronic Control Unit, 電子制御ユニット) の開発にも取り組んでいます。

車の制御装置であるECUの多くは、マイコンをベースに構成されています。しかし近年は、車に求められる機能が膨大になり、またそれを処理するために高い計算力も必要となってきています。そのため、いわゆるMCU(Micro Controller Unit, マイコン)よりも高い処理性能を持つ MPU (Multi Processing Unit) を搭載する車載向けの SoC (System on Chip) が登場し、完成車にも採用されはじめています。

今回は、車両システムを構成するECUの中心的な部品である SoC とそれらの活用するソフトウェアについて、具体的な製品に触れながらシステムアーキテクチャの概観を紹介したいと思います。

SoCの進化:複数コアの統合

マルチコアの登場も久しく、マルチコア環境を活用したソフトウェアの発展も著しいです。汎用的なx86系やスマートフォン向けのプロセッサでは当たり前となってきましたが、近年は車載向けに特様々なI/Oを備えたSoCが数多く登場しています。例えば、TI社製のDRA829系やNXP社製のS32G3系はゲートウェイECU(様々な通信のハブ)向けを想定したSoCとして提供されています。

以下に、それぞれの製品のブロック図を引用しています。

TI製DRA829のブロック図
TI製DRA829のブロック図

NXP製S32G3V2RCのブロック図
NXP製S32G3V2RCのブロック図

Cortex-A と Cortex-R, M コアが多数搭載されており、目を見張るのは通信系含めたペリフェラルの豊富さです。もはや I/O のお化けです。これだけのハードウェアがあれば、様々なデバイスの制御とアプリケーションの動作を一つのSoCで実現できそうです。

マルチOS:Linuxとリアルタイムシステムの共存

一つのSoCで様々な機能を実装しようとするとソフトウェアも非常に複雑になり、OSが必要になってきます。目的に合わせて適切なOSを選定する必要もあります。

多機能なSoCを搭載する環境において、Linux は非常に便利です。世の中に存在するありとあらゆるデバイスを扱うことができ、複雑なソフトウェアシステムの開発とこれを管理運用するためのツールが豊富です。Linux は便利である一方で、リアルタイム性(規定の時間内にタスクを完了させること)の保証が困難なため、ハードリアルタイムなシステムでの使用には慎重になる必要があります。

リアルタイム性の保証が必要なアプリケーションは、QNXやFreeRTOSなどのRTOS (Real-time OS) を用いることで、タスクのリアルタイム性の保証とメモリやI/Oの排他制御を同時に達成しやすくなります。

マルチコアSoCを用いて、高機能な Linux とリアルタイムなRTOSを共存させ両者の恩恵を享受することができます。リアルタイム性近年のSoCはマルチOSを想定して設計もされておりソフトウェアの開発環境含めて様々なソリューションが存在します。

コアでシステムを隔てる

そもそも、マルチコアで複数のタスクを実行することについて考えます。マルチコアで複数タスクを実行する最もナイーブな方法は、コアごとに使用するペリフェラルやメモリ領域を決めておき、それぞれにファームウェアを用意する方法です。共有可能なメモリが存在する前提においてですが、タスク間(コア間)で通信をしたいときはあらかじめ決めたメモリ領域内での排他制御・同期が必要になってきます。

こうなってくると、たとえタスク単体がシンプルなものであってもシステムとして成立させるにはOSの機能が必要となってきます。

マルチOS:コアクラスターごとのOS割り当て

より効率的にリソースを管理するためには、ハードウェアの各コアクラスター(複数コアのまとまり)に異なるOSを割り当てます。

マルチOSシステムの実現において、メモリコントローラの役割は中心的です。メモリコントローラは、異なるOS間でのメモリアクセスを管理し、データの整合性と競合の防止を担います。この管理機能は、異なるOSが同じ物理メモリ(例えばDDRメモリ)を共有する場合に特に重要です。メモリ管理機構の元、メモリ領域を適切に使い分けることでマルチOSが実現できます。

チップ内のどのコアの組み合わせでOSを動かせるかは、SoCの設計およびチップベンダーが提供するファームウェアによって異なります。このため、メモリコントローラの機能やSoCのアーキテクチャを理解することは、マルチOSシステムの設計と実装において不可欠です。

以下に、TI製DRA829を使用した場合のコア割り当ての一例を掲載しました。このチップにはMCU Islandと呼ばれる独立したマイコン領域が設けられており、Linux、RTOSから独立したハードウェア上でカスタムのファームウェアを動作させることができます。死活監視や電源管理など、システムの中核機能をアプリケーションから切り離して実行する使い方も可能です。

マルチOSに関する触りとしてはこんな感じです。システム間で通信をしたい場合は、共有メモリ、メッセージキュー、その他ベンダーがチップに用意している専用の通信プロトコルを用いることになります。

組み込みのマルチOSシステムを設計する際は、他のハードウェアリソースの割り当て方、死活監視、ブートシーケンス、セキュリティ関連のポリシーなど、考慮しなければならない要素がたくさんあります。

これらの方法以外にも、ハイパーバイザーを用いて一つのSoCやクラスター上で複数のシステムを動かす方法があります。これについては、また別の機会に紹介したいと思います。

おわりに

以上に挙げた製品以外にも、有名なところではNVIDIA社やQualcom社を始め、自動運転や高性能なIVI (In-Vehicle Infotainemnt) の用途を想定した様々な車載向けSoCが存在します。Turing では完全自動運転車の量産を見据えて、車両システム全体の設計の一環として目指すべきコンセプトを実現するためのECUをハード・ソフト共に内製しています

興味がある方は、Turing の公式 Web サイト採用情報などをご覧ください。話を聞きたいという方はやCTOの青木さんの X (旧Twitter) DM からでもお気軽にご連絡ください。

Tech Blog - Turing

Discussion