这里的问题是,如果您的项目较小,则#if defined
,#define
,#elif defined
链会变得很长,乏味且容易失败。必须有一种更好的方法来在编译时完成此任务。
目前,我正在通过#if
/ #elif
链运行我的代码,以定义GPIO的引脚和变量名,这里没有问题,即使是添加头文件以排除哈尔
所以主要看起来像:
#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()
..
这是一个将GPIO分配给Variable的hal文件。
// 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
我想了解的是(请向我指出最佳实践文章和/或示例代码的方向)如何进行编译,提供关键ID来定义带有以下内容的电路板:
set BOARDID ${BOARDID}
我已经做过,但是要做同样的事情来定义哪个hal.h为每种板类型创建一个BOARID.h文件,以维护要使用的版本。我不确定是否可行,或者可以选择在自身的代码中提供脚本变量,而动态地必须在make脚本中更改
ìnclude ${BOARDID}.h
。 最佳答案
这不是HAL,只是编译器开关的集合-这通常是最糟糕的选择之一,因为它们会使代码混乱很多。
HAL是board_x.c
中的完整功能集,而board_y.c
中的另一完整功能集。每个.c文件中的函数名称相同,但功能不同。这两个.c文件都包含具有函数声明的相同标头API-这是实际的HAL,并且是调用应用程序知道和关心的唯一文件。
然后为单独的板创建单独的项目,或通过外部版本控制来处理它。在一种情况下,您在board_x.c
中进行链接,而在另一种情况下,您在board_y.c
中进行链接。
关于c++ - 如何在嵌入式平台中管理不同引脚输出板的代码,以更好地进行HAL管理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57933587/