реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> mmu&stack
scifi
сообщение Jul 20 2011, 07:53
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AndruLud @ Jul 20 2011, 11:13) *
Осталась, правда непонятка: светодиоды моргают раза в 2 быстрее, если задержка реализована в виде функции
...
Может, кто посветит?

Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры.
Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Jul 20 2011, 08:07
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290



Цитата(aaarrr @ Jul 20 2011, 11:46) *
Как во втором случае переменная 'a' объявлена? Это не глобальная volatile int a?

Глобальная, но без volatile, т.е просто int a

Цитата(scifi @ Jul 20 2011, 11:53) *
Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры.
Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново.


А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть"
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 20 2011, 08:10
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AndruLud @ Jul 20 2011, 12:07) *
А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть"

Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 20 2011, 08:24
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(AndruLud @ Jul 20 2011, 12:07) *
Глобальная, но без volatile, т.е просто int a

Тогда расскажите, какой используется компилятор и какие применены ключи оптимизации. Нормальный компилятор на высоком уровне оптимизации такое безобразие устраивать не должен. Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Jul 20 2011, 08:35
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290



Цитата(scifi @ Jul 20 2011, 12:10) *
Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз.

Спасибо, постараюсь руководствоваться Вашей рекомендацией.

Цитата(aaarrr @ Jul 20 2011, 12:24) *
Тогда расскажите, какой используется компилятор и какие применены ключи оптимизации. Нормальный компилятор на высоком уровне оптимизации такое безобразие устраивать не должен. .


Компилятор в Keil 4. Но дело, по-видимому, в отсутствии оптимизации. Включил оптимизацию 3-го уровня и жизнь наладилась)

Цитата(aaarrr @ Jul 20 2011, 12:24) *
Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят

Это да, я в тестовом примере не озаботился оптимальностью.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 20 2011, 08:41
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AndruLud @ Jul 20 2011, 12:26) *
Спасибо, постараюсь руководствоваться Вашей рекомендацией.

Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци.
Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Jul 20 2011, 08:57
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290



Цитата(scifi @ Jul 20 2011, 12:41) *
Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци.
Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники.

Да я нормально отреагировал) Спасибо за ссылку, познавательно. Читал рекомендации, что оптимизировать надо там, где не пролезает по каким-то критериям. Вот тут и не пролезало: это ж надо в 2 раза меняется частота моргания, начал смотреть в дизассемблер.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 20 2011, 09:06
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AndruLud @ Jul 20 2011, 12:57) *
Вот тут и не пролезало: это ж надо в 2 раза меняется частота моргания, начал смотреть в дизассемблер.

Тогда предлагаю такой вариант:
Код
void delay(int n)
{
    while (n--)
    {
        __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
        __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
        __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
        __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
    }
}

За счёт большого числа нопов зависимость времени выполнения функции от уровня оптимизации кода становится маленькой. Не очень красиво, но проще, чем с таймером.
Go to the top of the page
 
+Quote Post
AndruLud
сообщение Jul 20 2011, 09:16
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-07-11
Пользователь №: 66 290



Цитата(scifi @ Jul 20 2011, 13:06) *
Тогда предлагаю такой вариант:

Возьму на заметку,спасибо, но я с таймером разобрался. Сейчас в прерываниях UARTa ковыряюсь.

Сообщение отредактировал IgorKossak - Jul 20 2011, 10:30
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 20 2011, 09:44
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(scifi @ Jul 20 2011, 12:10) *
Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем?

Это, возможно, и не нужно, хотя и не вредно совсем. А вот изучить документацию на используемый компилятор, и задать нужный уровень оптимизации нужно сразу. Оптимизация собственно кода (преждевременная, запоздалая или какая другая) в данном случае помянута ни к селу ни к городу.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016