00 AUTOSAR Adaptive nedir — Classic vs Adaptive
AUTOSAR Adaptive Platform, 2017 yılında AUTOSAR konsorsiyumu tarafından yayımlanan ve yüksek hesap gücü gerektiren araç ECU'ları için tasarlanmış yazılım platformu standardıdır.
Classic AUTOSAR'ın Sınırları
AUTOSAR Classic (CP), 2003'te tanımlanmıştır. Deterministik, güvenlik-kritik sistemler için tasarlanmıştır — motor kontrol, fren sistemi, airbag. Ancak şu sınırları vardır:
- Statik yazılım konfigürasyonu: derleme zamanında her şey sabitlenir
- OSEK/AUTOSAR OS: gerçek zamanlı, ancak POSIX-uyumlu değil
- Dynamic deployment yok: yeni servis veya uygulama çalışma sırasında yüklenemez
- Modern ağ yönetimi (IP, OTA) desteklenmez
Adaptive Platform'un Farkları
Kullanım Senaryoları
┌──────────────────────────────────────────────────────────────┐
│ AUTOSAR Adaptive Kullanım Alanları │
├──────────────────────────────────────────────────────────────┤
│ ADAS / Otonom Sürüş │ Sensor fusion, path planning │
│ Telematik / OTA │ OTA update manager, cloud connect │
│ V2X Communication │ ETSI ITS stack, C-V2X │
│ HMI / İnfotainment │ Android Automotive entegrasyonu │
│ Domain Controller │ Zone/domain mimari merkez ECU │
└──────────────────────────────────────────────────────────────┘
Adaptive Platform, Classic AUTOSAR'ı değiştirmiyor. Motor kontrol, ABS, airbag gibi hard real-time ve safety-critical uygulamalar Classic AUTOSAR'da kalmaya devam eder. Modern araçlarda her iki platform birlikte kullanılır.
01 Platform mimarisi — Functional Cluster'lar
AUTOSAR Adaptive Platform, Functional Cluster (FC) adı verilen servis kümelerinden oluşur. Her FC belirli bir platform hizmetini standartlaştırır.
┌──────────────────────────────────────────────────────────────┐
│ Adaptive Application Katmanı │
│ AppA AppB AppC │
├──────────────────────────────────────────────────────────────┤
│ ara:: API Katmanı │
├─────────┬────────┬────────┬────────┬───────────┬───────────┤
│ara::com │ara::exec│ara::diag│ara::log│ara::crypto│ara::per │
│ Comm. │ Exec. │ Diag. │Logging │ Crypto │ Persist. │
├─────────┴────────┴────────┴────────┴───────────┴───────────┤
│ Adaptive Platform Foundation │
│ POSIX OS · OS Interface · Runtime │
├──────────────────────────────────────────────────────────────┤
│ Hardware (ECU / SoC / MPU) │
└──────────────────────────────────────────────────────────────┘
Temel Functional Cluster'lar
Machine ve Application Manifest
AUTOSAR Adaptive'de her şey ARXML manifests ile tanımlanır:
- Machine Manifest: ECU donanım konfigürasyonu, OS parametreleri, network interface'leri
- Application Manifest: Adaptive Application'ın gerektirdiği servisler, process konfigürasyonu, resource talepleri
- Service Instance Manifest: SOME/IP binding, port numaraları, timing parametreleri
02 ara::com API — proxy/skeleton pattern
ara::com, service-oriented communication için proxy/skeleton design pattern kullanır. Skeleton servisi sunar (sunucu tarafı), Proxy servisi tüketir (istemci tarafı).
Kavramsal Model
┌─────────────────────────────────────────────────────────────┐
│ ara::com Haberleşme Modeli │
├──────────────────┬──────────────────────────────────────────┤
│ Provider (ECU A)│ Consumer (ECU B) │
│ │ │
│ TemperatureSvc │ TemperatureProxy │
│ Skeleton │ │
│ ┌────────────┐ │ ┌────────────────────────────────────┐ │
│ │ offerService│ │ │ FindService() │ │
│ │ events │ │ │ GetTemperature() → Future │ │
│ │ methods │ │ │ TemperatureChanged.Subscribe() │ │
│ │ fields │ │ └────────────────────────────────────┘ │
│ └────────────┘ │ │
└──────────────────┴──────────────────────────────────────────┘
SOME/IP Transport
Skeleton API (Sunucu Tarafı)
// ARXML'den araçlarla otomatik oluşturulan Skeleton sınıfı
#include "ara/temperature/temperature_skeleton.h"
#include "ara/exec/execution_client.h"
using namespace ara::temperature;
class TemperatureServiceImpl : public skeleton::TemperatureServiceSkeleton {
public:
TemperatureServiceImpl(ara::com::InstanceIdentifier id)
: TemperatureServiceSkeleton(id) {}
// Method implementasyonu (blocking Future döner)
ara::core::Future<GetTemperatureOutput> GetTemperature() override {
ara::core::Promise<GetTemperatureOutput> promise;
GetTemperatureOutput output;
output.temperature = read_sensor(); // hw okuma
output.unit = TemperatureUnit::Celsius;
promise.set_value(output);
return promise.get_future();
}
};
int main() {
ara::exec::ExecutionClient exec_client;
exec_client.ReportExecutionState(
ara::exec::ExecutionState::kRunning);
// Instance ID manifest'ten gelir
ara::com::InstanceIdentifier id("1");
TemperatureServiceImpl svc(id);
svc.OfferService();
// Event periyodik gönder
while (true) {
TemperatureChanged::SampleType event_data;
event_data.value = read_sensor();
svc.TemperatureChanged.Send(event_data);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
Proxy API (İstemci Tarafı)
#include "ara/temperature/temperature_proxy.h"
using namespace ara::temperature::proxy;
int main() {
// Servis bul — async, handle vector döner
auto handles = TemperatureServiceProxy::FindService(
ara::com::InstanceIdentifier::Any);
if (handles.empty()) {
std::cerr << "Servis bulunamadı\n";
return 1;
}
// İlk bulunan instance ile proxy oluştur
TemperatureServiceProxy proxy(handles[0]);
// Event'e abone ol
proxy.TemperatureChanged.Subscribe(
ara::com::EventCacheUpdatePolicy::kLastN, 10);
proxy.TemperatureChanged.SetReceiveHandler([&]() {
proxy.TemperatureChanged.GetNewSamples(
[](ara::com::SamplePtr<TemperatureChanged::SampleType> sample) {
std::cout << "Event: " << sample->value << " °C\n";
});
});
// Method çağır (async Future)
auto future = proxy.GetTemperature();
auto result = future.get(); // blocking wait
std::cout << "Sıcaklık: " << result.temperature << " °C\n";
// Event subscription sonlandır
proxy.TemperatureChanged.Unsubscribe();
return 0;
}
FindService ve availability callback
// Servis geldiğinde / gittiğinde bildirim al
TemperatureServiceProxy::StartFindService(
[](ara::com::ServiceHandleContainer<TemperatureServiceProxy::HandleType> handles,
ara::com::FindServiceHandle fsh) {
if (!handles.empty()) {
std::cout << "Servis aktif\n";
// proxy oluştur ve kullan
} else {
std::cout << "Servis kayboldu\n";
}
},
ara::com::InstanceIdentifier("1"));
03 Servis manifest — ARXML
AUTOSAR Adaptive'deki her servis, ARXML (AUTOSAR XML) formatında tanımlanır. Bu tanım, otomatik kod üretimi (proxy/skeleton) ve SOME/IP binding konfigürasyonu için kullanılır.
ServiceInterface Tanımı
<SERVICE-INTERFACE>
<SHORT-NAME>TemperatureService</SHORT-NAME>
<NAMESPACE-BLOBS>
<NAMESPACE-BLOB>
<SHORT-NAME>ara</SHORT-NAME>
<SHORT-NAME>temperature</SHORT-NAME>
</NAMESPACE-BLOB>
</NAMESPACE-BLOBS>
<!-- Method tanımı -->
<METHODS>
<CLIENT-SERVER-OPERATION>
<SHORT-NAME>GetTemperature</SHORT-NAME>
<ARGUMENTS></ARGUMENTS> <!-- input yok -->
<POSSIBLE-ERROR-REFS></POSSIBLE-ERROR-REFS>
</CLIENT-SERVER-OPERATION>
</METHODS>
<!-- Event tanımı -->
<EVENTS>
<VARIABLE-DATA-PROTOTYPE>
<SHORT-NAME>TemperatureChanged</SHORT-NAME>
<TYPE-TREF DEST="IMPLEMENTATION-DATA-TYPE">
/AUTOSAR/Platform/ImplementationDataTypes/float32
</TYPE-TREF>
</VARIABLE-DATA-PROTOTYPE>
</EVENTS>
<!-- Field tanımı -->
<FIELDS>
<FIELD>
<SHORT-NAME>CurrentTemperature</SHORT-NAME>
<HAS-GETTER>true</HAS-GETTER>
<HAS-SETTER>false</HAS-SETTER>
<HAS-NOTIFIER>true</HAS-NOTIFIER>
</FIELD>
</FIELDS>
</SERVICE-INTERFACE>
Network Binding (SOME/IP)
<SOMEIP-SERVICE-INTERFACE-DEPLOYMENT>
<SHORT-NAME>TemperatureService_SOMEIP</SHORT-NAME>
<SERVICE-INTERFACE-REF>/Services/TemperatureService</SERVICE-INTERFACE-REF>
<SERVICE-ID>0x1234</SERVICE-ID>
<METHOD-DEPLOYMENTS>
<SOMEIP-METHOD-DEPLOYMENT>
<SHORT-NAME>GetTemperature_Deploy</SHORT-NAME>
<METHOD-REF>/Services/TemperatureService/GetTemperature</METHOD-REF>
<METHOD-ID>0x0001</METHOD-ID>
</SOMEIP-METHOD-DEPLOYMENT>
</METHOD-DEPLOYMENTS>
<EVENT-DEPLOYMENTS>
<SOMEIP-EVENT-DEPLOYMENT>
<SHORT-NAME>TemperatureChanged_Deploy</SHORT-NAME>
<EVENT-REF>/Services/TemperatureService/TemperatureChanged</EVENT-REF>
<EVENT-ID>0x8001</EVENT-ID>
<TRANSPORT-PROTOCOL>UDP</TRANSPORT-PROTOCOL>
</SOMEIP-EVENT-DEPLOYMENT>
</EVENT-DEPLOYMENTS>
</SOMEIP-SERVICE-INTERFACE-DEPLOYMENT>
ARXML tanımlarından proxy/skeleton C++ sınıfları otomatik üretilir. Araçlar: arxml-generator (açık kaynak), AUTOSAR Builder (Elektrobit), SystemDesk (dSPACE), DaVinci Developer (Vector). OpenAA'da basit bir generator bulunur.
04 Execution Management — ara::exec
ara::exec, Adaptive Application'ların yaşam döngüsünü yönetir. Uygulama başlatılır, çalışır ve durdurulur; her geçiş Execution Management'a raporlanır.
Uygulama Durum Makinesi
┌──────────────────────────────────┐
│ Execution Management (EM) │
│ (Platform servisi) │
└──────────────────────────────────┘
│ spawn process
▼
┌──────────┐ kRunning ┌──────────────┐ kShuttingDown ┌─────────┐
│ Initializing│ ──────► │ Running │ ──────────────► │Terminated│
└──────────┘ └──────────────┘ └─────────┘
│ kSuspend / kResume
▼
┌──────────┐
│ Suspended │
└──────────┘
ExecutionClient Kullanımı
#include "ara/exec/execution_client.h"
#include <csignal>
static volatile std::atomic<bool> running{true};
void signal_handler(int sig) {
running = false;
}
int main() {
std::signal(SIGTERM, signal_handler);
// Execution Management'e durum bildir
ara::exec::ExecutionClient exec_client;
// Başlatma tamamlandı, çalışmaya hazır
auto result = exec_client.ReportExecutionState(
ara::exec::ExecutionState::kRunning);
if (result.HasValue()) {
// uygulama ana döngüsü
while (running) {
do_work();
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
} else {
// EM izin vermedi — graceful exit
return 1;
}
// Shutdown başlatıldı — temizle ve çık
cleanup();
return 0;
// Process'in kendiliğinden sonlanması kShuttingDown anlamına gelir
}
Application Manifest (kısmi)
<ADAPTIVE-APPLICATION-SW-COMPONENT-TYPE>
<SHORT-NAME>TemperatureSensorApp</SHORT-NAME>
<PROCESS>
<SHORT-NAME>TemperatureProcess</SHORT-NAME>
<EXECUTABLE-REF>/executables/temp_sensor</EXECUTABLE-REF>
<STARTUP-CONFIGS>
<STARTUP-CONFIG>
<ARGUMENTS>--config=/etc/temp_sensor.json</ARGUMENTS>
<ENVIRONMENT-VARIABLES>
<ENVIRONMENT-VARIABLE>
<KEY>VSOMEIP_CONFIGURATION</KEY>
<VALUE>/etc/vsomeip/temp.json</VALUE>
</ENVIRONMENT-VARIABLE>
</ENVIRONMENT-VARIABLES>
</STARTUP-CONFIG>
</STARTUP-CONFIGS>
</PROCESS>
</ADAPTIVE-APPLICATION-SW-COMPONENT-TYPE>
05 Açık kaynak araçlar
AUTOSAR Adaptive gerçek araç projelerinde ticari araçlarla uygulanır, ancak öğrenme ve prototipler için çeşitli açık kaynak araçlar mevcuttur.
OpenAA (Open Adaptive AUTOSAR)
OpenAA, AUTOSAR Adaptive Platform'un açık kaynak referans implementasyonudur. Eclipse Foundation bünyesinde geliştirilmektedir.
git clone https://github.com/eclipse-openadaptive/openadaptive.git
cd openadaptive
# Docker ile hızlı başlangıç
docker build -t openaa .
docker run -it openaa bash
# Örnek uygulamayı çalıştır
./examples/hello_adaptive/run.sh
eCAL (enhanced Communication Abstraction Layer)
eCAL, Continental AG tarafından geliştirilen açık kaynak middleware'dir. ara::com benzeri API, SOME/IP ve shared memory transport destekler.
# Ubuntu/Debian
sudo add-apt-repository ppa:ecal/ecal-latest
sudo apt-get update
sudo apt-get install ecal
# Python bağlantısı
pip install ecal5
import ecal.core.core as ecal_core
from ecal.core.publisher import StringPublisher
import time, json
ecal_core.initialize([], "temperature_sensor")
pub = StringPublisher("temperature/engine")
while ecal_core.ok():
data = json.dumps({"temperature": 85.5, "unit": "Celsius"})
pub.send(data)
time.sleep(0.1)
ecal_core.finalize()
Diğer Açık Kaynak Araçlar
06 Geliştirme ortamı kurulumu
Ubuntu 22.04 üzerinde minimal bir AUTOSAR Adaptive geliştirme ortamı kur: CMake, C++17, vsomeip ve örnek uygulama.
Bağımlılıklar
# Temel build araçları
sudo apt-get install -y \
build-essential cmake ninja-build \
libboost-all-dev libssl-dev \
git python3 python3-pip
# C++17 derleyicisi (GCC 11+)
g++ --version # >= 11 olmalı
# vsomeip (SOME/IP binding için)
git clone https://github.com/COVESA/vsomeip.git
cd vsomeip && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc) && sudo make install
# DLT daemon (ara::log için)
sudo apt-get install -y dlt-daemon dlt-tools
CMakeLists.txt yapısı
cmake_minimum_required(VERSION 3.16)
project(adaptive_app CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Bağımlılıklar
find_package(Boost REQUIRED COMPONENTS system thread log)
find_package(vsomeip3 REQUIRED)
# Uygulama
add_executable(temperature_server
src/temperature_server.cpp
src/temperature_skeleton.cpp)
target_include_directories(temperature_server PRIVATE
${CMAKE_SOURCE_DIR}/include
${vsomeip3_INCLUDE_DIRS})
target_link_libraries(temperature_server
vsomeip3
Boost::system Boost::thread Boost::log
pthread)
Adaptive Daemon kavramı
Gerçek bir AUTOSAR Adaptive sistemde şu servisler arka planda çalışır:
# vsomeip routing manager (ara::com altyapısı)
VSOMEIP_CONFIGURATION=/etc/vsomeip/routing.json \
vsomeipd &
# DLT daemon (ara::log altyapısı)
dlt-daemon -c /etc/dlt.conf &
# Execution Manager (simüle edilmiş — gerçekte platform sağlar)
# Adaptive Application'ları systemd veya EM başlatır
systemctl start adaptive-execution-manager
# Uygulama başlat
VSOMEIP_CONFIGURATION=/etc/vsomeip/temp.json \
./temperature_server &
# Log izle
dlt-receive -a localhost
07 Fonksiyonel güvenlik — ISO 26262
AUTOSAR Adaptive, ISO 26262 Fonksiyonel Güvenlik standardıyla uyumlu şekilde tasarlanmıştır. ASIL (Automotive Safety Integrity Level) ayrıştırma, mixed-criticality ve FuSa mimari.
ISO 26262 + AUTOSAR Adaptive
Mixed-Criticality Mimari
┌────────────────────────────────────────────────────────────┐
│ Adaptive ECU (SoC) │
├─────────────────────┬──────────────────────────────────────┤
│ ASIL-D Partition │ QM / ASIL-A Partition │
│ ──────────────── │ ───────────────────── │
│ EM (Execution Mgr) │ Navigation App │
│ ara::com core │ Telematik App │
│ Safety Monitor │ OTA Manager │
│ │ │
│ Hypervisor / POSIX Process Isolation │
└─────────────────────┴──────────────────────────────────────┘
SafetyArchitect Araçları
Gerçek araç ürününde ISO 26262 sertifikasyonu, bağımsız güvenlik değerlendirme kuruluşu (TÜV, Bureau Veritas vb.) onayını gerektirir. AUTOSAR Adaptive'i kullanan OEM/Tier1, her bileşen için güvenlik kanıtını (Safety Case) dokümante etmelidir.
08 Pratik: SOME/IP event haberleşmesi
İki Adaptive Application arasında SOME/IP üzerinden event haberleşmesi kur: basit bir sensör uygulaması, dashboard uygulamasına periyodik veri gönderir.
Senaryo
┌────────────────────┐ SOME/IP Event (0x8001) ┌─────────────────┐
│ SpeedSensor App │ ─────────────────────────► │ Dashboard App │
│ (Skeleton) │ ara::com / vsomeip │ (Proxy) │
│ Service: 0x5100 │ │ │
│ Instance: 0x0001 │ │ │
└────────────────────┘ └─────────────────┘
Proje yapısı
speed_demo/
├── CMakeLists.txt
├── include/
│ ├── speed_service_skeleton.h # ARXML'den üretilmiş
│ └── speed_service_proxy.h # ARXML'den üretilmiş
├── src/
│ ├── speed_sensor_server.cpp # Sensör (Skeleton)
│ └── dashboard_client.cpp # Dashboard (Proxy)
└── config/
├── sensor-vsomeip.json # vsomeip konfigürasyonu
└── dashboard-vsomeip.json
Sensör uygulaması (kısaltılmış)
#include "speed_service_skeleton.h"
#include <vsomeip/vsomeip.hpp>
static const vsomeip::service_t SVC = 0x5100;
static const vsomeip::instance_t INST = 0x0001;
static const vsomeip::event_t EVT = 0x8001;
static const vsomeip::eventgroup_t EG = 0x0001;
int main() {
auto app = vsomeip::runtime::get()->create_application("SpeedSensor");
app->init();
std::set<vsomeip::eventgroup_t> groups = { EG };
app->offer_event(SVC, INST, EVT, groups,
vsomeip::event_type_e::ET_FIELD);
app->offer_service(SVC, INST);
float speed = 0.0f;
std::thread sensor_thread([&]() {
while (true) {
speed = simulate_speed_sensor();
auto pl = vsomeip::runtime::get()->create_payload();
std::vector<uint8_t> data(sizeof(float));
std::memcpy(data.data(), &speed, sizeof(float));
pl->set_data(data);
app->notify(SVC, INST, EVT, pl);
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
});
app->start();
sensor_thread.join();
}
Manifest yazma ve çalıştırma
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j4
# Terminal 1 — Sensör başlat
VSOMEIP_CONFIGURATION=../config/sensor-vsomeip.json \
./speed_sensor_server
# Terminal 2 — Dashboard başlat
VSOMEIP_CONFIGURATION=../config/dashboard-vsomeip.json \
./dashboard_client
# Beklenen dashboard çıktısı:
# [ara::com] SpeedService bulundu: 0x5100/0x0001
# Hız: 0.0 km/h
# Hız: 12.5 km/h
# Hız: 25.0 km/h
# ...
Bu örneği genişletmek için: SOME/IP-SD konfigürasyonunu özelleştir (bkz. SOME/IP rehberi), UDS tanılama servisi ekle (bkz. UDS rehberi), VSS sinyal ağacına bağla (bkz. VSS rehberi).