是否有更优雅的方法可以做到这一点:
#if SCID_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};
#elif SCIC_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE};
#elif SCIB_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE };
#else
const uint32_t baseaddr[] = {SCIA_BASE};
#endif
SCI_BASE是从我的程序和uint32_t值之外定义的
我在运行时需要基地址,但是这取决于平台的端口数量。
谢谢!
答案 0 :(得分:2)
那这样的事情呢?
const uint32_t baseaddr[] = {
SCIA_BASE,
#ifdef SCIB_BASE
SCIB_BASE,
#ifdef SCIC_BASE
SCIC_BASE,
#ifdef SCID_BASE
SCID_BASE,
#endif
#endif
#endif
};
或者如果您不想关心mathinc #endif
s:
const uint32_t baseaddr[] = {
SCIA_BASE,
#ifdef SCIB_BASE
SCIB_BASE,
#endif
#ifdef SCIC_BASE
SCIC_BASE,
#endif
#ifdef SCID_BASE
SCID_BASE,
#endif
};
如果获得新地址,这很容易扩展。只需在每个地址上再添加3行即可。
答案 1 :(得分:1)
一种更优雅的方法是在某些全局“ mcu.h”中执行类似的操作。
extern volatile const uint32_t SCI_PORTS; // number of supported ports
然后在“ mcu.c”中输入
:#include "mcu.h"
#ifdef MCU_ABC_X
volatile const uint32_t SCI_PORTS = 2; // allocated at fixed address
#elif MCU_ABC_Y
volatile const uint32_t SCI_PORTS = 3; // allocated at fixed address
...
#endif
那么您的数组将始终为
#include "mcu.h"
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};
for(size_t i=0; i<SCI_PORTS; i++)
send(baseaddr[i], "hello world");
您只能在该数组中使用SCI_PORTS
个项目。这样就可以将SCI_PORTS
放在EEPROM单元之类的固定地址,然后无论编译哪个MCU系列成员,都将获得相同的二进制文件。