Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.02.2018, 17:42
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Сообщение от xlr8
|
Умные люди уже все придумали, осталось только понять ход их мыслей.
|
А мысль их проста, как два пальца. На нулевом уровне оптимизатор ничего не делает, поэтому на простом действе и такая портянка, ибо компиль делает всё тупо в лоб, как написано. На высоких уровнях, в зависимости от стратегии и ключей оптимизатора, оптимизатор может что-то подставить своё, может даже выкинуть куски кода, считая их ненужными, может повторяющиеся куски сложить в подпрограмму, может изменить порядок действий программы, если посчитает это нужным.
Ваша эфемерная попытка чрезмерного контроля поведения компилятора ни к чему хорошему не приведёт. Можно отдельные функции скидывать в отдельные файлы, вплоть до одиночных строк, и назначать для каждого файла свой уровень оптимизации, можно обильно удобрить прогу асмовыми вставками, но ни к чему хорошему, в итоге, это не приведёт.
Обычно этим недугом страдают изрядно засидевшиеся переселенцы с АСМа на Си.
|
|
|
|
26.02.2018, 18:02
|
|
Частый гость
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Оптимизация в AVR GCC
***Использование конструкции switch с включенной оптимизацией в AVR Studio 7***
Нашел, изза чего не работал код при включенной оптимизации, может кому пригодится! Моя прога побольше, тут лишь сливки.
Задумка. Пока нет прерываний ничего не делается. Каждое возможное прерывание (у меня их несколько, но тут оставил только одно) разрешает выполнение той или иной полезной функции. Разрешение дается через переменную "Operation". Выбор действия осуществляется с пом. конструкции switch.
Решение 1.0 Если в "case None" (бездействие) закомментарить "nop", то при включенной оптимизации никогда не будет выполнен "case Calculate"
Нажмите, чтобы открыть спойлер
PHP код:
|
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#define None 0x00
#define Calculate 0x01
//Типа полезная функция
void MyFunc(void);
//***Глобалные переменные***//
uint8_t Operation = None; //Регистр управления программой
int main(void)
{
GICR = (1‹‹INT0);//Реагировать на прерывание от INT0
MCUCR = (1‹‹ISC00);//Прерывание по смене фронта на INT0
sei(); //Разрешить прерывания
while(1)
{
//Выполнить какое либо действие
switch (Operation)
{
case None: //Режим ничего не делания
asm volatile("nop"); //***БЕЗ ЭТОГО НЕ РАБОТАЕТ С ОПТИМИЗАЦИЕЙ***
break;
case Calculate: //Режим полезной загрузки
cli();
MyFunc();
Operation = None;//Опять ничего не делать до следующего прерывания
sei(); //Разрешить прерывания
break;
};
};
}
ISR(INT0_vect) //Обработчик прерывания INT0
{
asm volatile("nop");
asm volatile("nop");
Operation = Calculate; //Дать команду на обработку данных
}
MyFunc(void)
{
asm volatile("nop"); //Полезная работа
}
|
Решение 2.0! Решение ниспослано гражданином DanilinSA, в посте №34.
Программа в спойлере выше, будет работать со включенной оптимизацией, если глобальную переменную:
PHP код:
|
uint8_t Operation = None;
|
сделать волатиле:
PHP код:
|
volatile uint8_t Operation = None;
|
Последний раз редактировалось xlr8; 27.02.2018 в 23:00.
|
|
|
|
26.02.2018, 18:15
|
|
Частый гость
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Оптимизация в AVR GCC
Сообщение от STM32F0
|
можно обильно удобрить прогу асмовыми вставками, но ни к чему хорошему, в итоге, это не приведёт.
|
Поддерживаю, интуитивное понимание этого и заставило меня обратиться за помощью
Сообщение от STM32F0
|
Ваша эфемерная попытка чрезмерного контроля поведения компилятора ни к чему хорошему не приведёт.
|
Да я ни вжизь не хотел его контролировать, но был вынужден, когда передача 8 бит в дисплейчик (последовательно, без таймингов), происходила ~50 мкс при тактовой частоте 8 МГц (0,125 мкс/такт). Когда должно было раза в три быстрее (потом оно так и оказалось)
|
|
|
|
26.02.2018, 18:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,715
Сказал спасибо: 130
Сказали Спасибо 1,108 раз(а) в 527 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Абсолютно правильное поведение компилятора. Ибо он считает что "Operation" - это константа. Ибо в данном блоке "Operation" не изменяется. И соответственно это считается локальной константой. Со всеми вытекающими результатами оптимизации.
Или как вариант получим ситуацию, когда в прерывании значение переменной изменяется, но программа этого не видит. Ибо значение загрузилось один раз в регистр на входе в цикл (программу) и далее работает только с этим значением в регистре, полностью игнорирую попытки прерывания изменить переменную в памяти.
Но есть волшебное слово "volatile". Если его добавить к определению переменной - она будет считаться глобальной переменной. А не локальной константой. И компилятор не будет пытаться эту переменную оптимизировать. И будет грузить её из памяти при использовании. И "лишний" блок case перестанет выкидываться при оптимизации. И все заработает. И солнце станет ярче светить. И трава зазеленеет (но только летом). И "xlr8" узнает новое ключевое слово "volatile".
Если переменная меняется в прерывании - она должна всегда описана как "volatile"! Всегда.
Последний раз редактировалось DanilinSA; 26.02.2018 в 18:50.
|
|
|
Сказали "Спасибо" DanilinSA
|
|
|
26.02.2018, 19:55
|
|
Частый гость
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Оптимизация в AVR GCC
Сообщение от DanilinSA
|
И "xlr8" узнает новое ключевое слово "volatile".
|
О великий учитель!!! И вправду работает !!! Но как же это, я открываю Дейтела и глаголит он: коли перед мэйном объявляются переменные так суть их есть глобальные, а ежели хочешь чтоб они неприкосновенными были, так const-ами их нареки!!!???
И еще вопрос на засыпку, а почему nop помог?
Надо поправить свое предыдущее сообщение, пусть все знают...
|
|
|
|
26.02.2018, 20:51
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Сообщение от xlr8
|
почему nop помог?
|
Потому что NOP это АСМовая вставка, а оптимизатору с АСМовыми вставками шалить запрещено.
|
|
|
|
26.02.2018, 20:58
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Сообщение от DanilinSA
|
Но есть волшебное слово "volatile". Если его добавить к определению переменной - она будет считаться глобальной переменной. А не локальной константой. И компилятор не будет пытаться эту переменную оптимизировать.
|
Тут есть разница. Компилятор может оптимизировать обычную глобальную переменную, никто ему это не запрещает. А вот само "volatile" уже говорит оптимизатору, что переменную отимизировать нельзя ни в коем случае.
|
|
|
|
26.02.2018, 21:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,715
Сказал спасибо: 130
Сказали Спасибо 1,108 раз(а) в 527 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Цитата:
|
И еще вопрос на засыпку, а почему nop помог?
|
Как уже заметил "STM32F0" - компилятору запрещено оптимизация ассемблерных вставок. А так как ASM вставка - фрагмент SWITCH оператора - то этот оператор "выпал" из оптимизации.
Но "помог" - тут могут быть свои нюансы. Оператор мог остаться, но изменения переменной (которые изменяются из прерывания) программа могла не видеть.
Последний раз редактировалось DanilinSA; 26.02.2018 в 21:45.
|
|
|
|
27.02.2018, 00:12
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 720
Сказал спасибо: 363
Сказали Спасибо 801 раз(а) в 375 сообщении(ях)
|
Re: Оптимизация в AVR GCC
Сообщение от xlr8
|
и глаголит он: коли перед мэйном объявляются переменные так суть их есть глобальные, а ежели хочешь чтоб они неприкосновенными были, так const-ами их нареки!!!???
|
Православно!
И даже если const наречь волатилом, и даже тогда компилятор паче чаяния не возьмет на себя грех - не станет богохульствовать (и бл.дословить) на писание, каковое ему на вход было дадено, а смиренно выполнит предначертание свое, посланное ему свыше, и да привнесет в HEX несколько hex-байтов, а в BIN - несколько bin-байтов от сердца своего. Аминь!
|
|
|
Сказали "Спасибо" j-Roger
|
|
|
27.02.2018, 23:22
|
|
Частый гость
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Оптимизация в AVR GCC
Я в курсе, что ноп неприкосновенен, (тем более, что он тоже волатиле) это ведь я "догадался" его туда впереть. Но суждения мои были иными. Я втыкал и втыкал в пошаговую работу дизасма и видел, что не происходит полноценного выполнения свич-а и подумал, что его "бездейственная" ветвь кажется компилятору слишком куцей, и решил приукрасить ее ноп-ом.
Короче теперь я напуган до смерти и волатию все, что движется, а если не движется, шевелю и волатилю... ацтой.
Сейчас я немного по брюзжу, чтобы снять нервное напряжение (это как коменты в коде, не компилируйте их сильно:
// в моем понимании с..ка, оптимизированная и не оптимизированная программы должны иметь один исход и если я б..ть написал switch с двумя условиями, то не х.я мне делать из него while(1){}
Последний раз редактировалось xlr8; 27.02.2018 в 23:30.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Оптимизация программы - бортовой компьютер на PIC16F73
|
Hellka |
Микроконтроллеры, АЦП, память и т.д |
6 |
06.09.2010 17:04 |
gcc, iar, code vision AVR ?
|
schotki |
Микроконтроллеры, АЦП, память и т.д |
48 |
26.05.2009 20:15 |
AVR+GCC+jacOS
|
DenisLeonidovich |
Микроконтроллеры, АЦП, память и т.д |
3 |
24.07.2007 14:24 |
GCC AVR не работает printf("Hello word")
|
Kabron |
Proteus, KiCAD и другие ECAD |
8 |
03.03.2007 14:33 |
GNU GCC AVR вопрос по переменным..
|
Mozart |
Микроконтроллеры, АЦП, память и т.д |
3 |
09.02.2007 20:00 |
Часовой пояс GMT +4, время: 06:47.
|
|