这里的问题是,如果你的项目很小,#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/