2014-01-29 1 views
0

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

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

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

+0

Только что нашел это, я думаю, это невозможно сделать с определениями внутри определяет. http://stackoverflow.com/questions/6148066/preprocessor-directives-inside-define Но это может быть сделано с помощью функции int const. – Graben

ответ

1

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

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

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

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

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

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

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

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

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

+0

Что я хочу достичь здесь, чтобы заставить компилятор произвести ошибку, если pin 3, например, используется в нескольких библиотеках, которые я сделал. Я хочу, чтобы компилятор произвел ошибку, которую я увижу во время сборки/компиляции. Разумеется, способ использования штыря в верхней части каждого объекта/библиотеки должен быть одинаковым для всего, что я буду использовать. – Graben

+0

Тем временем я наткнулся на Cosa, который кажется приятным и имеет объект-распределитель Pin. Это тоже делает работу, но занимает память и пространство. – Graben

+0

Кстати, грабен - это я, тот, кто поставил вопрос в первую очередь! Я прокомментировал свой вопрос. – Graben

 Смежные вопросы

  • Нет связанных вопросов^_^