我正在使用HiTech PICC32为PIC32MX编写固件。我想避免的一个问题是,由于大多数引脚都有多个名称(例如,AN0 = RB0 = CN2 = PGED1),我或其他人可能会意外地使用RB0,而没有意识到AN0已被使用。 (这实际上可能是灾难性的,因为错误配置模拟/数字引脚会导致过量的电流消耗和基本烟雾的释放。)
除了全面记录每个使用的引脚外,我还想知道是否有一种快速的方法可以在编码层面解决这个问题。我想要一个人(主要是我自己)可以使用的宏,比如CLAIM_PIN(58)
,如果它运行两次会发出警告或错误。
(我不想不惜一切代价,如果唯一可能的解决方案太可怕或不可维护,那么我会忘记它,只是因为泪流满面或让自己着火或其他东西而声名鹊起。我也是看到了关于macro producing macros的问题,排除了这一点。)
我应该澄清一下:代码是用多个编译单元编写的(至少,我认为这就是这个短语的含义)。我有一个.h / .c文件用于我的A2D代码,类似于SPI,同样适用于只使用某些I / O端口的各种外设。空间不是真的问题,我的代码在PIC32MX上留下了足够的空间;我也可以使用另一个__DEBUG标志来删除引脚检查代码以供最终使用。
答案 0 :(得分:8)
#define CLAIM_PIN(n) char claimed_pin_##n;
现在当两段代码试图声明一个引脚时,符号将被双重定义,编译器或链接器将产生错误。
修改:根据评论,这可能会更好:
#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}
答案 1 :(得分:6)
好的,这里。没有运行时成本。
#define CLAIM(n) struct busy##n {}
CLAIM(58);
CLAIM(58);
如果再次运行,则会出错:
z.c:4: error: redefinition of ‘struct busy58’
要将检查扩展到多个编译单元,您需要将宏包装在#if DEBUG
中,因为我们将使用链接器来检测冲突,因此会有运行时占用空间。
#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan
答案 2 :(得分:2)
如果你能负担得起运行时间开销,或者只是为了调试,我只需要创建类似IOPinOpen()
函数的东西来跟踪正在使用的引脚而不是处理宏技巧。
另一方面,Mark Ransom's updated answer值得+1。