Proxy MCAL: Universelle Abstraktionsschicht für Mikrocontroller
Proxy MCAL löst das Problem, die Anwendung an die HAL eines bestimmten Herstellers zu binden. Beim Migrieren der Firmware zu einem neuen Mikrocontroller erfordert die Standard-HAL eine vollständige Neuschreibung der Treiber für GPIO, SPI, UART und andere Peripheriegeräte. Proxy MCAL stellt eine einzige API bereit, die durch Bindungsfunktionen für jede MCU-Familie implementiert wird. Dadurch bleibt die Portabilität des Codes erhalten, ohne die Anwendungslogik umzuschreiben.
Entwickler stehen vor Migrationen aufgrund von Chip-Alterung, Lieferengpässen, Sanktionen oder neuen Anforderungen wie Bluetooth 5.3. Proxy MCAL gewährleistet Modularität konform mit ISO-26262: abstrakte Architektur, Konfigurierbarkeit, Testbarkeit.
Anforderungen an Proxy MCAL
Proxy MCAL muss strenge Kriterien für Middle-/Senior-Entwickler erfüllen:
- Vollständigkeit: Getter/Setter für alle Peripheriegeräte (CLOCK, GPIO, I2C, SPI, UART, ADC, DMA). Unbenutzte Funktionen sind weak, sodass der Linker sie verwirft.
- Akzeptanz: gemeinsame API, die im Team abgestimmt ist.
- Einfachheit: 45–55 Zeilen Prototypen, intuitive Schnittstelle, Dokumentation über grep in den Modultests.
- Skalierbarkeit: mehrere Instanzen von Komponenten.
- Vielseitigkeit: Unterstützung für ASIC-Treiber, Protokolle, RTOS.
- Portabilität: Kompilierbar auf dem PC mit leeren weak Stubs.
- CLI-Zugriff: Funktionsüberprüfung über UART zur Laufzeit.
- Testbarkeit: Modultests als Dokumentation.
- Konfigurierbarkeit: separate Konfigs als Arrays von Strukturen.
Beispiele für Bindungsfunktionen
Einheitliche API gpio_logic_level_set(Pad_t pad, GpioLogicLevel_t logic_level) unterschiedlich implementiert:
Für STM32:
bool gpio_logic_level_set(Pad_t pad, GpioLogicLevel_t logic_level) {
HAL_GPIO_WritePin(Port2PortPtr(pad.port), 1 << pad.pin, (GPIO_PinState)logic_level);
return true;
}
Für NRF5340:
bool gpio_logic_level_set(Pad_t Pad, GpioLogicLevel_t logic_level) {
bool res = false;
res = gpio_is_valid_pad(Pad);
if(res) {
nrf_gpio_pin_write((uint32_t)Pad.byte, (uint32_t)logic_level);
}
return res;
}
Für Artery AT32 (ISR-sicher):
bool gpio_logic_level_set(Pad_t Pad, GpioLogicLevel_t logic_level) {
Pad_t pad = {0};
(void)pad;
pad.byte = pad_num;
gpio_type* GPIOx = Port2PortPtr(Pad.port);
if(GPIOx) {
switch((uint8_t)logic_level) {
case GPIO_LVL_HI: {
GPIOx->scr = 1 << Pad.pin;
} break;
case GPIO_LVL_LOW: {
GPIOx->clr = 1 << Pad.pin;
} break;
}
}
return true;
}
Prototypen sind festgelegt, Rümpfe an Hersteller-HAL oder Register angepasst.
Vorteile der Implementierung
- Portabilität: Proxy-MCAL-Anwendung kompiliert für jeden MCU über Bindings.
- Tests: einheitliche Modultests verifizieren jede HAL.
- CLI-Schnittstelle: zentralisierte Peripherieverwaltung.
- ASIC-Treiber: universell für SPI/I2C-Geräte auf allen Plattformen.
Nachteile und Abhilfen
Overhead – 10–20 Takte pro Aufruf. Lösung: Inline-Funktionen. Risiko von Spaghetti-Code minimiert durch API-Einfachheit und lockeres Coupling.
Wichtige Punkte
- Proxy MCAL trennt die Anwendung von der Hersteller-HAL und vereinfacht die Migration zu neuen MCUs.
- Einheitliche API mit Bindings gewährleistet Vollständigkeit und Portabilität.
- Konform mit ISO-26262: Modularität, Testbarkeit, Konfigurierbarkeit.
- Unterstützt CLI und Modultests für Laufzeitverifikation.
- Skaliert auf 16+ MCU-Familien ohne Neuschreibung der Anwendung.
— Editorial Team
Noch keine Kommentare.