Проблема с ifdef

Тема в разделе "Флудилка", создана пользователем Alex19, 31 июл 2015.

  1. Alex19

    Alex19 Гуру

    Код (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, работает.

    Подскажите, что не так или как еще можно реализовать такое поведение?
     
  2. geher

    geher Гуру

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

    Можно попробовать такое решение: после
    #define UART_SOFTWARE_DEBUG
    поставить такую в общем-то бессмысленную последовательность, но которая, тем не менее, что-то меняет
    Код (Text):
      #define nop() __asm volatile ("nop")
      #if 1
      nop();
      #endif
    В теории этого должно хватить
     
    Alex19 нравится это.
  3. Alex19

    Alex19 Гуру

    Большое спасибо, помогло.

    UPD.
    Глянул, что это, может кому-то будет полезно.
    Ассемблерный nop - выполнить холостую команду. Выполняется за 1 цикл микроконтроллера.
     
    Последнее редактирование: 31 июл 2015
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Есть способ еще проще и без плясок с бубном:
    Код (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()
      }
    }
     
    Alex19 нравится это.
  5. Alex19

    Alex19 Гуру

    Да он проще.

    Но пугает один момент.
    У меня еще не все на AVR, пока использую SoftwareSerial, Servo, micros(), millis() и т.д.

    А код получается примерно на 300байт меньше, конечно приятно, но не потеряются какие-то возможности?
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    %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;
    }
     
    Вот так должен получиться идентичный результат.
     
    Alex19 нравится это.
  7. Alex19

    Alex19 Гуру

    Спасибо, странно когда я вставил код от туда получил вылет. Присмотрелся и точно, у Вас в примере, без вызова initVariant();

    А в оригинале, вызов есть, но initVariant пустой.

    Надо будет полазить по коду, что бы понять, что можно удалить.
    К примеру, уже под снос.
    И кандидат.
    Код (Text):
    #if defined(USBCON)
        USBDevice.attach();
    #endif
    У меня, своя библиотека.

    UPD. В этой папке столько интересного, сколько я копий делаю для работы, с теме же битами, который там есть и т.д. Еще раз спасибо!

    Минус, чем больше смотришь в код этих файлов, тем отчетливее понимаешь, что ни чего не знаешь. Раньше у меня было побольше уверенности в своих знаниях:).
     
    Последнее редактирование: 1 авг 2015