AUTOSAR_AP_EXP_ARARustApplications
FIG-3642f6df4531357a
566 × 280 px
3 Release(s)
Figure 6.11: Fast method invocation
SHA-256 Inhalts-Fingerabdruck:
3642f6df4531357a43380073c29452d9324e2fa3b27a064d51db43ea2bedf802
✦
KI-generierte Bildanalyse & technische Beschreibung
Modell: gemini-3.8-flash (via agy) · Rezept figure-description@2 · erstellt am 2026-10-07
1. Diagrammtyp & Architektur-Kontext
- Klassifikation: UML-Sequenzdiagramm mit sprachdomänenübergreifender Interaktion (Rust vs. C++ über FFI/ABI-Grenzen).
- Technischer Zweck: Spezifikation des optimierten synchronen Schnelldurchlaufs (Fast Path / Immediate Completion) für Methodenaufrufe eines AUTOSAR Adaptive Service Providers (Skeleton), der in Rust implementiert ist, aber an die bestehende C++-Middleware-Architektur (
ara::com) angebunden wird. - Funktionale Einordnung: Liefert die Rust-Applikationslogik bei der ersten Auswertung unmittelbar ein fertiges Ergebnis (
Poll::Ready), wird der asynchrone Rust-Task-Executor umgangen. Der Aufruf wird vollständig im Thread-Kontext des aufrufenden C++-Worker-Threads abgearbeitet, wodurch Task-Scheduling-Overheads und Kontextwechsel entfallen.
2. Komponenten, Entitäten & Schnittstellen
C++-Domäne
Skeleton (gen): Generiertes C++-Skeleton (ara::com::internal::skeleton), das eingehende Anfragen aus der Middleware (z. B. SOME/IP, Inter-Process Communication / IPC) empfängt.Adapter (gen): Schnittstellenspezifisch generierter C++-Adapter; fungiert als Sprachbrücke (C-ABI /extern "C"). Verwaltet dasara::core::Promise-Objekt und liefert das zugehörigeara::core::Futurezurück.Adapter (static): Statische C++-Brückenkomponente für plattformweite Typkonvertierungen und Hilfsfunktionen (im Fast Path nicht aktiv eingebunden).
Rust-Domäne
Skeleton (gen): Generierte Rust-Struktur (aus dem AUTOSAR-Servicemodell), die Methoden über ein asynchrones Trait bereitstellt (async fnbzw. Rückgabetypimpl Future).ara crate: Laufzeit-Support-Crate für Adaptive AUTOSAR in Rust; stellt Abstraktionen für Polling, Waker-Registrierung und FFI-Übergänge bereit.App: Anwendungslogik des Entwicklers, die das generierte Skeleton-Trait implementiert.Executor: Asynchroner Rust-Task-Executor (z. B. Thread-Pool/Reactor); bleibt im Fast Path vollständig unbeteiligt (idle), da keinPoll::Pendingauftritt.
3. Dynamisches Verhalten & Sequenzablauf
Service Request: Das C++-Skeleton (gen)empfängt einen Remote-/IPC-Methodenaufruf.Method invocation: C++-Skeleton (gen)ruft den generiertenAdapter (gen)auf.Create promise:Adapter (gen)instanziiert einara::core::Promise<T>.Implementation call: Synchroner FFI-Aufruf über die Sprachgrenze an das generierte Rust-Skeleton (gen).Async trait call: Rust-Skeleton (gen)ruft die Methodenimplementierung inAppauf und erhält dasFuture-Objekt.callback_poll: Rust-Skeleton (gen)initiiert über dasara cratedas synchrone Polling des Futures.poll:ara crateführtFuture::poll(cx)direkt aufAppaus.Ready(result): DieAppliefert sofortPoll::Ready(result)zurück (kein I/O-Warten, keine Suspension).Set promise:ara cratesetzt den Rückgabewert unmittelbar im C++-Promisevia FFI (promise.set_value(...)).- Rückkehr &
return future: Der Aufruf kehrt über das Rust-Skeleton (gen)zum C++-Adapter (gen)zurück. Dieser liefert das bereits erfüllteara::core::Futurean das C++-Skeleton (gen)aus, welches die Antwort serialisieren und versenden kann.
4. Normative Relevanz & Entwickler-Hinweise
- Latenz- und Allokationsoptimierung: Für Berechnungen, Cache-Hits oder rein synchrone Zustandsabfragen verhindert dieser Pfad dynamische Heap-Allokationen für Waker/Task-Deskriptoren und spart Thread-Wechsel zwischen C++-Event-Loop und Rust-Executor.
- Thread-Affinität & Blockierverbot: Der Rust-Code in
Appläuft im Ausführungskontext des C++-Worker-Threads. Entwickler dürfen innerhalb synchron evaluierender Methoden keine blockierenden Systemaufrufe, OS-Locks oder langlebigen Operationen ausführen, da dies den Middleware-Worker blockiert. - Async-Trait-Design: Entwickler sollten keinen unnötigen
yield- oderawait-Schritt einbauen, wenn ein Ergebnis sofort berechenbar ist, um die Aktivierung des teureren Pfads über denExecutor(Slow Path mitPoll::Pendingund Waker-Benachrichtigung) zu vermeiden. - Speichersicherheit an der FFI-Grenze: Die Lebensdauer des C++-Promise muss über die synchrone FFI-Grenze hinweg garantiert valide bleiben; Parameterübergaben erfolgen nach C-ABI-Layouts ohne implizite Rust-Besitzübertragung an den Executor.