Перейти к содержанию
    

Осталась, правда непонятка: светодиоды моргают раза в 2 быстрее, если задержка реализована в виде функции

...

Может, кто посветит?

Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры.

Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как во втором случае переменная 'a' объявлена? Это не глобальная volatile int a?

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

 

Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры.

Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново.

 

А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть"

Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз.

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

 

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

 

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

 

Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят

Это да, я в тестовом примере не озаботился оптимальностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци.

Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци.

Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники.

Да я нормально отреагировал) Спасибо за ссылку, познавательно. Читал рекомендации, что оптимизировать надо там, где не пролезает по каким-то критериям. Вот тут и не пролезало: это ж надо в 2 раза меняется частота моргания, начал смотреть в дизассемблер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот тут и не пролезало: это ж надо в 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();
    }
}

За счёт большого числа нопов зависимость времени выполнения функции от уровня оптимизации кода становится маленькой. Не очень красиво, но проще, чем с таймером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда предлагаю такой вариант:

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

Изменено пользователем IgorKossak
Избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем?

Это, возможно, и не нужно, хотя и не вредно совсем. А вот изучить документацию на используемый компилятор, и задать нужный уровень оптимизации нужно сразу. Оптимизация собственно кода (преждевременная, запоздалая или какая другая) в данном случае помянута ни к селу ни к городу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...