宏指示使用的I/O引脚

det*_*tly 10 c embedded microchip

我正在使用HiTech PICC32为PIC32MX编​​写固件.我想避免的一个问题是,由于大多数引脚都有多个名称(例如AN0 = RB0​​ = CN2 = PGED1),我或其他人可能会意外地使用RB0而没有意识到AN0已被使用.(这实际上可能是灾难性的,因为错误配置模拟/数字引脚会导致过量的电流消耗和基本烟雾的释放.)

除了全面记录每个使用的引脚外,我还想知道是否有一种快速的方法可以在编码层面解决这个问题.我想要一个人们(主要是我自己)可以使用的宏,比如CLAIM_PIN(58),如果它运行两次会发出警告或错误.

(我不惜一切代价想要这个,如果唯一可能的解决方案太可怕或者不可维护,那么我会忘记它,只是为了迸发出眼泪或让自己着火或者其他东西而声名鹊起.我也看到了这个问题关于宏生成宏,它排除了这一点.)

我应该澄清一下:代码是用多个编译单元编写的(至少,我认为这就是这个短语的含义).我有一个.h/.c文件用于我的A2D代码,类似于SPI,同样适用于只使用某些I/O端口的各种外设.空间不是真正的问题,我的代码在PIC32MX上留下了足够的空间; 我也可以使用另一个__DEBUG标志来删除引脚检查代码以供最终使用.

Mar*_*som 8

#define CLAIM_PIN(n) char claimed_pin_##n;
Run Code Online (Sandbox Code Playgroud)

现在,当两段代码尝试声明一个引脚时,符号将被双重定义,编译器或链接器将生成错误.

编辑:根据评论,这可能会变得更好:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}
Run Code Online (Sandbox Code Playgroud)

  • 如何使用函数而不是char? (3认同)
  • 每个引脚使用一个字节.如果这是一个问题,OP可能希望查看链接器选项以将这些定义放入它们自己的部分,并从最终图像中删除它们. (2认同)
  • 但它没有错误.即使在多个编译单元中,这也是完全合法的C. (2认同)

Dig*_*oss 6

好的,这里.没有运行时成本.

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);
Run Code Online (Sandbox Code Playgroud)

如果运行两次会出错:

z.c:4: error: redefinition of ‘struct busy58’
Run Code Online (Sandbox Code Playgroud)

要将检查扩展到多个编译单元,您需要将宏包装起来,#if DEBUG因为我们将使用链接器来检测冲突,因此将具有运行时占用空间.

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果它们位于相同的翻译单元中,则只会出错. (4认同)