OSEK COMとAUTOSAR COMを比較してください。
ChatGPT:
はい。では OSEK COM と AUTOSAR COM の比較を整理します。両者は車載通信ミドルウェアとして共通点がありますが、設計思想・機能・スケーラビリティに大きな違いがあります。
- 背景
OSEK COM
OSEK/VDX 規格の一部で、OSEK OS 上でタスク間通信や ECU 間通信を抽象化するために定義。比較的シンプルで軽量。1990年代から2000年代前半に広く採用。
AUTOSAR COM
AUTOSAR Classic Platform の一部。OSEK COM の思想を継承しつつ、FlexRay・CAN・LIN・Ethernet など多様な通信バスに対応。さらに、PDUR(PDU Router)や SoAd(Socket Adaptor)などと分業することで拡張性を確保。- 機能比較
項目 OSEK COM AUTOSAR COM
対象通信 タスク間通信・ECU間通信(主にCAN) ECU間通信(CAN, FlexRay, LIN, Ethernet)、タスク間通信は RTE が担当
抽象化単位 Signal(信号)単位 I-PDU(Protocol Data Unit)単位、Signal はその中にマッピング
メッセージ記述 静的設定中心、シンプル ECU Configuration Description (ECU-C) に基づく XML 設定で高度に構成可能
送信方式 直接送信(Send)、周期送信、イベント送信 Periodic, Event-Triggered, Mixed, Grouping, Dynamic length, End-to-End 保護
受信方式 Direct, Indirect Direct, Queued, Grouping、フィルタリング可能
信頼性機能 基本的な更新フラグ・タイムアウト監視 I-PDU レベルでのタイムアウト監視、E2E プロテクション(CRC, Counter)
スケーラビリティ 小規模 ECU 向けに軽量 大規模システム向け、分散開発・異種ネットワーク対応
関連モジュールとの関係 OSEK OS と密結合、通信とスケジューリングが近い COM は PDUR, RTE, NM, SoAd などと分担、レイヤードアーキテクチャ- 設計思想の違い
OSEK COM
ECU 内タスク通信+ECU 間通信を「Signal」という抽象化で統一。
単一 ECU 視点での軽量実装を重視。
通信制御の柔軟性は低いが、オーバーヘッドが少ない。
AUTOSAR COM
ECU 内のタスク通信は RTE、ECU 間通信は COM と分離。
複雑なシステムやマルチベンダ環境に対応するため、設定ファイル(ARXML)で通信マトリクスを定義。
信頼性・安全性(E2E 保護、ASIL 対応)を考慮。- まとめ
OSEK COM → シンプル・軽量、CAN中心、小規模 ECU 向け。
AUTOSAR COM → 拡張性・多様な通信方式・高信頼性、標準化された設定管理。
言い換えると、OSEK COM は「単体ECUに最適化された実装」、AUTOSAR COM は「複数 ECU・大規模システム開発を前提としたプラットフォーム化」と言えます。
ご希望なら、次は OSEK COM の API と AUTOSAR COM の API の具体的対応関係 を表形式で並べて比較することもできますが、そちらもまとめましょうか?
ご説明の観点がないとは言いません。別の視点では、OSEK COMは、AUTOSAR COMほどECU間通信についての具体的なコード生成ができるところまで定義していないという認識です。具体的には、AUTOSAR COMでは、RTEという名称でコード生成することによりECU間通信のコード生成方法を具体化しているだけで、OSEK COMは、具体化はプログラマにまかされているという感想です。RTE生成が絶対的な方法ではなく、Template、Libraryで解決する方法もあると思います。いかがでしょうか。
ChatGPT:
とても鋭いご指摘です。ご認識は正しく、実際に OSEK COM と AUTOSAR COM の本質的な差は「通信の抽象化レベル」や「コード生成まで踏み込んでいるかどうか」にあります。
以下、その観点を軸に整理してみます。
- コード生成に関する立ち位置の違い
OSEK COM
通信の API(SendMessage, ReceiveMessage 等)と信号モデルは定義されているが、コード生成の方法やフレームワーク構造までは規定していない。
したがって、アプリケーションコードは通信 API を直接呼ぶ形になり、ECU間通信の実装やコード配置は 開発者/ベンダ依存。
つまり「仕様としての抽象化」はあるが、「生成物としての具体化」は規定外。
AUTOSAR COM + RTE
AUTOSAR COM は ECU間通信を PDU 単位でモデル化し、さらにそれを RTE が Signal 単位にマッピングしてアプリ層へ提供する。
RTE ジェネレータは、ARXML(ECU Extract、System Description)を入力にして、自動的に通信コード(送受信のスタブ)を生成。
これにより、アプリ開発者は通信APIを直接叩かず、「Rte_Write」「Rte_Read」といった抽象化された呼び出しに専念できる。- RTE生成は「絶対」か?
ご指摘のように、
AUTOSAR の「RTE生成」が唯一の手段ではなく、実装形態はプロジェクトによって異なります。
RTE Generator 方式(標準的):ツールで完全自動生成。
Template 方式:手書きコードに対し、スケルトンやヘッダだけを生成し、ユーザが埋める。
Library 方式:共通通信ライブラリをリンクし、設定に応じて参照する。
AUTOSAR 標準が強く推奨するのは「RTEジェネレータ方式」ですが、特定の制約(軽量ECUや低コスト開発)では OSEK COM的な手法に近づけて運用するケースも現実的に存在します。- 設計思想の違いをこの視点でまとめると
OSEK COM = 「API仕様を提供する規格」 → 実際の通信コードの生成・管理はプログラマ/ベンダが担う。
AUTOSAR COM + RTE = 「モデル駆動開発を前提とした規格」 → ARXML をもとにコード生成し、ECU間通信の結合をツールチェーンで担保。
言い換えれば、
OSEK COMは「プログラマに任せる自由度が高い」
AUTOSAR COMは「ツールによる一貫した生成・管理を前提」
ということになります。
✅ ご質問の視点を踏まえると、結論は:
OSEK COMは通信抽象化を提供するがコード生成までは規定しない。一方AUTOSAR COMはRTEを通じてECU間通信をコード生成により具体化する。ただしRTE生成は唯一絶対ではなく、TemplateやLibraryといった軽量的な手法も実装可能。
ご要望に合わせて、次は「OSEK COMでプログラマが書くコード例」と「AUTOSAR COM+RTEで生成されるコード例」を並べて比較する形で示すと理解がもっと深まると思いますが、それも整理してみましょうか?
はい。お願いします。
ChatGPT:
SensorIf SensorValue uint16 自動生成される RTE ヘッダ(抜粋) Std_ReturnType Rte_Write_SensorIf_SensorValue(uint16 value); Std_ReturnType Rte_Read_SensorIf_SensorValue(uint16 *value); アプリケーションコード(SWC 内) #include "Rte_SensorComponent.h" /* 送信側(Sender SWC Runnable) */ void Runnable_SensorUpdate(void) { uint16 sensor_value = ReadSensor(); (void)Rte_Write_SensorIf_SensorValue(sensor_value); } /* 受信側(Receiver SWC Runnable) */ void Runnable_SensorProcess(void) { uint16 received_value; if (Rte_Read_SensorIf_SensorValue(&received_value) == RTE_E_OK) { ProcessValue(received_value); } } ➡️ アプリは Rte_Write / Rte_Read を呼ぶだけ。 ➡️ 実際の通信(CAN送信、受信割り込み処理、タイムアウト監視など)は COMモジュール+PDUR が担い、RTE 経由で自動的に呼ばれる。 ➡️ どのECU間で結合するかは System Description ARXML に記述され、コード生成で担保。 >3. 比較まとめ 項目 OSEK COM AUTOSAR COM + RTE アプリ層 API SendMessage, ReceiveMessage Rte_Write, Rte_Read コード生成 なし(プログラマが書く) ツールが生成(ARXMLベース) 抽象化単位 Message(Signalに近い) Signal(RTE) ↔ PDU(COM) 通信処理 プログラマが設計 COM/PDUR/NMが隠蔽 自動化度合い 低い(自由度大) 高い(モデル駆動) ✅ つまり: OSEK COM は「プログラマが API を直接呼び出し、通信設計も実装も手動」。 AUTOSAR COM + RTE は「モデル定義に基づいてツールがコードを生成、アプリは RTE API に専念」。 ご希望なら、さらに「OSEK COMで書いたコードをAUTOSAR RTEスタイルに“移植”する際の変換ポイント」を整理することもできますが、進めますか?では、OSEK COM と AUTOSAR COM(RTEあり)のコードイメージ比較を示します。
ここでは「センサー値を送信し、別ECUが受信して処理する」シナリオを例にします。
- OSEK COM の場合
OSEK COM は「通信APIが規定されているだけ」で、どのようにコードを分割・配置するかは開発者が決めます。
設定例(OSEK OILファイル抜粋)
MESSAGE SensorValueMsg {
STATUS = STANDARD;
LENGTH = 2;
NOTIFICATION = ACTIVATETASK { TaskReceiver };
};
アプリケーションコード
#include "osekcom.h"
/* 送信側タスク /
TASK(TaskSender) {
uint16 sensor_value = ReadSensor();
SendMessage(SensorValueMsg, &sensor_value);
TerminateTask();
}
/ 受信側タスク */
TASK(TaskReceiver) {
uint16 received_value;
ReceiveMessage(SensorValueMsg, &received_value);
ProcessValue(received_value);
TerminateTask();
}
➡️ API はシンプルで、SendMessage / ReceiveMessage を直接呼びます。
➡️ どのタスクで送受信するか、どのタイミングで呼ぶかは完全にプログラマが設計。- AUTOSAR COM + RTE の場合
AUTOSAR では COM が PDU を扱い、それを RTE が Signal としてアプリ層に見せます。アプリは COM API を直接呼ばず、RTE API を通して通信。
設定例(ARXML 抜粋)
はい。お願いします。
ChatGPT:
承知しました 👍
では次は、OSEK COM のコードを AUTOSAR COM + RTE スタイルへ移植するときの変換ポイントを整理します。
- 視点の違い
OSEK COM
タスク主体(TaskSender, TaskReceiver のようにタスクで送受信を実装)。
通信API (SendMessage, ReceiveMessage) を直接呼ぶ。
AUTOSAR COM + RTE
SWC(Software Component)+Runnable 主体。
通信は RTE API (Rte_Write, Rte_Read) を呼ぶ。
タスクやスケジューリングは OS/BSW が分担。- 変換ポイント一覧
観点 OSEK COM AUTOSAR COM + RTE 移植時の変換
通信API SendMessage, ReceiveMessage Rte_Write, Rte_Read 直接呼び出しを RTE API に置き換える
抽象化単位 Message(OSEK定義) Signal(ARXML定義)、内部は PDU OIL の Message 定義 → ARXML の SenderReceiverInterface に変換
コード配置 タスク関数内で直接送受信 Runnable 内で RTE API を呼ぶ Task を Runnable に変換、周期は OS/SchM が管理
設定情報 OIL ファイルに Message 記述 ECU Extract / System Description (ARXML) OIL の定義を ECUC コンフィグツールに移植
データ型 C言語で直接定義 Implementation Data Type (ARXML) 型を ARXML に宣言、ツールで Rte_Type.h が生成される
通信経路 開発者がAPI呼び出しで明示 ツールが接続を解決(Sender ↔ Receiver Mapping) 接続情報は System Description に定義- 移植イメージ例
OSEK COM コード(送信側)
TASK(TaskSender) {
uint16 sensor_value = ReadSensor();
SendMessage(SensorValueMsg, &sensor_value);
TerminateTask();
}
AUTOSAR RTE コード(送信側)
void Runnable_SensorUpdate(void) {
uint16 sensor_value = ReadSensor();
(void)Rte_Write_SensorIf_SensorValue(sensor_value);
}
OSEK COM コード(受信側)
TASK(TaskReceiver) {
uint16 received_value;
ReceiveMessage(SensorValueMsg, &received_value);
ProcessValue(received_value);
TerminateTask();
}
AUTOSAR RTE コード(受信側)
void Runnable_SensorProcess(void) {
uint16 received_value;
if (Rte_Read_SensorIf_SensorValue(&received_value) == RTE_E_OK) {
ProcessValue(received_value);
}
}- 注意点
タスク→Runnable変換
OSEKでは「タスク起動」が通信トリガ。
AUTOSARでは「RTEイベント(周期イベント・データ受信イベント)」が Runnable を呼ぶ。
移植時には「どのイベントでRunnableが実行されるか」を ARXML に設定する必要あり。
自由度の違い
OSEK COMは「コードを自由に書ける」ので軽量。
AUTOSAR COM+RTEは「ツールに合わせて書く」ので標準化・自動化は進むが制約は大きい。
✅ まとめると:
OSEK COM → AUTOSAR COM+RTE 移植のカギは「Task中心のコードをRunnable化し、Send/Receive APIをRTE APIに置き換えること」。通信定義(OIL→ARXML)とイベントトリガ(Task→RTEイベント)の対応を正しく設計することが重要。
ご希望なら、次は 「OSEK COMのOIL定義」と「AUTOSAR COMのARXML定義」を対比した例(1対1対応表)」 を作ってみましょうか?
はい。お願いします。
ChatGPT:
uint16 VALUE uint16 (b) インタフェース定義 SensorIf SensorValue uint16 (c) イベント定義(受信側Runnableを起動) SensorValue_ReceivedEvent /SensorIf/SensorValue Runnable_SensorProcess >3. OIL と ARXML の対応表 機能/属性 OSEK COM (OIL) AUTOSAR COM (ARXML) 移植時の対応 メッセージ名 SensorValueMsg SensorValue Message 名を Data Element 名にマッピング データ型 LENGTH = 2; (2バイト) uint16 OILのLengthをARXMLの型定義に変換 送信先/受信先 API呼び出しで明示 (SendMessage→ReceiveMessage) System Description 内で Sender/Receiver Mapping OILではコード内指定、ARXMLではツールで接続解決 受信通知 NOTIFICATION = ACTIVATETASK { TaskReceiver }; で Runnable をトリガ Task起動→Runnable起動に置き換え メッセージカテゴリ STATUS = STANDARD; COM Spec に基づく I-PDU Mapping(Unqueued/Queued) OILの属性をARXMLのCOMシグナルグループ設定に変換 >4. 移植のポイント Task ↔ Runnable OSEK COMでは「TaskReceiver」が直接起動。 AUTOSARでは「Runnable_SensorProcess」が によって起動。 Length ↔ Implementation Data Type OSEKのLENGTH=2はバイト数。 AUTOSARではデータ型(uint16)を ARXMLで定義。 Notification ↔ RTE Event OSEK COM の通知機構(タスク起動)を AUTOSARでは「イベント定義(データ受信イベント)」に変換。 ✅ まとめると: OILのMESSAGE定義(名前・長さ・通知先)は、ARXMLでは「DataType定義」「SenderReceiverInterface」「Event定義」に分解されて表現される。 つまり、OSEK COMが1つの記述に詰め込んでいた情報を、AUTOSARではモデル要素ごとに細かく分けて定義します。 ご希望なら、次は「OSEK COMのSend/Receive API と AUTOSAR RTEのWrite/Read API の対応表」を作って、コードレベルの移植マッピングを整理してみましょうか?いいですね 👍
では、OSEK COM の OIL 定義 と AUTOSAR COM の ARXML 定義 を並べて、
「どの設定がどのように移植されるか」を 1対1 の対応表で示します。
- OSEK COM の OIL 定義例
MESSAGE SensorValueMsg {
STATUS = STANDARD; /* 標準メッセージ /
LENGTH = 2; / データ長 (bytes) */
NOTIFICATION = ACTIVATETASK { TaskReceiver };
};- AUTOSAR COM の ARXML 定義例
(a) データ型定義
はい。お願いします。
ChatGPT:
では、次は OSEK COM の API と AUTOSAR RTE API の対応を整理します。
「OSEK COM のコードを AUTOSAR RTE で書き換えるとき、どの呼び出しが何に対応するか」が一目でわかる形にしました。
- OSEK COM API と AUTOSAR RTE API の対応表
機能 OSEK COM API AUTOSAR RTE API 補足
データ送信 SendMessage(MessageId, &data) Rte_Write_(data) OSEKはMessage名で識別、AUTOSARはPort/DataElement名で識別
データ受信 ReceiveMessage(MessageId, &data) Rte_Read(&data) OSEKは直接コピー、AUTOSARはツール生成APIで読み出し
データ更新フラグチェック GetMessageStatus(MessageId) (暗黙的にイベントで通知)または Rte_IsUpdated_(&flag)(ツール依存) AUTOSARでは通常イベントトリガ、明示チェックはオプション
周期送信設定 OILの属性(周期タスク+SendMessage呼び出し) によりRunnableを周期実行し、その中で Rte_Write AUTOSARはイベントで制御、コード内に周期ロジックを書かない
受信通知 OILの NOTIFICATION = ACTIVATETASK → 受信タスク起動 によりRunnable起動 Task呼び出しがRunnable呼び出しに変換される- コード変換イメージ
OSEK COM 送信側
TASK(TaskSender) {
uint16 sensor_value = ReadSensor();
SendMessage(SensorValueMsg, &sensor_value);
TerminateTask();
}
AUTOSAR RTE 送信側
void Runnable_SensorUpdate(void) {
uint16 sensor_value = ReadSensor();
(void)Rte_Write_SensorIf_SensorValue(sensor_value);
}
OSEK COM 受信側
TASK(TaskReceiver) {
uint16 received_value;
ReceiveMessage(SensorValueMsg, &received_value);
ProcessValue(received_value);
TerminateTask();
}
AUTOSAR RTE 受信側
void Runnable_SensorProcess(void) {
uint16 received_value;
if (Rte_Read_SensorIf_SensorValue(&received_value) == RTE_E_OK) {
ProcessValue(received_value);
}
}- 移植時の注意点
識別子の違い
OSEKは MessageId で通信を識別。
AUTOSARは Port と DataElement 名で識別。
イベント駆動の違い
OSEKはタスク起動が通知手段。
AUTOSARは DataReceivedEvent / TimingEvent でRunnableを起動。
コード生成の有無
OSEKではAPIをそのまま使うので「人が書く」。
AUTOSARはRTEがAPIを生成してくれるので「人は呼び出すだけ」。
✅ まとめ:
OSEK COM の Send/Receive API は、AUTOSAR では Rte_Write/Rte_Read に対応し、イベント通知や周期処理は OIL の Task/Notification 設定から ARXML の Event 定義へ移行する。
つまり「API呼び出し+タスク設計」→「RTE API呼び出し+イベント駆動」に変換するのが移植の本質です。
👉 次のステップとしては、OSEK COM の「メッセージ通信設計表(OILベース)」を AUTOSAR COM の「通信マトリクス(System Description ARXML)」に落とし込む変換表を作ると、さらに現場で役立つ比較になると思います。
こちらもご覧になりますか?
はい。お願いします。
ChatGPT:
では、今度は OSEK COM の「メッセージ通信設計表(OILベース)」と AUTOSAR COM の「通信マトリクス(System Description ARXML)」の対応関係 をまとめます。
実際の移植作業では「どのECUがどのデータを送受信するか」を表に落とし込み、それを OIL → ARXML に変換するのが肝になります。
- OSEK COM の通信設計表(例:OILベース)
Message 名 データ長 送信 ECU 送信タスク 受信 ECU 受信タスク 通知方法
SensorValueMsg 2 byte ECU1 TaskSender ECU2 TaskReceiver ACTIVATETASK
➡ OSEK では Message ID を基点に、送信側タスクと受信側タスクを結びつける。
➡ 通信パスは API 呼び出し(SendMessage / ReceiveMessage)で表現される。 - AUTOSAR COM の通信マトリクス(System Description ARXML)
AUTOSAR では、通信の役割を「Signal」「I-PDU」「Port」で分割して定義します。
要素 ARXML 記述 対応する OSEK COM 設計情報
DataType uint16 LENGTH=2 (データ長)
Interface SensorIf Message 名
DataElement SensorValue Message 名 (Payload名)
Sender SWC SensorPort 送信 ECU + 送信タスク
Receiver SWC ActuatorPort 受信 ECU + 受信タスク
System Mapping ECU間の通信経路
Event Trigger / OILの NOTIFICATION 属性 - 対応表:OIL → ARXML
OSEK COM (OIL) AUTOSAR COM (ARXML) 備考
MESSAGE SensorValueMsg { LENGTH=2; } SensorValue Message = DataElement に相当
STATUS = STANDARD; の Unqueued 型 標準Messageは Unqueued通信に対応
NOTIFICATION = ACTIVATETASK{TaskReceiver}; Task起動 → Runnable起動
TaskSender (送信側) Runnable_SensorUpdate Task → Runnable
TaskReceiver (受信側) Runnable_SensorProcess Task → Runnable
ECU間の Message マッピング ECU Extract / System Description で記述 - イメージ図
OSEK COM
[TaskSender] --SendMessage(SensorValueMsg)--> [COM] --> [TaskReceiver]
AUTOSAR COM + RTE
[Runnable_SensorUpdate] --Rte_Write(SensorValue)--> [RTE]--[COM/PDUR]--> [RTE]--Rte_Read(SensorValue)-->[Runnable_SensorProcess]
✅ まとめ
OSEK COM の通信表は「Message ID」を中心にタスクを接続する。
AUTOSAR COM の通信表(System Description)は「DataElement(信号)」を中心に SWC の Port を接続し、それを I-PDU にマッピングする。
移植時の変換ポイント
Message名 → DataElement名
Task → Runnable
Notification → RTE Event
OIL定義 → ARXML(ECUC + System Description)
👉 次のステップとしては、実務で役立つ形で「OSEK COM の通信設計表を AUTOSAR System Description に変換するチェックリスト(作業手順リスト)」をまとめることもできますが、それもご覧になりますか?
あなた:
はい。お願いします。
ChatGPT:
了解しました 👍
では、OSEK COM の通信設計表を AUTOSAR System Description に変換するためのチェックリスト(作業手順リスト) をまとめます。
🚗 OSEK COM → AUTOSAR COM 変換チェックリスト
- OSEK COM の Message 情報を整理
Message 名(例:SensorValueMsg)
データ長 (LENGTH)(例:2 byte)
送信 ECU / 送信タスク
受信 ECU / 受信タスク
通知方法 (ACTIVATETASK / EVENT / NONE)
➡ ここまでは OIL の MESSAGE { ... } ブロックで定義済み。 - AUTOSAR Data Type 定義へマッピング
OSEK の LENGTH を AUTOSAR の ImplementationDataType に変換
例:uint16
複合データの場合は ApplicationDataType + CompType を定義 - AUTOSAR Interface / DataElement 定義
OSEK Message 名を SenderReceiverInterface に変換
Payload を DataElement として定義
例:SensorValue - Runnable と Port の対応付け
OSEK の 送信タスク → AUTOSAR の Runnable_Sender
OSEK の 受信タスク → AUTOSAR の Runnable_Receiver
Runnable に PortPrototype を割り当てる
送信側:Rte_Write(SensorValue)
受信側:Rte_Read(SensorValue) - Notification のイベント変換
ACTIVATETASK → DataReceivedEvent に変換
EVENT → ModeSwitchEvent or TimingEvent に対応付け
NONE → Polling 受信 (Runnable が周期で呼ばれる) - ECU 間通信のマッピング
OSEK で ECU 間に定義された Message を I-PDU に割り当てる
を作成
PDUR / COM 設定で 送信側 I-PDU → 受信側 I-PDU をマッピング - ARXML に落とし込む
ECUC 設定(ECUごとの COM/PDUR/ECU-C)
System Description(ECU間の信号割付)
SWC Description(Port / Runnable / Interface の定義)
📝 まとめ
OSEK COM → 「Message とタスクの結合表」
AUTOSAR COM → 「Signal/DataElement と Runnable/Port の結合表」
変換の鍵は
Message 名 → DataElement 名
Task → Runnable
Notification → RTE Event
ECU間通信 → I-PDU Mapping
👉 次の段階としては、実務で使えるように OSEK OIL → AUTOSAR ARXML の変換サンプル(Before/Afterコード例) を書き出すと理解が進みやすいと思いますが、やってみますか?
あなた:
はい。お願いします。
ChatGPT:
では、OSEK OIL → AUTOSAR ARXML の変換サンプル(Before / After) を書いてみます。
内容をかなり簡略化していますが、どのように置き換わるかを把握するのに役立つと思います。
🔹 1. OSEK COM 側 (OIL 定義)
MESSAGE SensorValueMsg {
STATUS = STANDARD;
LENGTH = 2;
NOTIFICATION = ACTIVATETASK { TaskReceiver };
};
TASK TaskSender {
PRIORITY = 1;
ACTIVATION = 1;
AUTOSTART = TRUE;
};
TASK TaskReceiver {
PRIORITY = 2;
ACTIVATION = 1;
AUTOSTART = FALSE;
};
💡 ポイント
Message 名:SensorValueMsg
データ長:2 byte
送信タスク:TaskSender
受信タスク:TaskReceiver
通知:ACTIVATETASK
🔹 2. AUTOSAR 側 (ARXML 定義例)
(a) DataType 定義
uint16
VALUE
/BaseTypes/uint16
(b) Interface 定義
SensorIf
SensorValue
uint16
(c) SWC + Runnable 定義
SensorSenderSWC
SenderPort
/SensorIf
Runnable_Sender
uint16 sensorValue = 123;
TASK(TaskSender) {
/* センサ値を送信 */
SendMessage(SensorValueMsg, &sensorValue);
TerminateTask();
}
TASK(TaskReceiver) {
uint16 receivedValue;
/* センサ値を受信 */
ReceiveMessage(SensorValueMsg, &receivedValue);
/* 処理 */
processSensorValue(receivedValue);
TerminateTask();
}
💡 特徴
SendMessage / ReceiveMessage を直接呼び出す
タスクが直接 COM にアクセスする
Notification (ACTIVATETASK) により TaskReceiver が起動する
🔹 2. AUTOSAR RTE 側 (C コード例)
#include "Rte_SensorSenderSWC.h"
#include "Rte_SensorReceiverSWC.h"
/* 送信側 Runnable /
void Runnable_Sender(void) {
uint16 sensorValue = 123;
/ RTE 経由で送信 */
(void)Rte_Write_SenderPort_SensorValue(sensorValue);
}
/* 受信側 Runnable /
void Runnable_Receiver(void) {
uint16 receivedValue;
/ RTE 経由で受信 */
(void)Rte_Read_ReceiverPort_SensorValue(&receivedValue);
/* 処理 */
processSensorValue(receivedValue);
}
💡 特徴
Rte_Write / Rte_Read API を使用
Runnable が RTE を介して COM にアクセス
Notification (DataReceivedEvent) により Runnable_Receiver が起動
🔹 3. Before / After 対応表
OSEK COM API AUTOSAR RTE API 備考
SendMessage(SensorValueMsg, &value) Rte_Write_SenderPort_SensorValue(value) Message 名 → Port/DataElement 名
ReceiveMessage(SensorValueMsg, &value) Rte_Read_ReceiverPort_SensorValue(&value)
ACTIVATETASK(TaskReceiver) DataReceivedEvent → Runnable_Receiver 実行 Notification 機能の変換
🔹 4. 移植のポイント
Message 名の対応
OSEK: SensorValueMsg
AUTOSAR: PortName_DataElement (SenderPort_SensorValue)
タスク呼び出し → Runnable 呼び出し
OSEK: TaskReceiver を OS が起動
AUTOSAR: Runnable_Receiver を RTE がイベントで起動
API の違い
OSEK: COM API(抽象度低い、直接メッセージ操作)
AUTOSAR: RTE API(抽象度高い、SWC間のデータフロー)
✅ まとめ
OSEK COM:軽量で直接的 (SendMessage / ReceiveMessage)
AUTOSAR COM:RTE を介した高抽象度 API (Rte_Write / Rte_Read)
移植時には Message → Port/DataElement、Task → Runnable、Notification → Event に置き換えるのが基本ステップです。
👉 次の段階では、もしご希望なら 「OSEK COM の複数受信者(マルチキャスト)」を AUTOSAR COM に移植した場合の違い も整理できますが、見てみますか?
あなた:
はい。お願いします。
ChatGPT:
了解です 👍
では、OSEK COM の複数受信者(マルチキャスト)を AUTOSAR COM に移植した場合の違い を整理します。
- OSEK COM のマルチキャスト例
MESSAGE SensorValueMsg {
STATUS = STANDARD;
LENGTH = 2;
NOTIFICATION = ACTIVATETASK { TaskReceiver1, TaskReceiver2 };
};
TASK TaskSender {
PRIORITY = 1;
ACTIVATION = 1;
AUTOSTART = TRUE;
};
TASK TaskReceiver1 { PRIORITY = 2; ACTIVATION = 1; AUTOSTART = FALSE; }
TASK TaskReceiver2 { PRIORITY = 3; ACTIVATION = 1; AUTOSTART = FALSE; }
C コード例
TASK(TaskSender) {
uint16 sensorValue = 123;
SendMessage(SensorValueMsg, &sensorValue);
TerminateTask();
}
TASK(TaskReceiver1) {
uint16 value;
ReceiveMessage(SensorValueMsg, &value);
processReceiver1(value);
TerminateTask();
}
TASK(TaskReceiver2) {
uint16 value;
ReceiveMessage(SensorValueMsg, &value);
processReceiver2(value);
TerminateTask();
}
💡 ポイント
OSEK COM では 1つの Message を複数タスクに通知可能
Notification 属性に複数タスクを列挙するだけでマルチキャスト
2. AUTOSAR COM での対応
AUTOSAR COM では、Signal(DataElement)を複数の SWC / Runnable に配信できます。
Sender は 1つの Rte_Write で送信
複数の Receiver はそれぞれ独立した DataReceivedEvent + Runnable で受信
SWC / Runnable 例
/* 送信側 Runnable */
void Runnable_Sender(void) {
uint16 sensorValue = 123;
(void)Rte_Write_SenderPort_SensorValue(sensorValue);
}
/* 受信側1 */
void Runnable_Receiver1(void) {
uint16 value;
if (Rte_Read_Receiver1Port_SensorValue(&value) == RTE_E_OK) {
processReceiver1(value);
}
}
/* 受信側2 */
void Runnable_Receiver2(void) {
uint16 value;
if (Rte_Read_Receiver2Port_SensorValue(&value) == RTE_E_OK) {
processReceiver2(value);
}
}
ARXML でのマッピング
Event_SensorValue_Receiver1
/SWC1/Runnable_Receiver1
コンパクトで効率的:リソース制約のあるリアルタイム環境向けに最適化されています。
安全性とセキュリティ:ISO 26262やISO/SAE 21434などの業界標準に準拠しています。
多様な互換性:スマートセンサーから車両コンピュータまで、さまざまなECUタイプに適しています。
これにより、ARMベースの軽量ECUでもAUTOSAR Classic Platformを効果的に導入できます。
2. Raspberry Piを用いたAUTOSARの移植実験
Porting AUTOSAR to a high performance embedded systemという研究では、ARMベースのRaspberry PiにAUTOSARを移植する実験が行われました。この研究では、AUTOSAR準拠のOSの起動、SPIドライバの開発、CAN通信の実現などが報告されています。
このような移植実験は、ARMベースのECUにおけるAUTOSARの適用可能性を示す一例です。
✅ まとめ
ARMベースのECUにおいても、AUTOSAR Classic Platformを導入することで、標準化されたソフトウェアアーキテクチャを実現できます。RTA-CARのような軽量化されたAUTOSARスタックを使用することで、リソース制約のあるECUでもAUTOSARの利点を享受できます。また、移植実験の結果は、ARMベースのECUにおけるAUTOSARの適用可能性を示しています。
さらに詳しい情報や特定のプラットフォームに関する質問がございましたら、お気軽にお知らせください。
あなた:
「RTA-CARのような軽量化されたAUTOSARスタック」をご紹介ください。
ChatGPT:
RTA-CAR(Real-Time Automotive Classic AUTOSAR)は、ETAS社が提供するAUTOSAR Classic Platform向けの軽量で高効率なソフトウェアスタックです。特に、ARM Cortex-Mシリーズなどのリソース制約のあるECU向けに最適化されており、以下の特徴があります。
🔧 RTA-CARの主な特徴
- コンパクトで効率的な設計
軽量OS:RTA-CARのオペレーティングシステム(OS)は、競合他社のソリューションと比較して最大50%少ないメモリ容量で動作します。これにより、リソース制約のあるECUでも効率的に動作します。
Etas
最適化された通信ドライバ:RTA-CARは、CAN、Ethernet、FlexRay、LINなどの通信プロトコルに対応しており、これらの通信ドライバは最適化されており、リソースの使用を最小限に抑えます。
Etas - AUTOSAR標準への準拠
ISO 26262対応:RTA-CARは、機能安全の国際規格であるISO 26262に準拠しており、ASIL-Dレベルの安全要求にも対応しています。
Etas
セキュリティ対応:ISO/SAE 21434やUN-R155などのセキュリティ基準にも対応しており、車両のサイバーセキュリティを確保します。
Etas - 柔軟なツールチェーンの提供
ISOLAR-A:AUTOSAR Classicアーキテクチャの設計ツールで、システムおよびアプリケーションソフトウェアの設計を支援します。
Etas
ISOLAR-B:AUTOSAR基本ソフトウェアの構成ツールで、RTAコード生成スイートをオーケストレーションします。
Etas
RTA-BSW:AUTOSAR基本ソフトウェアのモジュールコードジェネレータで、ARXML構成からAUTOSAR Classicランタイムソフトウェアを生成します。
Etas
🚗 適用事例と導入実績
RTA-CARは、世界中の数百社の企業で使用されており、数十億台の自動車ECUで稼働しています。特に、ボディ・コンフォート、車両ダイナミクス、内燃機関および電動パワートレイン、ゲートウェイなどの自動車アプリケーションドメインでの使用に適しています。
Etas
✅ まとめ
RTA-CARは、リソース制約のあるECU向けに最適化されたAUTOSAR Classic Platformソフトウェアスタックであり、軽量で効率的な設計、AUTOSAR標準への準拠、柔軟なツールチェーンの提供などの特徴があります。これにより、ARM Cortex-Mシリーズなどのマイクロコントローラを搭載したECUでも、AUTOSAR準拠のソフトウェアアーキテクチャを実現できます。
さらに詳しい情報や特定のプラットフォームに関する質問がございましたら、お気軽にお知らせください。
あなた:
柔軟なツールチェーンには具体的にどのような機能がありますか?
ChatGPT:
承知しました。RTA-CAR の柔軟なツールチェーンには、AUTOSAR Classic Platform の開発・構成・コード生成・テストを支援するための具体的な機能があります。以下に整理します。
🔧 1. ISOLAR-A:システムおよびアプリケーション設計ツール
主な機能
機能 説明
システムアーキテクチャ設計 ECU、SWC、Port、Interface の構成をグラフィカルに設計可能
SWC モデル管理 Sender/Receiver インターフェース、Client/Server インターフェースを設計・編集
ARXML 生成 AUTOSAR 標準フォーマット(ARXML)にエクスポート
モデル検証 ポート接続の整合性やデータ型の一致などを自動チェック
💡 例: 複数の SWC を ECU 上でどのようにマッピングするか設計し、RTE コード生成に必要な情報を整理できる
🔧 2. ISOLAR-B:BSW 構成ツール
主な機能
機能 説明
BSW モジュール選択 CAN、LIN、Ethernet、FlexRay などのドライバ・サービスを選択
モジュール設定 各 BSW モジュールのパラメータ(バッファサイズ、スケジューリング設定など)を設定
ECU 設定の統合 複数 ECU 間の通信や共通設定を統合
ARXML 入力 ISOLAR-A が生成した ARXML を入力し、BSW 設定と統合
💡 例: CAN 通信バッファのサイズや周期を ECU ごとに最適化し、軽量化した構成を生成
🔧 3. RTA-BSW:コード生成ツール
主な機能
機能 説明
RTE コード生成 ARXML の SWC・System Description から RTE ランタイムコードを生成
BSW コード生成 ISOLAR-B 設定に基づき、BSW モジュールの C コードを生成
コンフィギュレーション最適化 不要なモジュールや機能を除外して軽量化
複数ターゲットサポート ARM Cortex-M 系や他の組み込み MCU 向けに生成可能
💡 例: 軽量 ECU 向けに RTE コードサイズを削減したり、マルチキャスト信号の扱いを最適化したコードを自動生成
🔧 4. テスト・検証支援機能
RTE シミュレーション:生成された RTE コードを PC 上で動作確認可能
ECU エミュレーション:ARM Cortex-M ボードなどでのテストを自動化
静的解析支援:コード生成前にモデルや設定の整合性チェック
生成コードの可視化:関数呼び出し階層や通信フローを図示
💡 例: マルチキャスト通信や複数 SWC 間のデータフローが意図通りに設計されているかを事前検証可能
✅ まとめ
RTA-CAR のツールチェーンは、以下の点で柔軟かつ実務に即しています:
設計段階からコード生成まで統合:ISOLAR-A/B → RTA-BSW
軽量 ECU 向け最適化:不要機能の除外、メモリ・CPU 負荷の最適化
テスト・検証支援:RTE シミュレーション、静的解析、可視化
ARM 系 ECU を含む複数プラットフォーム対応
必要であれば、これを元に 「RTA-CAR ツールチェーンを使った OSEK COM → AUTOSAR RTE 移植の具体的手順」 も整理できます。作成しますか?
あなた:
はい。お願いします。
ChatGPT:
では、RTA-CAR のツールチェーンを活用して OSEK COM ベースの ECU ソフトウェアを AUTOSAR RTE に移植する具体的手順 を整理します。ARM 系の軽量 ECU を想定した流れです。
🔹 1. 移植準備:モデル化と現状分析
ステップ
既存 OSEK COM のタスク/メッセージ構成を整理
送信・受信タスク、メッセージ名、通知方法を一覧化
マルチキャストや周期信号の有無も整理
SWC 分割方針の決定
OSEK タスクごとに SWC(Runnable の単位)を検討
受信側のタスクは独立 SWC に分けることが多い
通信フローの可視化
既存 OSEK COM のメッセージフロー図を作成
マルチキャスト、周期送信、イベント駆動の信号を明示
🔹 2. ISOLAR-A でシステム/SWC 設計
手順
ARXML モデルの作成
OSEK タスク → SWC Runnable にマッピング
メッセージ → RTE Port/DataElement に変換
Sender/Receiver 関係を設定
データ型の定義
uint16、float32 など OSEK COM 型を AUTOSAR 型に変換
信号サイズ、初期値、制約を設定
通信構成の定義
単方向(Send/Receive)や双方向(Client/Server)を設定
マルチキャスト信号は複数の Receiver Port に接続
🔹 3. ISOLAR-B で BSW 構成
手順
通信ドライバ設定
CAN/LIN/Ethernet/FlexRay ドライバを選択
バッファサイズ、周期、優先度を最適化
OS 設定
タスクスケジューリング(周期/イベント駆動)
OSEK から RTE に置き換える Runnable 起動条件を設定
ECU 設定統合
1 ECU 内の SWC と BSW の構成を統合
ARM Cortex-M のメモリ制約に合わせ最適化
🔹 4. RTA-BSW でコード生成
手順
RTE コード生成
ISOLAR-A/B の ARXML を入力
Sender/Receiver Port、Runnable 呼び出し、イベント駆動コード生成
BSW モジュール生成
CAN/LIN ドライバ、OS タスクコード生成
軽量化のため不要モジュールは除外
ARM Cortex-M 向けターゲット指定
クロスコンパイル設定、割り込み優先度、メモリマップ最適化
🔹 5. テスト・検証
手順
RTE シミュレーション
PC 上で生成 RTE コードの通信フローを確認
OSEK COM と同等のデータフローになるか検証
ECU 実機テスト
ARM Cortex-M ボード上で動作確認
マルチキャスト通信、周期送信、イベント駆動の動作確認
静的解析/コードレビュー
メモリ使用量、CPU 負荷を確認
ISO 26262 安全性要件のチェック
🔹 6. 移植完了・最適化
不要 BSW モジュールを削除し軽量化
RTE コードサイズ、スタックサイズ、通信バッファを微調整
マルチキャストや周期信号の最適化で応答性向上
✅ まとめ
OSEK COM → AUTOSAR RTE 移植の基本戦略
タスク・メッセージを SWC/Runnable + Port に変換
ISOLAR-A/B で通信・BSW 設定を構成
RTA-BSW でコード生成・ターゲット最適化
RTE シミュレーション & ECU 実機で検証
不要モジュール除去で軽量化
ポイント
ARM Cortex-M のような軽量 ECU でも RTA-CAR のツールチェーンを活用すれば、効率的かつ安全に移植可能
OSEK COM 的なシンプル通信構造は、RTE のイベント/ポート設定で再現可能
希望であれば、この流れを 図解付きの移植手順フロー にして、タスク→SWC→RTE Port の対応関係を一目で分かるように整理することも可能です。作りますか?
あなた:
具体的なソースコード付きでご紹介ください。
ChatGPT:
承知しました。では、OSEK COM のメッセージ送受信コードを RTA-CAR を使った AUTOSAR RTE コードに移植する具体例 を、ARM Cortex-M 向けの C ソースコード付きで示します。 - OSEK COM の例(元コード)
#include "osekcom.h"
uint16 sensorValue = 100;
/* センサー値送信タスク */
TASK(TaskSensorSender) {
SendMessage(SensorValueMsg, &sensorValue);
TerminateTask();
}
/* センサー値受信タスク */
TASK(TaskSensorReceiver) {
uint16 receivedValue;
ReceiveMessage(SensorValueMsg, &receivedValue);
processSensorValue(receivedValue);
TerminateTask();
}
TaskSensorSender → センサー値を送信
TaskSensorReceiver → 受信して処理
マルチキャストの場合は NOTIFICATION に複数タスク指定可能
2. RTA-CAR + AUTOSAR RTE への移植
2.1 SWC 設計(ISOLAR-A で作成)
OSEK タスクごとに Runnable を作成
Runnable_SensorSender
Runnable_SensorReceiver
メッセージ SensorValueMsg → RTE Port SensorValue
マルチキャストの場合は複数の Receiver Port に接続
2.2 RTE API コード(C言語)
#include "Rte_SensorSenderSWC.h"
#include "Rte_SensorReceiverSWC.h"
uint16 sensorValue = 100;
/* 送信側 Runnable /
void Runnable_SensorSender(void) {
/ RTE ポートを通して送信 */
Rte_Write_SenderPort_SensorValue(sensorValue);
}
/* 受信側 Runnable /
void Runnable_SensorReceiver(void) {
uint16 receivedValue;
/ RTE ポートから受信 /
if (Rte_Read_ReceiverPort_SensorValue(&receivedValue) == RTE_E_OK) {
processSensorValue(receivedValue);
}
}
💡 ポイント:
OSEK の SendMessage / ReceiveMessage を RTE の Rte_Write / Rte_Read に置き換え
マルチキャスト信号の場合、複数の Rte_Read をそれぞれの Receiver Runnable に設定
ARM Cortex-M 向けには、RTA-CAR が生成した OS タスクで Runnable が呼ばれる
2.3 マルチキャスト例
/ 受信側 Runnable1 */
void Runnable_Receiver1(void) {
uint16 value;
if (Rte_Read_Receiver1Port_SensorValue(&value) == RTE_E_OK) {
processReceiver1(value);
}
}
/* 受信側 Runnable2 /
void Runnable_Receiver2(void) {
uint16 value;
if (Rte_Read_Receiver2Port_SensorValue(&value) == RTE_E_OK) {
processReceiver2(value);
}
}
OSEK COM の NOTIFICATION = ACTIVATETASK {TaskReceiver1, TaskReceiver2} 相当
RTE では データ受信イベント に基づき各 Runnable が個別に起動
2.4 ARM Cortex-M への統合
int main(void) {
/ RTA-CAR OS 初期化 */
Os_Init(&OsConfig);
/* SWC/Runnable 初期化 */
Rte_Init();
/* OS スケジューラ開始 */
Os_Start();
while (1) {
/* OS が Runnable をイベント駆動で呼び出す */
}
}
RTA-CAR が提供する軽量 OS が ARM Cortex-M で動作
Runnable はデータ受信や周期イベントに従い起動
既存 OSEK タスク構造を RTE Runnable に置き換えることで移植可能
3. まとめ
比較 OSEK COM AUTOSAR RTE (RTA-CAR)
メッセージ送受信 SendMessage / ReceiveMessage Rte_Write / Rte_Read
マルチキャスト Notification で複数タスク 複数 Receiver Runnable + DataReceivedEvent
タスク管理 OS が直接起動 RTA-CAR OS が Runnable イベント駆動で起動
ARM Cortex-M 対応 手動スケジューリング RTA-CAR が軽量 OS とコード生成でサポート
💡 次のステップとして、このサンプルを 実際に RTA-CAR の ISOLAR-A/B/RTA-BSW ツールで ARXML を作成 → コード生成 → ARM ボードでテスト する流れも整理できます。
作成して示しますか?
あなた:
はい。お願いします。
ChatGPT:
では、先ほどの OSEK COM → AUTOSAR RTE 移植例をベースに、RTA-CAR のツールチェーンを用いた ARXML 作成から ARM Cortex-M でのテストまでの具体的フロー を整理します。図解付きのステップイメージも合わせて理解しやすくしています。
🔹 1. 移植準備
1.1 OSEK COM の通信/タスク整理
送信タスク(TaskSensorSender)、受信タスク(TaskSensorReceiver)を一覧化
メッセージ名、周期、マルチキャスト有無を整理
既存コードを解析し、信号型やデータサイズを確認
1.2 SWC 設計方針
OSEK タスクごとに Runnable を作成
受信側は複数 Receiver Runnable に分割(マルチキャストの場合)
通信ポート(Sender/Receiver Port)を定義
🔹 2. ISOLAR-A での ARXML 作成
作業内容:
SWC モデル作成
Runnable_SensorSender
Runnable_SensorReceiver1 / Receiver2
Port/Interface 定義
SensorValuePort: SenderPort / ReceiverPort
データ型定義
uint16_t など OSEK COM 型から AUTOSAR 型に変換
通信フロー検証
ポート接続の整合性チェック
🔹 3. ISOLAR-B での BSW 設定
作業内容:
ECU 設定の統合
1 ECU 内の SWC/Runnable の配置
BSW モジュール選択
CAN ドライバ、OS、通信サービス
OS スケジューリング設定
Runnable 起動条件(周期、イベント)を指定
メモリ/バッファ最適化
ARM Cortex-M の SRAM サイズに合わせる
🔹 4. RTA-BSW でのコード生成
作業内容:
ARXML を入力して RTE コード生成
BSW モジュールの C コード生成
ターゲット指定
ARM Cortex-M 向けクロスコンパイル
軽量化
不要モジュール除外、バッファ最適化
出力例:
Rte_SensorSenderSWC.c
Rte_SensorReceiverSWC.c
CanIf.c
Os.c
...
🔹 5. ARM Cortex-M 実機統合
#include "Rte.h"
#include "Os.h"
int main(void) {
Os_Init(&OsConfig); // RTA-CAR OS 初期化
Rte_Init(); // SWC / RTE 初期化
Os_Start(); // スケジューラ起動
while (1) {
// OS が Runnable を周期/イベント駆動で呼び出す
}
}
Runnable_SensorSender / SensorReceiver が OS イベントに従い起動
RTE を介して安全にデータ送受信
🔹 6. テスト・検証
RTE シミュレーション(PC 上)
データフローやマルチキャスト通信を確認
ECU 実機テスト(ARM Cortex-M)
CAN メッセージ送受信動作確認
受信 Runnable の正確な起動確認
静的解析 / メモリ確認
スタック使用量、バッファサイズ、CPU 負荷チェック
🔹 7. 最適化
不要 BSW モジュールの削除
Runnable 起動タイミング調整で CPU 使用率低減
マルチキャスト信号の最適化で通信負荷削減
🔹 まとめフロー図(イメージ)
OSEK COM コード
│
▼
解析・タスク整理
│
▼
ISOLAR-A → SWC/Runnable/Port 設計 → ARXML
│
▼
ISOLAR-B → BSW設定・OS設定 → ECU統合
│
▼
RTA-BSW → RTE + BSW Cコード生成
│
▼
ARM Cortex-M 実機統合
│
▼
テスト・検証 → 最適化
各ステップで軽量化、イベント駆動、マルチキャスト通信を調整
OSEK COM の構造を RTE Port / Runnable に置き換えるイメージ
💡 この手順に従えば、ARM Cortex-M 向けの軽量 ECU でも OSEK COM 構造を AUTOSAR RTE に安全かつ効率的に移植可能です。
必要であれば、このフローに 具体的な ARXML サンプル + RTA-BSW 設定例 まで添付した「実務用移植テンプレート」を作ることもできます。作りますか?
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。