WinAvr в вопросах и ответах
Re: WinAvr в вопросах и ответах
Действительно, заработало.
Какой-то капризный компилятор, cvavr в этом отношении проще.
Какой-то капризный компилятор, cvavr в этом отношении проще.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
он не капризный, он просто не любит, когда не соблюдают правила языка Си.Dimon456 писал(а):Какой-то капризный компилятор, cvavr в этом отношении проще
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: WinAvr в вопросах и ответах
И какое же правило языка СИ я нарушил?ARV писал(а):он не капризный, он просто не любит, когда не соблюдают правила языка Си.Dimon456 писал(а):Какой-то капризный компилятор, cvavr в этом отношении проще
Я объявил глобальную переменную
Код: Выделить всё
unsigned int last_millis=0; До winavr я использовал cvavr (возьмите мой код и прогоните через cvavr и он будет работать в таком состоянии в котором есть), с тем проблем не было, не удивительно что с этим вы используете wdt_enable с wdt_reset.
Судя из этой статьи http://chipenable.ru/index.php/item/60 этот компилятор тоит еще те подводные камни.
Странно то что в одном случае
Код: Выделить всё
unsigned int last_millis=0; Код: Выделить всё
volatile unsigned int last_millis=0; Странный компилятор.
Re: WinAvr в вопросах и ответах
В данном случае следует считать странным cvavr. Статью до конца дочитайте.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: WinAvr в вопросах и ответах
Dimon456:
Вы сами указали в настройках компилятора определённый уровень оптимизации (предположу, -O3). Тем самым дав команду компилятору уменьшать размер кода, потребление RAM и т.д. Так что это ваша задача теперь - объявлять глобальные переменные volatile, если они могут измениться в прерывании, и это всё оговорено в документации.
Ну ОК, не то чтобы указали, а просто либо не знали, либо забыли. Но, по большому счёту, какая разница?
P.S. "На пальцах", как это работает (может, где-то упрощённо, но главное - суть):
Есть глобальная переменная - где-то в RAM. Как работает обычная функция (та же main) - переменная вытаскивается из RAM в какой-то из регистров, и там с нею уже все арифметические операции производятся. По выходу из функции изменённая переменная возвращается в RAM.
Соответственно, если МК уйдёт в прерывание, в котором его обработчик внезапно поменяет в памяти эт у переменную, то функция по возврату к ней управления продолжит работать с тем значением, что сохранено в регистре. И по окончании вернёт в память значение, невзирая на то, что там уже "постарался" обработчик прерывания.
Аналогичное явление происходит в многопоточных приложениях, когда несколько потоков, работая с одной глобальной переменной фактически (за счёт оптимизации компилятором) работают каждый с временной локальной копией.
Это нормальное поведение при включенной оптимизации для большинства переменных (ведь в прерывании их не так много меняется обычно). Если такое не нужно для конкретной переменной - объявляем её volatile, после чего при любых попытках работать с ней она будет "обновляться" из памяти. На это нужны, соответственно, лишние операции и такты процессора.
То что CVAVR так делает даже не с volatile переменными может говорить лишь о том, что он генерирует не самый оптимальный код. То есть, даже обычные глобальные переменные, которые в прерываниях не участвуют, вероятно, постоянно "синхронизированы" с RAM при работе с ними. А это уже лишнее
Вы сами указали в настройках компилятора определённый уровень оптимизации (предположу, -O3). Тем самым дав команду компилятору уменьшать размер кода, потребление RAM и т.д. Так что это ваша задача теперь - объявлять глобальные переменные volatile, если они могут измениться в прерывании, и это всё оговорено в документации.
Ну ОК, не то чтобы указали, а просто либо не знали, либо забыли. Но, по большому счёту, какая разница?
P.S. "На пальцах", как это работает (может, где-то упрощённо, но главное - суть):
Есть глобальная переменная - где-то в RAM. Как работает обычная функция (та же main) - переменная вытаскивается из RAM в какой-то из регистров, и там с нею уже все арифметические операции производятся. По выходу из функции изменённая переменная возвращается в RAM.
Соответственно, если МК уйдёт в прерывание, в котором его обработчик внезапно поменяет в памяти эт у переменную, то функция по возврату к ней управления продолжит работать с тем значением, что сохранено в регистре. И по окончании вернёт в память значение, невзирая на то, что там уже "постарался" обработчик прерывания.
Аналогичное явление происходит в многопоточных приложениях, когда несколько потоков, работая с одной глобальной переменной фактически (за счёт оптимизации компилятором) работают каждый с временной локальной копией.
Это нормальное поведение при включенной оптимизации для большинства переменных (ведь в прерывании их не так много меняется обычно). Если такое не нужно для конкретной переменной - объявляем её volatile, после чего при любых попытках работать с ней она будет "обновляться" из памяти. На это нужны, соответственно, лишние операции и такты процессора.
То что CVAVR так делает даже не с volatile переменными может говорить лишь о том, что он генерирует не самый оптимальный код. То есть, даже обычные глобальные переменные, которые в прерываниях не участвуют, вероятно, постоянно "синхронизированы" с RAM при работе с ними. А это уже лишнее
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: WinAvr в вопросах и ответах
Можно было бы рассказать еще об атомарности и зачем она нужна, но подождем пока человек наступит на очередные грабли и прибежит жаловаться на неправильные компиляторы. Документацию ведь для дураков пишут.
Re: WinAvr в вопросах и ответах
Интересует такой вопрос.
В своем девайсе я использую BOOTLOADER, размер 2кБайта.
Значит в atmega8 у меня осталось памяти где то 6кБайт.
Как в Makefile ограничить этот размер, что бы не 8кБайт было а, 6кБат?
В своем девайсе я использую BOOTLOADER, размер 2кБайта.
Значит в atmega8 у меня осталось памяти где то 6кБайт.
Как в Makefile ограничить этот размер, что бы не 8кБайт было а, 6кБат?
Re: WinAvr в вопросах и ответах
Я думаю, просто надо грамотно писать программу, и оно само получится. А если размер скомпилированной проги вылезет за 6кб - чем поможет makefile ? "Утопчет" байты кода или отрежет "ненужные", по его мнению ? Полученный hex всегда можно посмотреть текстовым редактором, и если он вылез за размер, то это видно, и его не надо заливать в МК.
Re: WinAvr в вопросах и ответах
Если размер проги вылазит за пределы, компилятор предупреждает об этом.Jack_A писал(а):А если размер скомпилированной проги вылезет за 6кб - чем поможет makefile ? "Утопчет" байты кода или отрежет "ненужные", по его мнению ?
В данном случае если 8меги не хватит, есть 168 и 328меги.
Просто думал, что makefile есть способ сказать что не 8кБ а 6кБ всего.
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: WinAvr в вопросах и ответах
Может уже было - искать по ветке долго...
Установил на новый ноутбук (Win7) WinAVR20100110. При открытии нотепейджем исходника русские комментарии читаются как крякозяблики. На старом ноутбуке (WinXP) всё было нормально. Подскажите путь решения проблемы. Спасибо!
Установил на новый ноутбук (Win7) WinAVR20100110. При открытии нотепейджем исходника русские комментарии читаются как крякозяблики. На старом ноутбуке (WinXP) всё было нормально. Подскажите путь решения проблемы. Спасибо!
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
Перекодировать все файлы любой доступной программой в win-1251 (или даже в utf-8) и попробовать снова.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Re: WinAvr в вопросах и ответах
и где только ты все это вычитал ?WiseLord писал(а):Dimon456:
P.S. "На пальцах", как это работает (может, где-то упрощённо, но главное - суть):
Есть глобальная переменная - где-то в RAM. Как работает обычная функция (та же main) - переменная вытаскивается из RAM в какой-то из регистров, и там с нею уже все арифметические операции производятся. По выходу из функции изменённая переменная возвращается в RAM.
Соответственно, если МК уйдёт в прерывание, в котором его обработчик внезапно поменяет в памяти эт у переменную, то функция по возврату к ней управления продолжит работать с тем значением, что сохранено в регистре. И по окончании вернёт в память значение, невзирая на то, что там уже "постарался" обработчик прерывания.
Аналогичное явление происходит в многопоточных приложениях, когда несколько потоков, работая с одной глобальной переменной фактически (за счёт оптимизации компилятором) работают каждый с временной локальной копией.
Это нормальное поведение при включенной оптимизации для большинства переменных (ведь в прерывании их не так много меняется обычно). Если такое не нужно для конкретной переменной - объявляем её volatile, после чего при любых попытках работать с ней она будет "обновляться" из памяти. На это нужны, соответственно, лишние операции и такты процессора.
То что CVAVR так делает даже не с volatile переменными может говорить лишь о том, что он генерирует не самый оптимальный код. То есть, даже обычные глобальные переменные, которые в прерываниях не участвуют, вероятно, постоянно "синхронизированы" с RAM при работе с ними. А это уже лишнее
Tell Me The Truth
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
Так одно время делал и WinAVR, в последних сборках перестал.То что CVAVR так делает даже не с volatile переменными может говорить лишь о том, что он генерирует не самый оптимальный код.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
если последними считать все, начиная с 2010 года, то да.watchmaker писал(а):Так одно время делал и WinAVR, в последних сборках перестал.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: WinAvr в вопросах и ответах
Следует добавить, что volatile не дает атомарности и при работе с многобайтными переменными, в некоторых случаях, нужно запрещать прерывания.WiseLord писал(а):Есть глобальная переменная - где-то в RAM. Как работает обычная функция (та же main) - переменная вытаскивается из RAM в какой-то из регистров, и там с нею уже все арифметические операции производятся. По выходу из функции изменённая переменная возвращается в RAM.
Соответственно, если МК уйдёт в прерывание, в котором его обработчик внезапно поменяет в памяти эт у переменную, то функция по возврату к ней управления продолжит работать с тем значением, что сохранено в регистре. И по окончании вернёт в память значение, невзирая на то, что там уже "постарался" обработчик прерывания.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
Интересно. В Яве кстати аналогично.Следует добавить, что volatile не дает атомарности и при работе с многобайтными переменными
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Re: WinAvr в вопросах и ответах
Привет, в winAWR как можно изменить тип контроллера? Исходник под 164 ую атмегу, мне нужно откомпелировать его под 16 ую.
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
Скорее всего придётся редактировать сами исходники - у "старых" атмег (8, 16, 32) регистры расположены не так, как у более новых. А если всё совпадает - искать в Makefile параметр target и подставлять туда идентификатор контроллера.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...
Re: WinAvr в вопросах и ответах
правил. Вроде запустилось железо. Но на всякий случай хочу уточнить. В исходниках где ни будь прописано какие фьюзы нужно выставить?
-
watchmaker
- Поставщик валерьянки для Кота
- Сообщения: 2183
- Зарегистрирован: Вс ноя 15, 2009 23:13:59
- Откуда: Харьков
- Контактная информация:
Re: WinAvr в вопросах и ответах
Нет, это выставляется отдельно при прошивке, например в ponyprog или в avrdude-gui.
Иногда мой питомец уходит в такую спячку, что разбудить его можно только щелчком по первой ноге...




