返回首页

Proxy MCAL 用于 MCU:代码可移植性

Proxy MCAL 为微控制器外设提供统一的 API,通过绑定到供应商 HAL 来实现。确保更换 MCU 时固件可移植性。STM32、NRF、AT32 示例,重点关注完整性和可测试性。

Proxy MCAL:无需重写即可迁移固件
Advertisement 728x90

Proxy MCAL:微控制器的通用抽象层

Proxy MCAL 解决了将应用程序绑定到特定厂商 HAL 的问题。在将固件迁移到新微控制器时,标准 HAL 需要完全重写 GPIO、SPI、UART 和其他外设驱动程序。Proxy MCAL 为每个 MCU 系列提供单一 API,通过绑定函数实现,从而在不重写应用逻辑的情况下保持代码的可移植性。

开发者常常因芯片停产、供应链短缺、制裁或新需求(如 Bluetooth 5.3)而面临迁移。Proxy MCAL 确保符合 ISO-26262 的模块化设计:抽象架构、可配置性和可测试性。

Proxy MCAL 的要求

Proxy MCAL 必须满足中高级开发者的严格标准:

Google AdInline article slot
  • 完整性:为所有外设(CLOCK、GPIO、I2C、SPI、UART、ADC、DMA)提供 getter/setter。未使用的函数为 weak 链接,因此链接器会丢弃它们。
  • 一致性:团队认可的通用 API。
  • 简洁性:45–55 行原型定义,直观接口,通过 grep 模块测试即可查看文档。
  • 可扩展性:支持组件的多实例。
  • 通用性:支持 ASIC 驱动、协议和 RTOS。
  • 可移植性:在 PC 上使用空 weak 存根即可构建。
  • CLI 访问:运行时通过 UART 验证函数。
  • 可测试性:模块测试即文档。
  • 可配置性:独立的配置,以结构体数组形式。

绑定函数示例

单一 API gpio_logic_level_set(Pad_t pad, GpioLogicLevel_t logic_level) 的不同实现:

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

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

针对 Artery AT32(ISR 安全):

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

原型固定,函数体适配厂商 HAL 或寄存器。

实现优势

  • 可移植性:Proxy MCAL 应用程序通过绑定即可编译到任意 MCU。
  • 测试性:统一的模块测试可验证任意 HAL。
  • CLI 接口:集中的外设管理。
  • ASIC 驱动:适用于所有平台的 SPI/I2C 设备。

缺点及缓解措施

开销——每次调用 10–20 个时钟周期。解决方案:内联函数。通过 API 简洁性和松耦合,将杂乱代码风险降到最低。

Google AdInline article slot

要点

  • Proxy MCAL 将应用程序与厂商 HAL 分离,简化向新 MCU 的迁移。
  • 单一 API 加绑定确保完整性和可移植性。
  • 符合 ISO-26262:模块化、可测试性、可配置性。
  • 支持 CLI 和模块测试,用于运行时验证。
  • 无需重写应用程序,即可扩展到 16+ MCU 系列。

— Editorial Team

Advertisement 728x90

继续阅读