AUTOSAR_AP_EXP_ARARustApplications
FIG-a83123ba78ad3af8
566 × 511 px
1 Release(s)
Figure 6.9: Calling a Method
SHA-256 Inhalts-Fingerabdruck:
a83123ba78ad3af8d0f0a81cb0ce0298073564eec1a510a51af5a900fc4e8e8c
✦
KI-generierte Bildanalyse & technische Beschreibung
Modell: gemini-3.8-flash (via agy) · Rezept figure-series@1 · erstellt am 2026-10-08
1. Diagrammtyp & Architektur-Kontext
- Klassifikation: UML-Sequenzdiagramm mit Aufteilung in zwei Sprachdomänen (
RustundC++), asynchronem Kontrollfluss und FFI-Übergang (Foreign Function Interface). - Technischer Zweck: Spezifikation des interoperablen Dienstaufruf-Musters (Method Invocation) in der AUTOSAR Adaptive Platform (ARA) für Rust-Applikationen. Es visualisiert das Mapping zwischen dem kooperativen, waker-basierten Asynchronitätsmodell von Rust (
Future,async/await, Channels) und dem callback-/future-basierten Modell des klassischen C++-ARA-Stacks (ara::core::Future,.then()).
2. Komponenten, Entitäten & Schnittstellen
Das Diagramm gliedert sich strikt entlang der Sprachgrenze:
Rust-Domäne
Executor: Asynchroner Task-Scheduler der Rust-Laufzeitumgebung (z. B. Tokio- oder systemnahe deterministische Task-Queue), der blockierungsfrei zwischen Tasks wechselt, sobald einPoll::Pendingsignalisiert wird.App: Die funktionale Adaptive Application (AA), implementiert in Rust, welche die ara::com-Dienstschnittstelle konsumiert.Proxy (gen): Generierter typsicherer Rust-Service-Proxy (aus ARXML-Service-Interfaces erzeugt), der der Applikation idiomatische Rust-APIs (async fn) bereitstellt.ara crate: Statische Laufzeit-Bibliothek/Crate des AUTOSAR-Rust-Stacks. Kapselt generische Inter-Task-Kommunikation, Asynchronitäts-Primitive (Channel-Erzeugung, Waker-Registrierung) und grundlegendes FFI-Handling.
C++-Domäne
Adapter (gen): Generierter C-kompatibler FFI-Wrapper/Brückencode. Entpackt C-ABI-Parameter aus Rust und vermittelt typkonvertiert an die C++-Objektmethoden.Adapter (static): Statische Laufzeitkomponente der C++-Brücke, zuständig für generische Callback-Bindungen, C++-Lambdas und Lebensdauer-Management von Kontextdaten über Sprachgrenzen hinweg.Proxy (gen): Standardmäßiger AUTOSAR-Adaptive C++-Service-Proxy (ara::com), der die Serialisierung (z. B. SOME/IP, IPC) und die Interaktion mit dem Kommunikations-Daemon/Netzwerk vornimmt.
3. Dynamisches Verhalten & Sequenzablauf
Phase 1: Initiierung des Methodenaufrufs (Synchroner Forward-Pfad über FFI)
- Methodenaufruf:
AppinitiiertCalibrate(...)am generierten Rust-Proxy (gen). - Channel-Setup:
Proxy (gen)delegiert anara crate::call_method, woraufhinara crateeinen internen Einweg-/Oneshot-Channel zur Ergebnisübertragung erzeugt (Create channel) und eineclosurezurückliefert. - FFI-Übergang:
Proxy (gen)ruft über C-ABI synchronCalibrateam C++-Adapter (gen)auf. - Adapter-Kaskade:
Adapter (gen)konsultiertAdapter (static)::ProxyCallMethod, erhält einelambda-Definition und ruft die C++-MethodeCalibrateam C++-Proxy (gen)auf. - Netzwerkübertragung & Future: C++-
Proxy (gen)versendet den Aufruf (Send call to network) und gibt synchron einara::core::Futurean denAdapter (gen)zurück. - Callback-Registrierung:
Adapter (gen)bindet viaregister .then() callbackdie Continuation an das C++-Future. Der synchrone Aufruf kehrt über die FFI-Grenze nach Rust zurück.
Phase 2: Asynchrones Suspendieren in Rust
- Channel-Await:
Proxy (gen)initiiertawait channelauf dem erzeugten Kanal derara crate. - App-Suspendierung: Der Kontrollfluss kehrt via
await call_methodzurAppzurück;Appsignalisiertawait Calibratean denExecutor. - Task-Switch: Der Rust-
Executorsuspendiert die Calling-Task (Switch to other tasks) und gibt den Thread für andere Arbeitslasten frei.
Phase 3: Asynchrone Antwort, Cross-Domain-Callback & Waker-Signalisierung
- Antwortempfang: C++-
Proxy (gen)empfängt die Antwort (Result from network) und triggert den registrierten.then() callback. - Cross-Language Notification:
Adapter (static)ruft über einen C-ABI-Funktionszeigermethod_callbackin der Rust-ara crateauf. - Waker-Aktivierung:
ara cratetransferiert die Payload (Send result to channel) und triggertchannel wakeam Rust-Executor. - Task-Reaktivierung: Der
Executorführt einAsync resumederApp-Task aus. - Ergebnisübernahme:
AppfragtProxy (gen)ab, dieser ruftReceive resultauf derara crateab, und das deserialisierteResultwird typsicher an dieAppübergeben.
4. Normative Relevanz & Entwickler-Hinweise
- Zero-Blocking FFI-Anforderung: Der FFI-Wechsel von Rust nach C++ (
Proxy (gen)→Adapter (gen)) ist strikt nicht-blockierend. C++-Treiber bzw. der C++-ara::com-Proxy dürfen innerhalb des Aufrufs niemals blockierend synchron auf Netzwerkantworten warten, sondern müssen unverzüglich einara::core::Futureretournieren. - Lebensdauer- & Speichersicherheit: Das Mapping zwischen Rust-Future/Channel und C++-Lambda erfordert stabile Speicherreferenzen. Der Rückkanal (
method_callback) muss zwingend Context-Handles (z. B. rohe Pointer auf Waker/State oder Token) verwalten, die gegen Use-after-free bei Task-Abbrüchen/Timeouts abgesichert sind. - Threading-Modell: Der C++-
.then()-Callback feuert üblicherweise im Kontext des IPC-/Network-Worker-Threads. Der Aufruf vonchannel wakeüberschreitet daher Thread-Grenzen und muss thread-sicher (Send + Sync) implementiert sein, ohne den C++-Thread mit Rust-Task-Arbeit zu blockieren. - Fehlerbehandlung: Kommunikations- und Applikationsfehler (
ara::core::ErrorCode) müssen auf Ebene der generierten Adapter verlustfrei in Rust-Idiome (Result<T, ara::core::Error>) transformiert werden.