Код (Text): //#define UART_SOFTWARE_DEBUG #ifdef UART_SOFTWARE_DEBUG #include <SoftwareSerial.h> #endif #ifdef UART_SOFTWARE_DEBUG #define UART_SOFTWARE_DEBUG_RX_PIN 2 #define UART_SOFTWARE_DEBUG_TX_PIN 3 SoftwareSerial UARTSoftwareDebug(UART_SOFTWARE_DEBUG_RX_PIN, UART_SOFTWARE_DEBUG_TX_PIN); #endif void setup() { } void loop() { } Почему нельзя скомпилировать данный код? Проблема в строках. Код (Text): #ifdef UART_SOFTWARE_DEBUG #define UART_SOFTWARE_DEBUG_RX_PIN 2 #define UART_SOFTWARE_DEBUG_TX_PIN 3 SoftwareSerial UARTSoftwareDebug(UART_SOFTWARE_DEBUG_RX_PIN, UART_SOFTWARE_DEBUG_TX_PIN); #endif Но причину, столь не благопристойного поведения не пойму. Вся идея заключается, в том, чтобы подключать данную библиотеку и настраивать SoftwareSerial в зависимости от конфигурации программы. Другими словами, если UART_SOFTWARE_DEBUG определен мы подключаем SoftwareSerial, настраиваем его и используем его в коде. Если не определена, я не хочу, чтобы она попала в код. Если раскомментировать UART_SOFTWARE_DEBUG, работает. Подскажите, что не так или как еще можно реализовать такое поведение?
Возможно, что это проявление известной проблемы в Arduino IDE, которая заключается в некоторых особенностях генерации кода, подаваемого на вход компилятора. Можно попробовать такое решение: после #define UART_SOFTWARE_DEBUG поставить такую в общем-то бессмысленную последовательность, но которая, тем не менее, что-то меняет Код (Text): #define nop() __asm volatile ("nop") #if 1 nop(); #endif В теории этого должно хватить
Большое спасибо, помогло. UPD. Глянул, что это, может кому-то будет полезно. Ассемблерный nop - выполнить холостую команду. Выполняется за 1 цикл микроконтроллера.
Есть способ еще проще и без плясок с бубном: Код (Text): //#define UART_SOFTWARE_DEBUG #ifdef UART_SOFTWARE_DEBUG #include <SoftwareSerial.h> #endif #ifdef UART_SOFTWARE_DEBUG #define UART_SOFTWARE_DEBUG_RX_PIN 2 #define UART_SOFTWARE_DEBUG_TX_PIN 3 SoftwareSerial UARTSoftwareDebug(UART_SOFTWARE_DEBUG_RX_PIN, UART_SOFTWARE_DEBUG_TX_PIN); #endif int main() { // код из setup() while(1) { // код из loop() } }
Да он проще. Но пугает один момент. У меня еще не все на AVR, пока использую SoftwareSerial, Servo, micros(), millis() и т.д. А код получается примерно на 300байт меньше, конечно приятно, но не потеряются какие-то возможности?
%ARDUINO_IDE%\hardware\arduino\cores\arduino\main.cpp Код (Text): #include <Arduino.h> void setup() { } void loop() { } int main(void) { init(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } Вот так должен получиться идентичный результат.
Спасибо, странно когда я вставил код от туда получил вылет. Присмотрелся и точно, у Вас в примере, без вызова initVariant(); А в оригинале, вызов есть, но initVariant пустой. Надо будет полазить по коду, что бы понять, что можно удалить. К примеру, уже под снос. И кандидат. Код (Text): #if defined(USBCON) USBDevice.attach(); #endif У меня, своя библиотека. UPD. В этой папке столько интересного, сколько я копий делаю для работы, с теме же битами, который там есть и т.д. Еще раз спасибо! Минус, чем больше смотришь в код этих файлов, тем отчетливее понимаешь, что ни чего не знаешь. Раньше у меня было побольше уверенности в своих знаниях.