Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 26.02.2018, 17:42  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от xlr8 Посмотреть сообщение
Умные люди уже все придумали, осталось только понять ход их мыслей.
А мысль их проста, как два пальца. На нулевом уровне оптимизатор ничего не делает, поэтому на простом действе и такая портянка, ибо компиль делает всё тупо в лоб, как написано. На высоких уровнях, в зависимости от стратегии и ключей оптимизатора, оптимизатор может что-то подставить своё, может даже выкинуть куски кода, считая их ненужными, может повторяющиеся куски сложить в подпрограмму, может изменить порядок действий программы, если посчитает это нужным.
Ваша эфемерная попытка чрезмерного контроля поведения компилятора ни к чему хорошему не приведёт. Можно отдельные функции скидывать в отдельные файлы, вплоть до одиночных строк, и назначать для каждого файла свой уровень оптимизации, можно обильно удобрить прогу асмовыми вставками, но ни к чему хорошему, в итоге, это не приведёт.
Обычно этим недугом страдают изрядно засидевшиеся переселенцы с АСМа на Си.
Реклама:
STM32F0 вне форума  
Непрочитано 26.02.2018, 18:02  
xlr8
Частый гость
 
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
xlr8 на пути к лучшему
По умолчанию 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.
xlr8 вне форума  
Непрочитано 26.02.2018, 18:15  
xlr8
Частый гость
 
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
xlr8 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от STM32F0 Посмотреть сообщение
можно обильно удобрить прогу асмовыми вставками, но ни к чему хорошему, в итоге, это не приведёт.
Поддерживаю, интуитивное понимание этого и заставило меня обратиться за помощью

Сообщение от STM32F0 Посмотреть сообщение
Ваша эфемерная попытка чрезмерного контроля поведения компилятора ни к чему хорошему не приведёт.
Да я ни вжизь не хотел его контролировать, но был вынужден, когда передача 8 бит в дисплейчик (последовательно, без таймингов), происходила ~50 мкс при тактовой частоте 8 МГц (0,125 мкс/такт). Когда должно было раза в три быстрее (потом оно так и оказалось)
xlr8 вне форума  
Непрочитано 26.02.2018, 18:22  
DanilinSA
Почётный гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,708
Сказал спасибо: 130
Сказали Спасибо 1,102 раз(а) в 525 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Абсолютно правильное поведение компилятора. Ибо он считает что "Operation" - это константа. Ибо в данном блоке "Operation" не изменяется. И соответственно это считается локальной константой. Со всеми вытекающими результатами оптимизации.
Или как вариант получим ситуацию, когда в прерывании значение переменной изменяется, но программа этого не видит. Ибо значение загрузилось один раз в регистр на входе в цикл (программу) и далее работает только с этим значением в регистре, полностью игнорирую попытки прерывания изменить переменную в памяти.

Но есть волшебное слово "volatile". Если его добавить к определению переменной - она будет считаться глобальной переменной. А не локальной константой. И компилятор не будет пытаться эту переменную оптимизировать. И будет грузить её из памяти при использовании. И "лишний" блок case перестанет выкидываться при оптимизации. И все заработает. И солнце станет ярче светить. И трава зазеленеет (но только летом). И "xlr8" узнает новое ключевое слово "volatile".

Если переменная меняется в прерывании - она должна всегда описана как "volatile"! Всегда.

Последний раз редактировалось DanilinSA; 26.02.2018 в 18:50.
DanilinSA вне форума  
Сказали "Спасибо" DanilinSA
xlr8 (26.02.2018)
Непрочитано 26.02.2018, 19:55  
xlr8
Частый гость
 
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
xlr8 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от DanilinSA Посмотреть сообщение
И "xlr8" узнает новое ключевое слово "volatile".
О великий учитель!!! И вправду работает!!! Но как же это, я открываю Дейтела и глаголит он: коли перед мэйном объявляются переменные так суть их есть глобальные, а ежели хочешь чтоб они неприкосновенными были, так const-ами их нареки!!!???

И еще вопрос на засыпку, а почему nop помог?

Надо поправить свое предыдущее сообщение, пусть все знают...
xlr8 вне форума  
Непрочитано 26.02.2018, 20:51  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от xlr8 Посмотреть сообщение
почему nop помог?
Потому что NOP это АСМовая вставка, а оптимизатору с АСМовыми вставками шалить запрещено.
STM32F0 вне форума  
Непрочитано 26.02.2018, 20:58  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от DanilinSA Посмотреть сообщение
Но есть волшебное слово "volatile". Если его добавить к определению переменной - она будет считаться глобальной переменной. А не локальной константой. И компилятор не будет пытаться эту переменную оптимизировать.
Тут есть разница. Компилятор может оптимизировать обычную глобальную переменную, никто ему это не запрещает. А вот само "volatile" уже говорит оптимизатору, что переменную отимизировать нельзя ни в коем случае.
STM32F0 вне форума  
Непрочитано 26.02.2018, 21:40  
DanilinSA
Почётный гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,708
Сказал спасибо: 130
Сказали Спасибо 1,102 раз(а) в 525 сообщении(ях)
DanilinSA на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Цитата:
И еще вопрос на засыпку, а почему nop помог?
Как уже заметил "STM32F0" - компилятору запрещено оптимизация ассемблерных вставок. А так как ASM вставка - фрагмент SWITCH оператора - то этот оператор "выпал" из оптимизации.

Но "помог" - тут могут быть свои нюансы. Оператор мог остаться, но изменения переменной (которые изменяются из прерывания) программа могла не видеть.

Последний раз редактировалось DanilinSA; 26.02.2018 в 21:45.
DanilinSA вне форума  
Непрочитано 27.02.2018, 00:12  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 707
Сказал спасибо: 363
Сказали Спасибо 795 раз(а) в 370 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Сообщение от xlr8 Посмотреть сообщение
и глаголит он: коли перед мэйном объявляются переменные так суть их есть глобальные, а ежели хочешь чтоб они неприкосновенными были, так const-ами их нареки!!!???
Православно!

И даже если const наречь волатилом, и даже тогда компилятор паче чаяния не возьмет на себя грех - не станет богохульствовать (и бл.дословить) на писание, каковое ему на вход было дадено, а смиренно выполнит предначертание свое, посланное ему свыше, и да привнесет в HEX несколько hex-байтов, а в BIN - несколько bin-байтов от сердца своего. Аминь!
j-Roger вне форума  
Сказали "Спасибо" j-Roger
nml (28.02.2018)
Непрочитано 27.02.2018, 23:22  
xlr8
Частый гость
 
Регистрация: 29.02.2008
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
xlr8 на пути к лучшему
По умолчанию Re: Оптимизация в AVR GCC

Я в курсе, что ноп неприкосновенен, (тем более, что он тоже волатиле) это ведь я "догадался" его туда впереть. Но суждения мои были иными. Я втыкал и втыкал в пошаговую работу дизасма и видел, что не происходит полноценного выполнения свич-а и подумал, что его "бездейственная" ветвь кажется компилятору слишком куцей, и решил приукрасить ее ноп-ом.

Короче теперь я напуган до смерти и волатию все, что движется, а если не движется, шевелю и волатилю... ацтой.

Сейчас я немного по брюзжу, чтобы снять нервное напряжение (это как коменты в коде, не компилируйте их сильно:
// в моем понимании с..ка, оптимизированная и не оптимизированная программы должны иметь один исход и если я б..ть написал switch с двумя условиями, то не х.я мне делать из него while(1){}

Последний раз редактировалось xlr8; 27.02.2018 в 23:30.
xlr8 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 19:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot