scifi 1 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Осталась, правда непонятка: светодиоды моргают раза в 2 быстрее, если задержка реализована в виде функции ... Может, кто посветит? Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры. Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Как во втором случае переменная 'a' объявлена? Это не глобальная volatile int a? Глобальная, но без volatile, т.е просто int a Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры. Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново. А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть" Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 67 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Глобальная, но без volatile, т.е просто int a Тогда расскажите, какой используется компилятор и какие применены ключи оптимизации. Нормальный компилятор на высоком уровне оптимизации такое безобразие устраивать не должен. Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз. Спасибо, постараюсь руководствоваться Вашей рекомендацией. Тогда расскажите, какой используется компилятор и какие применены ключи оптимизации. Нормальный компилятор на высоком уровне оптимизации такое безобразие устраивать не должен. . Компилятор в Keil 4. Но дело, по-видимому, в отсутствии оптимизации. Включил оптимизацию 3-го уровня и жизнь наладилась) Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят Это да, я в тестовом примере не озаботился оптимальностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Спасибо, постараюсь руководствоваться Вашей рекомендацией. Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци. Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци. Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники. Да я нормально отреагировал) Спасибо за ссылку, познавательно. Читал рекомендации, что оптимизировать надо там, где не пролезает по каким-то критериям. Вот тут и не пролезало: это ж надо в 2 раза меняется частота моргания, начал смотреть в дизассемблер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Вот тут и не пролезало: это ж надо в 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(); } } За счёт большого числа нопов зависимость времени выполнения функции от уровня оптимизации кода становится маленькой. Не очень красиво, но проще, чем с таймером. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndruLud 0 20 июля, 2011 Опубликовано 20 июля, 2011 (изменено) · Жалоба Тогда предлагаю такой вариант: Возьму на заметку,спасибо, но я с таймером разобрался. Сейчас в прерываниях UARTa ковыряюсь. Изменено 20 июля, 2011 пользователем IgorKossak Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 67 20 июля, 2011 Опубликовано 20 июля, 2011 · Жалоба Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Это, возможно, и не нужно, хотя и не вредно совсем. А вот изучить документацию на используемый компилятор, и задать нужный уровень оптимизации нужно сразу. Оптимизация собственно кода (преждевременная, запоздалая или какая другая) в данном случае помянута ни к селу ни к городу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться