确定在嵌入式 C 中运行时使用哪个变量

Determine which variable use at runtime in Embedded C

我正在处理的这个固件有两个不同的 makefile。 数据版本 1 和数据版本 2。两个版本都在各自的 make 文件中使用名为 ble_communication.c 的相同文件。

为了区分这两个版本,我们在 ble_communication.c

中声明了两个变量
static uint8_t data_version1[] = {0x00, 0x00, 0x00, 0x00, 0x00};
static uint8_t data_version2[] = {0x01, 0x00, 0x00, 0x00, 0x00};

在 ble_communication.c 文件中,我们有一个名为

的函数
uint32_t start_broadcasting(void)
{
send_beacon(OPCODE, 0, /* determine data version here to send at runtime */, key);
}

我的问题是,由于我们对两个版本的构建使用相同的文件 ble_communication.c,代码如何 select 在代码运行时将哪个变量用于其构建?如果它是数据版本 1,我希望它使用 data_version1[],如果它是数据版本 2,它使用 data_version2[].

我不能使用 #ifndef switch 语句,因为新的设计指南不允许我使用它们

老实说,我更愿意使用 #ifdef,但这里有一个解决方法。

使用 makefile 创建两个包含所需数据的文件和 select 构建时所需的文件。

首先准备两个C文件,ble_communication_data1.cble_communication_data2.c。请随意选择一个更清晰的名称。

将所需数据放入每个 C 文件中,但名称保持相同。

ble_communication_data1.c

uint8_t ble_communication_data[5] = {0x00, 0x00, 0x00, 0x00, 0x00};

ble_communication_data2.c

uint8_t ble_communication_data[5] = {0x01, 0x00, 0x00, 0x00, 0x00};

创建头文件以访问数据:

ble_communication_data.h

extern uint8_t ble_communication_data[5];

修改ble_communication.c使其使用公共变量名:

#include "ble_communication_data.h"

uint32_t start_broadcasting(void)
{
    send_beacon(OPCODE, 0, ble_communication_data, key);
}

最后,在每个 makefile 中,将正确的 ble_communication_data C 文件添加到要编译的文件列表中。