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

0

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

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

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

И это должно получиться так:

P(13,LED);

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

Я хочу, чтобы 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 для сборки, потому что я не могу жить с IDE arduino, который является чистым дерьмом по сравнению с другими IDE.

  • 0
    Просто нашел это, я думаю, что это не может быть сделано с определениями внутри определений. stackoverflow.com/questions/6148066/… Но это можно сделать с помощью int const, например.
Теги:
arduino
atmega

1 ответ

1
Лучший ответ

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

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

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

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

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

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

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

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

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

  • 0
    Здесь я хочу добиться того, чтобы компилятор выдавал ошибку, если, например, контакт 3 используется в нескольких созданных мной библиотеках. Я хочу, чтобы компилятор выдавал ошибку, которую я увижу во время сборки / компиляции. Конечно, способ требовать использования булавки в верхней части каждого объекта / библиотеки должен быть одинаковым для всего, что я буду использовать.
  • 0
    В то же время я наткнулся на Cosa, который кажется красивым и имеет объект распределителя Pin. Это тоже делает работу, но требует памяти и места.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню