let's see 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба pitt, а какая у Вас версия? WinAVR-20060421 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба О! Может тут кто-нибудь скажет: 1) как заставить WinAVR не подлинковывать функции к которым никто не обращается? Бить исходный файл на десять (по файлу на функцию) и делать из них библиотеку не хочу - дурная работа и инкапсуляция страдает. 2) объявляю две функции (putstring, putstring_P) у одной аргумет - указатель на флеш, у второй - указатель на RAM. Еще не зная о тонкостях досупа к флеш в обоих написал putchar(*ptr++); и получил две функции с идентичным кодом (т.е. с LD вместо LPM во второй) _без_всяких_варнингов_. Это штатное поведение? Как же тогда отслеживать ошибки типа "забыл вытащить переменную через макрос"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 26 июля, 2006 Опубликовано 26 июля, 2006 (изменено) · Жалоба О! Может тут кто-нибудь скажет: 1) как заставить WinAVR не подлинковывать функции к которым никто не обращается? Бить исходный файл на десять (по файлу на функцию) и делать из них библиотеку не хочу - дурная работа и инкапсуляция страдает. Первый вариант: 1. Добавить опции "-ffunction-sections -fdata-sections" компилятору. 2. Добавить опцию "-gc-sections" (обязательно до опций -l и -L) линкеру. Но это будет работать ТОЛЬКО с binutils 2.17. binutils 2.16.1 удалит не только не используемые функции но и прерывания. Я не особо тестировал, но похоже "-fdata-sections" не работает. С binutils 2.17 есть еще одна прблемма: AVRStudio (4.12) не загружает .elf файлы в которых нет .data сегмента. Тоесть должна быть как минимум одна глобальная инициализированная переменная. Ждите новый релиз WinAVR или попробуйте взять компилятор отсюда: http://www.klen.org/Projects/Avr-gcc/avr-gcc_last_build.html Второй вариант: Опция компилятора -fwhole-program. Но опять-же чтобы прерывания остались на месте придется постараться. Нужно добавить атрибут "used" в объявления функций прерываний. Подробнее здесь: http://savannah.nongnu.org/bugs/?func=deta...p;item_id=16411 Я это не тестировал. Анатолий. Изменено 26 июля, 2006 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба 2) объявляю две функции (putstring, putstring_P) у одной аргумет - указатель на флеш, у второй - указатель на RAM. Еще не зная о тонкостях досупа к флеш в обоих написал putchar(*ptr++); и получил две функции с идентичным кодом (т.е. с LD вместо LPM во второй) _без_всяких_варнингов_. Это штатное поведение? Как же тогда отслеживать ошибки типа "забыл вытащить переменную через макрос"? Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Проблемы будут, если попытаться одной и той же функцией обращаться и к RAM и к flash манипулируя аргументом. Об этом надо просто постоянно помнить, хотя для простых манипуляций лучше пользоваться библиотечными функциями. Ну и еще не грех включить warning на максимальном уровне. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 26 июля, 2006 Опубликовано 26 июля, 2006 · Жалоба Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне. По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь. А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне. По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь. А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 27 июля, 2006 Опубликовано 27 июля, 2006 · Жалоба Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне. По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь. А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Seasonf 0 11 августа, 2006 Опубликовано 11 августа, 2006 · Жалоба Прошу прощения за глупый вопрос, но как заставить WinAVR сохранять стринговые постоянные в память программ, а не в еепром ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 11 августа, 2006 Опубликовано 11 августа, 2006 · Жалоба #include <avr/pgmspace.h> ... char calib_fail[] PROGMEM = "\n\rCalibration has failed: reset and repeat!"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Seasonf 0 11 августа, 2006 Опубликовано 11 августа, 2006 · Жалоба Или так: #include <avr/pgmspace.h> ... pro_char calib_fail[] = "\n\rCalibration has failed: reset and repeat!"; нашел в гуглях ссылку на этот хидер, а в хидере уже сам посмотрел :-) Но всё равно спасибо ! #include <avr/pgmspace.h> ... char calib_fail[] PROGMEM = "\n\rCalibration has failed: reset and repeat!"; то есть prog_char ... в хидере переопределен тип специально Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться