WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

vitalik_1984 писал(а):Нет, io.h вы записываете, а из него автоматом в соответствии с ключами компиляции для конкретного Мк препроцессор подключает нужные заголовочные файлы.

я не подключал, однако новые регистры подхватились и ошибок нет.... Изображение
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение urry »

Код: Выделить всё

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

только старые мешают, не TCCR0 а TCCR0A
не TIMSK а TIMSK0
:)
В даташит, одним словом - ссылку вам давали .
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

urry писал(а):

Код: Выделить всё

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

только старые мешают, не TCCR0 а TCCR0A

а не TCCR0B? Я так понял в зависимости от используемых битов.
В даташит, одним словом - ссылку вам давали .

по даташиту и переименовал все регистры. Файл не подключал io.h. Нужно? Все и так собирается.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение urry »

это я для примера привел.
Раз "и так собирается", где-то оно уже включено.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

А вот еще такая загогулина.

Код: Выделить всё

static unsigned char UART_Buf[68];
....
switch (UART_Buf[0])   {

и вот на этом свиче вылазиет ошибка:

Код: Выделить всё

/main.c:429: relocation truncated to fit: R_AVR_7_PCREL against `no symbol'

что ему не нравится? То что массив? Как быть?
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение urry »

"Доктор, у меня это ..." :)
Сама запись относительно безобидная, нужно смотреть весь текст.
Единственно, если включить Кашпировского, то можно предположить, что текст нашпиган арифметикой с флоатами и отсутствует ее оптимизация - строчка в мейк файле LIBS = -lm
Неоптимизированный код забрал всю оперативку.
Но это в качестве предположения.
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

urry писал(а):Сама запись относительно безобидная, нужно смотреть весь текст.

да там много его...
Единственно, если включить Кашпировского, то можно предположить, что текст нашпиган арифметикой с флоатами и отсутствует ее оптимизация - строчка в мейк файле LIBS = -lm

нету там никаких флоат. Там буфер, куда собираются данные с уарта и первый байт это команда, остальные данные - параметры для команды.
Если код изменить на

Код: Выделить всё

unsigned char ch;
ch='t';
switch (ch)   {

то ошибки нет, все компилируется. А если

Код: Выделить всё

unsigned char ch;
сh=UART_Buf[0];
switch (ch)   {

то ошибка эта.

PS Строчку в мейкфайл добавил - такая же фигня.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение urry »

код в студию
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

alex1126 писал(а):нету там никаких флоат. Там буфер, куда собираются данные с уарта и первый байт это команда, остальные данные - параметры для команды.
Если код изменить на
Дальнейшие рассуждения без полного исходника( лучше в виде проекта) не имеют смысла и превращаются во флуд.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

alex1126, под какой МК пишете? В какой среде (какой компилятор, версия)?

Добавил через пару минут:
Похоже МК у вас с флэшем в 16 Кб или больше.

Ещё добавил:
В настройках проекта в разделе оптимизации выключите
"Use rjmp/rcall (limited range) on >8k devices (-mshort-calls)"
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

Я прекрасно понимаю что без кода сложно разобраться в чем проблемма, особенно когда приведенный кусок самостоятельно работает корректно. Но там исходников на 70 килобайт.

Похоже я понял в чем дело - памяти не хватало, поигрался с оптимизацией, скомпилировалось:
AVR Memory Usage
----------
Device: atmega88pa

Program: 6516 bytes (79.5% Full)
(.text + .data + .bootloader)

Data: 604 bytes (59.0% Full)
(.data + .bss + .noinit)

EEPROM: 164 bytes (32.0% Full)
(.eeprom)


пишу под атмегу 88pa_au, avr-gcc (WinAVR 20100110) 4.3.3. Я так понял что там 8кило флеша. А имеет смысл константы во флеше хранить или это на размер прошивке не повлияет (или даже увеличит)?

В настройках проекта в разделе оптимизации выключите
"Use rjmp/rcall (limited range) on >8k devices (-mshort-calls)"

это где?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

это где?

Это наверно про студию речь.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: WinAvr в вопросах и ответах

Сообщение Kavka »

alex1126 писал(а):Похоже я понял в чем дело - памяти не хватало, поигрался с оптимизацией, скомпилировалось
...
пишу под атмегу 88pa_au, avr-gcc (WinAVR 20100110) 4.3.3. Я так понял что там 8кило флеша.
Странно как-то. Эта ошибка возникает когда линковщик не может при принудительно включенных "коротких" переходах/вызовах переупорядочить код так, чтобы всё укладывалось во флэш.
Можно предположить, что для МК с флэшем от 8Кб и меньше эта опция включена автоматом и поэтому линкер именно так ругается.

alex1126 писал(а):А имеет смысл константы во флеше хранить или это на размер прошивке не повлияет (или даже увеличит)?
Смотря что вы имеете в виду. Если ОЗУ хватает, то разницы нет почти.
Если с массивами и не критична скорость доступа к ним, то можно массив констант хранить во флэше (аттрибут PROGMEM) и доставать его через функции из группы pgm_read. Тогда ОЗУ освободиться.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

Я смотрел по этому даташиту: http://www.atmel.com/Images/doc8161.pdf
• High Endurance Non-volatile Memory Segments
– 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory
(ATmega48PA/88PA/168PA/328P)
– 256/512/512/1K Bytes EEPROM (ATmega48PA/88PA/168PA/328P)
– 512/1K/1K/2K Bytes Internal SRAM (ATmega48PA/88PA/168PA/328P)

я так понял что там именно 8к.
И по размеру прошивки: линкер писал что код занимал больше 7к (93%) (когда я часть кода ремарил и код компилировался). Ну и я сделал вывод что просто места не хватает. В коде действительно есть немало глобальных констант/переменных. Возможно он и не может там что то перераспределить....

что касается размещения во флеше... Там да, добавляешь директиву, но и вся работа с этими переменными меняется. Да и я так понял что размер прошивки не уменьшиться (это же только ОЗУ сэкономит во время выполнения программы), а даже увеличится так как доступ к переменным "усложняется".
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

Вряд ли на много увеличится код, так как при размещении во флеш добавится пара тройка функций чтения, зато уберется копирование в оперативную память :)))
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

понятно. Буду надеяться что оставшегося килобайта мне хватит, так как код и так уже соптимизирован практически донельзя.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: WinAvr в вопросах и ответах

Сообщение a_skr »

alex1126 писал(а):констант/переменных
так констант или переменных? ;) заводить переменную, чтобы хранить в ней константу - это как-то неправильно.
vitalik_1984 писал(а):...зато уберется копирование в оперативную память :)))
копирование ВСЕХ инициализированных переменных в ОЗУ - всего 11 команд.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

a_skr писал(а):копирование ВСЕХ инициализированных переменных в ОЗУ - всего 11 команд.

Это типа циклом до упора? :)))

А чтение из флеш памяти сколько занимает?
alex1126
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Re: WinAvr в вопросах и ответах

Сообщение alex1126 »

a_skr писал(а):так констант или переменных? ;)

и тех и других
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: WinAvr в вопросах и ответах

Сообщение a_skr »

Как они у Вас описаны?
Если как "const char a=5;" - память под них все-равно выделяется - замените на "#define a 5" - сэкономите ОЗУ и флеш.
Если избавитесь от всех инициализированных не нулем переменных - сэкономите ~11 команд (~22 байт флеш) - тот самый цикл копирования инициализированных переменных из флеш в ОЗУ.
Если избавитесь от неинициализированных переменных - сэкономите на цикле обнуления - ~8 команд (16 байт флеш).

p.s. Естественно, речь о глобальных переменных.
Про чтение из флеш - если команда LPM, то как обычная команда - 2 байта, правда 3 такта. Что имеет смысл хранить во флеш, кроме строк?
Ответить

Вернуться в «AVR»