Перейти к содержанию
    

О! Может тут кто-нибудь скажет:

1) как заставить WinAVR не подлинковывать функции к которым никто не обращается? Бить исходный файл на десять (по файлу на функцию) и делать из них библиотеку не хочу - дурная работа и инкапсуляция страдает.

2) объявляю две функции (putstring, putstring_P) у одной аргумет - указатель на флеш, у второй - указатель на RAM. Еще не зная о тонкостях досупа к флеш в обоих написал putchar(*ptr++); и получил две функции с идентичным кодом (т.е. с LD вместо LPM во второй) _без_всяких_варнингов_. Это штатное поведение? Как же тогда отслеживать ошибки типа "забыл вытащить переменную через макрос"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О! Может тут кто-нибудь скажет:

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

 

Я это не тестировал.

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2) объявляю две функции (putstring, putstring_P) у одной аргумет - указатель на флеш, у второй - указатель на RAM. Еще не зная о тонкостях досупа к флеш в обоих написал putchar(*ptr++); и получил две функции с идентичным кодом (т.е. с LD вместо LPM во второй) _без_всяких_варнингов_. Это штатное поведение? Как же тогда отслеживать ошибки типа "забыл вытащить переменную через макрос"?

Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Проблемы будут, если попытаться одной и той же функцией обращаться и к RAM и к flash манипулируя аргументом.

Об этом надо просто постоянно помнить, хотя для простых манипуляций лучше пользоваться библиотечными функциями. Ну и еще не грех включить warning на максимальном уровне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне.

По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь.

А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне.

По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь.

А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как только в _объявлении_ присутсвует модификатор flash - сгенерится LPM. Ну и еще не грех включить warning на максимальном уровне.

По моему разумению модификатор flash это CVAVRина, а WinAVR ее не имеет, но может быть я ошибаюсь.

А вот выключать или оставлять warning(s) это ОЧЕНЬ большой грех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу прощения за глупый вопрос, но как заставить WinAVR сохранять стринговые постоянные в память программ, а не в еепром ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или так:

 

#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 ...

 

в хидере переопределен тип специально

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...