Arduino — Как написать макрос, который определяет используемые контакты по имени и номеру, и генерирует ошибку компилятора, если контакт используется в другом месте

Я играл с этим в течение последних 2 часов. Это должно быть просто, но это не работает. Я не очень знаком с макросами и никогда не использовал их из-за их известной нестабильности. Но в этом случае … я не вижу другого лучшего способа не использовать какую-либо микросхему памяти.

Я не хочу использовать для этого память на чипе, поэтому я выбираю директивы прекомпилятора, особенно макросы. Макрос просто должен определять вещи, а не возвращать ничего. Я хочу, чтобы этот макрос был эквивалентен этому коду:

#define PIN3 = 13;
#define PINLED = 13;

И это должно называться так:

P(13,LED);

Таким образом, я могу ссылаться на PINLED в своем коде и получать ошибку компилятора, если какая-либо другая библиотека или код, который я использую, использует PIN13, когда я помещаю P (13, светодиод) в верхнюю часть всех файлов, которые используют этот вывод в моем проект. Я хочу что-то, что называет все контакты одинаково.

Я хочу, чтобы 2 константы / определения были «определены», чтобы PIN13 вызывал ошибку компилятора, но PINLED может называться по-разному во многих проектах

Я попробовал это:

#define P(no_,name_) \
if (true) { \
PIN##name_ = no_; \
PIN##no_ = no_; \
}\
else true

Это работает, но только 1 определяет вместо 2:

#define P(no_,name_) PIN##name_ = no_

Это было предложено многими как правильный синтаксис. Я также попытался использовать синтаксис do … while (0) и другие приемы, чтобы я мог использовать макрос как функцию с; после этого но не работает и всегда выдает какую-то ошибку.

Я использую проект Ino для сборки, потому что я не могу жить с Arduino IDE, которая является просто дерьмом по сравнению с другими IDE.

0

Решение

Извините, но ваш вопрос вряд ли понятен. Вы говорите, что хотите проверить, не был ли пин уже использован в другой части проекта, и в то же время вы показываете код для определения макросов в макросах.

Но это то, что причиняет боль, как показывал @graben, это просто невозможно сделать в C. Прежде всего, оба ваших синтаксиса неверны:

#define P(no_,name_) PIN##name_ = no_

вы не создаете имя макроса PINLED на которую вы назначаете 13, но вы присваиваете переменную C PINLED Значение 13, Чтобы ваш макрос определения ПИН работал, вам нужно использовать const int переменные, которые обычно легко оптимизируются компилятором.

Теперь, чтобы достичь цели, о которой вы говорите, что вы хотите достичь, я думаю, что очень маловероятно, что вы сможете сделать это в коде макропроцессора, по крайней мере, элегантно …

И я не думаю, что это даже необходимо!

Если вы хорошо проектируете свои библиотеки, вам не следует использовать номер булавки во всем коде и библиотеках, а разрабатывать их так, чтобы вы определяли булавки для каждой библиотеки на этапе инициализации библиотеки. Вот почему библиотеки Arduino обычно работают в три этапа:

  1. выделить память (что делается путем вызова конструктора, который часто делается во включенном заголовочном файле как глобальный объект);
  2. настроить экземпляр (что делается с помощью .begin() метод)
  3. использовать экземпляр

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]