Всем привет. Есть удобная и всем известная библиотека 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 Вот только правильно это все написать у меня не получается. Может кто поможет?
Даже не знаю что ответить -- Вы задали вопрос, сами на вопрос правильно ответили. Разве что только дать совет -- по-умолчанию библиотека должна компилироваться в том виде, к каком она была изначально: Код (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: как опцию компилятору -DTX_RX_MAX_BUF_SIZE_4096 как конструкцию #define TX_RX_MAX_BUF_SIZE_4096 (должна быть определена до того как компилятор доберется до исходников, где этот литерал используется в конструкциях #if defned(...))
По умолчанию стоит Код (C++): writeTMSR(0x55); writeRMSR(0x55); Т.е. в начале проекта я должен написать определение TX_RX_MAX_BUF_SIZE_4096 (если нужен измененный вариант), а во всех файлах, где были изменения, подставить соответствующие блоки #if defined ? Правильно?
Исходил из предположения, что используется компилятор из семейства GCC. Каким образом указывается опция, зависит от среды программирования (IDE) или инструментов сборки.
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, но их там несколько! И как указать включение доп.опции - я пока не понял
Не пользуюсь Arduino IDE, по этому не могу сказать как именно в этой среде указываются дополнительные опции к компилятору. Makefile -- один из самых распространенных способов сборки С/С++ проектов и вполне вероятно, что в них и задается. Но Makfile'ы могут генерироваться во время сборки на основе данных, которые задаются определенным способом (опять же зависит от среды). В свое время от Arduino IDE отказался именно из-за сложности тонкой настройки процесса сборки проектов и других проблем (вообще этой средой, IMHO, можно пользоваться только при первом знакомстве, потом стоит все-таки переходить на другие среды). Хотя средой не пользуюсь, но удалять не стал -- библиотеки помогают решать задачи быстрее. Makefile'ы обнаружились только в подкаталогах из 'hardware/arduino/avr/bootloaders/' -- эти подкаталоги содержат исходники загрузчиков для разных типов Arduino. Они не имеют отношения к сборке скетчей. Или у Вас еще есть где Makefile'ы?
Еще парочка рядом лежит 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 - появляются ошибки с которыми справится не получается.
Это, так называемый DFU Bootloader, который позволяет прошивать контроллеры со встроенной поддержкой USB без использования каких-либо программаторов. Это прошивка делает из контроллера адаптер USB <-> Serial (Com-порт). В оригинальных Arduino UNO в качестве такого адаптера используется контроллер ATmega16U2 -- эта прошивка для него. Это заголовочный файл. В месте с ним должны быть еще файл(ы) с реализацией -- либо в виде исходников (расширение *.c, *.cpp или *.S), либо ввиде объектных файлов (расширение *.o или *.so, so -- это разделяемые библиотеки, для AVR скорее редкость). Исходники нужно определенным образом подключать к проекту, что бы они компилировались вместе с файлами проекта. Объектные файлы используются линковщиком, тоже должны подключаться к проекту, но другим способом.
Про добавление всех библиотечных файлов в проект я знаю (разобрался уже). Проблема появляется именно после включения в проект библиотеки Ethernet со всеми ее файлами, вот описание проблемы http://forum.amperka.ru/threads/Ардуиновский-проект-в-code-block.6482/ Но мы отклонились от темы. Может Вы сможете подсказать как Code::Block самостоятельно добавить нужную опцию при компиляции?