Zpět na domů

Proxy MCAL pro MCU: přenositelnost kódu

Proxy MCAL poskytuje jednotné API pro periferie mikrokontrolérů, realizované prostřednictvím binding k vendor HAL. Zajistí přenositelnost firmware při změně MCU. Příklady pro STM32, NRF, AT32 se zaměřením na úplnost a testovatelnost.

Proxy MCAL: migrujte firmware bez přepsání
Advertisement 728x90

Proxy MCAL: univerzální vrstva abstrakce pro mikrokontroléry

Proxy MCAL řeší problém vázanosti aplikace na konkrétní HAL dodavatele. Při migraci firmware na nový mikrokontrolér standardní HAL vyžaduje úplné přepsání ovladačů GPIO, SPI, UART a dalších periferií. Proxy MCAL poskytuje jednotný API, implementovaný prostřednictvím bindingových funkcí pro každou rodinu MCU. To zachovává přenositelnost kódu bez přepisování logiky aplikace.

Vývojáři se setkávají s migrací kvůli zastaralosti čipů, nedostatku dodávek, sankcím nebo novým požadavkům jako Bluetooth 5.3. Proxy MCAL zajišťuje modularitu odpovídající ISO-26262: abstraktní architektura, konfigurovatelnost, testovatelnost.

Požadavky na Proxy MCAL

Proxy MCAL musí splňovat přísná kritéria pro middle/senior vývojáře:

Google AdInline article slot
  • Kompletnost: getter/setter pro všechny periferie (CLOCK, GPIO, I2C, SPI, UART, ADC, DMA). Nepoužívané funkce jsou weak, linker je zahodí.
  • Přijetí: společný API, dohodnutý v týmu.
  • Jednoduchost: 45–55 řádků prototypů, intuitivní rozhraní, dokumentace přes grep modulárních testů.
  • Škálovatelnost: více instancí komponent.
  • Univerzálnost: podpora ovladačů ASIC, protokolů, RTOS.
  • Přenositelnost: sestavení na PC s prázdnými weak stubami.
  • CLI přístup: ověření funkcí přes UART za běhu.
  • Testovatelnost: modulární testy jako dokumentace.
  • Konfigurovatelnost: samostatné konfigurace jako pole struktur.

Příklady bindingových funkcí

Jediný API gpio_logic_level_set(Pad_t pad, GpioLogicLevel_t logic_level) se realizuje různě:

Pro 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;
}

Pro NRF5340:

Google AdInline article slot
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;
}

Pro Artery AT32 (ISR-safe):

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;
}

Prototypy jsou fixní, těla jsou přizpůsobená vendor HAL nebo registrům.

Výhody zavádění

  • Přenositelnost: aplikace na Proxy MCAL se kompiluje pro jakýkoli MCU přes binding.
  • Testování: jednotné modulární testy ověřují jakýkoli HAL.
  • CLI rozhraní: centralizované ovládání periferií.
  • Ovladače ASIC: univerzální pro SPI/I2C zařízení na všech platformách.

Nevýhody a mitigace

Overhead — 10–20 taktů na volání. Řešení: inline funkce. Riziko „spaghetti kódu“ se minimalizuje jednoduchostí API a slabou vazbou.

Google AdInline article slot

Co je důležité

  • Proxy MCAL odděluje aplikaci od vendor HAL, čímž usnadňuje migraci na nové MCU.
  • Jednotný API s bindingem zajišťuje kompletnost a přenositelnost.
  • Odpovídá ISO-26262: modularita, testovatelnost, konfigurovatelnost.
  • Podporuje CLI a modulární testy pro ověření za běhu.
  • Škáluje na 16+ rodin MCU bez přepsání aplikace.

— Editorial Team

Advertisement 728x90

Číst dál