Макрос, указывающий используемые контакты ввода-вывода

StackOverflow https://stackoverflow.com/questions/1622937

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пишу прошивку для PIC32MX, используя HiTech PICC32.Одна из проблем, которой я хочу избежать, заключается в том, что, поскольку большинство контактов имеют несколько имен (например.AN0 = RB0 = CN2 = PGED1), я или кто-то другой может случайно использовать RB0, не осознавая, что AN0 уже используется.(На самом деле это может привести к катастрофическим последствиям, поскольку неправильная настройка аналогового / цифрового вывода может привести к чрезмерному потреблению тока и выделению существенного дыма.)

Помимо всестороннего документирования каждого используемого pin-кода, мне было интересно, есть ли быстрый способ решить эту проблему на уровне кодирования.Мне нужен макрос, который люди (в основном я сам) могли бы использовать, скажем CLAIM_PIN(58), который выдаст предупреждение или ошибку, если его запустить дважды.

(Я не хочу этого любой ценой, если единственно возможное решение окажется слишком ужасным или недостижимым, тогда я забуду об этом и просто заработаю репутацию человека, который расплакался, поджег себя или что-то в этом роде.Я также видел этот вопрос о макрос, создающий макросы, что исключает это.)

Я должен уточнить:код написан в нескольких блоках компиляции (по крайней мере, я думаю, что именно это означает эта фраза).У меня есть файл .h /.c для моего A2D-кода, аналогично для SPI и аналогично для различных периферийных устройств, которые просто используют определенные порты ввода-вывода.Пространство - это не в самом деле проблема в том, что мой код оставляет достаточно места на PIC32MX;также я могу использовать другой флаг __DEBUG, чтобы удалить код проверки pin-кода для окончательного использования.

Это было полезно?

Решение

Хорошо, держи.Никаких затрат на время выполнения.

#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

Другие советы

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

Теперь, когда два фрагмента кода пытаются запросить pin-код, символ будет определен дважды, и либо компилятор, либо компоновщик сгенерируют ошибку.

Редактировать: Судя по комментариям, это могло бы получиться лучше:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}

Если вы можете позволить себе накладные расходы во время выполнения или если это просто для отладки, я бы просто создал что-то вроде IOPinOpen() функция, которая отслеживала используемые пин-коды вместо того, чтобы иметь дело с обманом макросов.

С другой стороны, Обновленный ответ Марка Рэнсома стоил +1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top