Помогите правильно оформить изменения в стандартной библиотеке.

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 13 ноя 2015.

  1. AlexVS

    AlexVS Гик

    Всем привет. Есть удобная и всем известная библиотека Ethernet Library.
    Мне понадобилось внести в нее изменения для своего проекта, которые заключаются в следующем
    Код (C++):
    //////////////////////////////////////////////////////////////////////////
    // По умолчанию в драйвере w5100 размер приемного буфера 2Кб (4 сокета по 2Кб)
    // объем XML данных страницы с 3х часовым прогнозом составляет 15-18Кб
    // Что бы минимизировать потерю информации необходимо увеличить размер приемного буфера
    // до 4Кб (в идеале 1 сокет и 8Кб, но так не работает вообще).
    //////////////////////////////////////////////////////////////////////////
    // По этому вносим изменения в файле w5100.h
    // MAX_SOCK_NUM 2
    // SOCKETS = 2;
    // SMASK = 0x0FFF; // Tx buffer MASK
    // RMASK = 0x0FFF; // Rx buffer MASK
    // SSIZE = 4096; // Max Tx buffer size
    // RSIZE = 4096; // Max Rx buffer size
    //////////////////////////////////////////////////////////////////////////
    // В файле w5100.cpp
    // TX_RX_MAX_BUF_SIZE 4096
    // writeTMSR(0xAA);
    // writeRMSR(0xAA);
    //////////////////////////////////////////////////////////////////////////
    // В файле Ethernet.h
    // MAX_SOCK_NUM 2
    //////////////////////////////////////////////////////////////////////////
    // В файле Ethernet.cpp
    // uint8_t EthernetClass::_state[MAX_SOCK_NUM] = { 0, 0 };
    // uint16_t EthernetClass::_server_port[MAX_SOCK_NUM] = { 0 , 0 };
    //////////////////////////////////////////////////////////////////////////
    В очередном проекте мне уже нужна оригинальная версия, держать 2 библиотеки и подменять их - как то не правильно. Можно конечно все файлы одной из библиотек переименовать и внести соответствующие изменения внутри. Но я хочу попробовать оформить изменения с помощью директив предпроцессору, что то типа
    Код (C++):
    #if defined(бла...бла...бла)
    #define TX_RX_MAX_BUF_SIZE 2048
    #else
    #define TX_RX_MAX_BUF_SIZE 4096
    #endif
    Вот только правильно это все написать у меня не получается. Может кто поможет?
     
  2. AlexU

    AlexU Гуру

    Даже не знаю что ответить -- Вы задали вопрос, сами на вопрос правильно ответили. Разве что только дать совет -- по-умолчанию библиотека должна компилироваться в том виде, к каком она была изначально:
    Код (C++):
    #if defined(TX_RX_MAX_BUF_SIZE_4096) // если определен литерал TX_RX_MAX_BUF_SIZE_4096
    #define TX_RX_MAX_BUF_SIZE 4096
    writeTMSR(0xAA);
    writeRMSR(0xAA);
    #else
    #define TX_RX_MAX_BUF_SIZE 2048
    writeTMSR(0x??); // вот тут не знаю что должно быть write при буфере 2048
    writeRMSR(0x??);
    #endif
    Далее определяете литерал TX_RX_MAX_BUF_SIZE_4096:
    1. как опцию компилятору -DTX_RX_MAX_BUF_SIZE_4096
    2. как конструкцию #define TX_RX_MAX_BUF_SIZE_4096 (должна быть определена до того как компилятор доберется до исходников, где этот литерал используется в конструкциях #if defned(...))
     
    AlexVS нравится это.
  3. AlexVS

    AlexVS Гик

    По умолчанию стоит
    Код (C++):
      writeTMSR(0x55);
      writeRMSR(0x55);
    Т.е. в начале проекта я должен написать определение TX_RX_MAX_BUF_SIZE_4096 (если нужен измененный вариант), а во всех файлах, где были изменения, подставить соответствующие блоки #if defined ?
    Правильно?
     
  4. AlexU

    AlexU Гуру

    Да
     
  5. AlexVS

    AlexVS Гик

    Спасибо.
     
  6. AlexVS

    AlexVS Гик

    При прочтении ответа не обратил внимания на п.1.
    Опция для компилятора указывается как то отдельно?
     
  7. AlexU

    AlexU Гуру

    Исходил из предположения, что используется компилятор из семейства GCC.
    Каким образом указывается опция, зависит от среды программирования (IDE) или инструментов сборки.
     
  8. AlexVS

    AlexVS Гик

    IDE обычная Ардуиновская, 1.6.5. Компилятор, насколько я понимаю, avr-g++
    При компиляции я вижу следующее:
    Код (C++):
    :\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR
    где присутствуют опция -DARDUINO_ARCH_AVR например, но как указать компилятору что при наличии в коде объявления TX_RX_MAX_BUF_SIZE_4096 подставить опцию -DTX_RX_MAX_BUF_SIZE_4096 ?
    Скорее всего это делается через makefile, но их там несколько! И как указать включение доп.опции - я пока не понял :(
     
    Последнее редактирование: 15 ноя 2015
  9. AlexU

    AlexU Гуру

    Не пользуюсь Arduino IDE, по этому не могу сказать как именно в этой среде указываются дополнительные опции к компилятору.
    Makefile -- один из самых распространенных способов сборки С/С++ проектов и вполне вероятно, что в них и задается. Но Makfile'ы могут генерироваться во время сборки на основе данных, которые задаются определенным способом (опять же зависит от среды).

    В свое время от Arduino IDE отказался именно из-за сложности тонкой настройки процесса сборки проектов и других проблем (вообще этой средой, IMHO, можно пользоваться только при первом знакомстве, потом стоит все-таки переходить на другие среды).
    Хотя средой не пользуюсь, но удалять не стал -- библиотеки помогают решать задачи быстрее. Makefile'ы обнаружились только в подкаталогах из 'hardware/arduino/avr/bootloaders/' -- эти подкаталоги содержат исходники загрузчиков для разных типов Arduino. Они не имеют отношения к сборке скетчей. Или у Вас еще есть где Makefile'ы?
     
  10. AlexVS

    AlexVS Гик

    Еще парочка рядом лежит
    C:\Program Files\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbdfu
    и
    C:\Program Files\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial
    Пробовал перебраться в Code::Block, с небольшиими проектами получается, но вот при включении в проект Ethernet.h - появляются ошибки с которыми справится не получается.
     
  11. AlexU

    AlexU Гуру

    Это, так называемый DFU Bootloader, который позволяет прошивать контроллеры со встроенной поддержкой USB без использования каких-либо программаторов.
    Это прошивка делает из контроллера адаптер USB <-> Serial (Com-порт). В оригинальных Arduino UNO в качестве такого адаптера используется контроллер ATmega16U2 -- эта прошивка для него.

    Это заголовочный файл. В месте с ним должны быть еще файл(ы) с реализацией -- либо в виде исходников (расширение *.c, *.cpp или *.S), либо ввиде объектных файлов (расширение *.o или *.so, so -- это разделяемые библиотеки, для AVR скорее редкость).
    Исходники нужно определенным образом подключать к проекту, что бы они компилировались вместе с файлами проекта. Объектные файлы используются линковщиком, тоже должны подключаться к проекту, но другим способом.
     
  12. AlexVS

    AlexVS Гик

    Про добавление всех библиотечных файлов в проект я знаю (разобрался уже). Проблема появляется именно после включения в проект библиотеки Ethernet со всеми ее файлами, вот описание проблемы http://forum.amperka.ru/threads/Ардуиновский-проект-в-code-block.6482/
    Но мы отклонились от темы.
    Может Вы сможете подсказать как Code::Block самостоятельно добавить нужную опцию при компиляции?
     
  13. AlexU

    AlexU Гуру

    К сожалению, не могу, т.к. с Code::Blocks дела не имел.
     
  14. AlexVS

    AlexVS Гик

    Ну что же, жаль. Будем искать...