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

10-10 21:23