Proxy MCAL:微控制器的通用抽象层
Proxy MCAL 解决了将应用程序绑定到特定厂商 HAL 的问题。在将固件迁移到新微控制器时,标准 HAL 需要完全重写 GPIO、SPI、UART 和其他外设驱动程序。Proxy MCAL 为每个 MCU 系列提供单一 API,通过绑定函数实现,从而在不重写应用逻辑的情况下保持代码的可移植性。
开发者常常因芯片停产、供应链短缺、制裁或新需求(如 Bluetooth 5.3)而面临迁移。Proxy MCAL 确保符合 ISO-26262 的模块化设计:抽象架构、可配置性和可测试性。
Proxy MCAL 的要求
Proxy MCAL 必须满足中高级开发者的严格标准:
- 完整性:为所有外设(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:
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 简洁性和松耦合,将杂乱代码风险降到最低。
要点
- Proxy MCAL 将应用程序与厂商 HAL 分离,简化向新 MCU 的迁移。
- 单一 API 加绑定确保完整性和可移植性。
- 符合 ISO-26262:模块化、可测试性、可配置性。
- 支持 CLI 和模块测试,用于运行时验证。
- 无需重写应用程序,即可扩展到 16+ MCU 系列。
— Editorial Team
暂无评论。