10

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

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

(我不惜一切代价想要这个,如果唯一可能的解决方案太可怕或无法维护,那么我会忘记它,只会因泪流满面或着火之类的而声名鹊起。我也看到了这个问题关于生成宏的宏,排除了这种情况。)

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

4

3 回答 3

8
#define CLAIM_PIN(n) char claimed_pin_##n;

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

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

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}
于 2009-10-26T03:37:09.823 回答
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
于 2009-10-26T03:36:00.107 回答
2

如果你能负担得起运行时开销,或者这只是为了调试,我会创建一个类似IOPinOpen()函数的东西来跟踪使用中的引脚,而不是处理宏诡计。

另一方面,Mark Ransom 的更新答案值得 +1。

于 2009-10-26T07:06:23.683 回答