c++ - 如何在嵌入式平台中管理不同 Pin-Out 板的代码以实现更好的 HAL 管理?

标签 c++ embedded c99

这里的问题是,如果你的项目很小,#if defined#define#elif defined 链会变得很长,乏味,而且容易失败。在编译时必须有更好的方法来完成这个。

目前我正在通过 #if/#elif 链运行我的代码来定义 GPIO 的引脚和变量名,没有问题这里有一个简化的这看起来像什么的上下文,甚至添加一个头文件来排除 HAL。

所以主要看起来像:

#include “my_path/hal.h”

#define some_function ()
#if defined(BOARD_ID1)
      Do_something KEYS_GPIO_REG_UP
#elif defined(BOARD_ID1)
    Do_something_different KEYS_GPIO_REG_UP
#endif

main()
..

这里是一个 hal 文件,用于将 GPIO 分配给变量。

// Define hal.h 
    #if defined(BOARD_ID1)
    #define KEYS_GPIO_REG_UP            GPIOD->IDR
    #define BUTTON_GPIO_PIN_UP            GPIO_Pin_1  // PD.01
    #elif defined(BOARD_ID2)
    #define KEYS_GPIO_REG_UP            GPIOB->IDR
    #define BUTTON_GPIO_PIN_UP            GPIO_Pin_2  // PB.01

我想了解的是(请向我指出最佳实践文章和/或示例代码的方向)如何在编译时提供 key ID 来定义板: 设置 BOARDID ${BOARDID} 我已经这样做了,而是做同样的事情来定义哪个 hal.h 为每种板类型创建一个 BOARID.h 文件以维护要使用的版本。我不确定这是否可能,或者一个选项是在代码中提供一个脚本变量,它自己和动态必须更改 ìnclude ${BOARDID}.h 作为 make 的可能性脚本。

最佳答案

这不是 HAL,它只是编译器开关的集合 - 这通常是最糟糕的选择之一,因为它们会使代码变得困惑。

HAL 是 board_x.c 中的一组完整函数,以及 board_y.c 中的另一组完整函数。每个 .c 文件中的函数具有相同的名称但执行不同的操作。两个 .c 文件都包含相同的 header API 和函数声明——这是实际的 HAL,也是调用应用程序知道和关心的唯一文件。

然后为单独的板创建单独的项目,或者通过外部版本控制来处理它。在一种情况下,您链接到 board_x.c,而在另一种情况下,您链接到 board_y.c

关于c++ - 如何在嵌入式平台中管理不同 Pin-Out 板的代码以实现更好的 HAL 管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57933587/

相关文章:

c++ - 从 accumulator_set 中删除或修改 accumulators::tag

linux - 如何调整 inotify 以使用更少的内存?

c - 重新分配从函数返回的值会产生段错误

c - 理解 C99 中的这个 "extern inline"调用

c - C中复合类型的目的是什么?

c++ - 使用 vector 作为多线程队列是否安全?

c++ - 具有循环依赖性的 CRTP

c - 如何对ATMEL闪存芯片AT45DB081D进行连续数组读取

c - 如何使用 FFMpeg 将图像转换为视频以用于嵌入式应用程序?

C++ - 在没有加密大小的情况下解密