|
mmu&stack |
|
|
|
Jul 20 2011, 07:53
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(AndruLud @ Jul 20 2011, 11:13)  Осталась, правда непонятка: светодиоды моргают раза в 2 быстрее, если задержка реализована в виде функции ... Может, кто посветит? Если реализуете задержку в виде простого цикла, то будьте готовы к тому, что её длительность будет зависеть от версии компилятора, уровня оптимизации, погоды и гороскопа на сегодняшний день. Иногда это приемлемо. Для стабильных задержек используют аппаратные таймеры. Ну а разница в сгенерированном коде объясняется разными переменными цикла: аргумент функции попал в регистр и стал обрабатываться очень эффективно, а во втором примере, вероятно, переменная цикла сидит в памяти, и компилятор считывает её каждый раз заново.
|
|
|
|
|
Jul 20 2011, 08:07
|
Участник

Группа: Участник
Сообщений: 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 было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть"
|
|
|
|
|
Jul 20 2011, 08:10
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(AndruLud @ Jul 20 2011, 12:07)  А что мешает считать ее в регистр из памяти один раз, обработать и записать обратно? Отсутствие оптимизации? Заняты все регистры? С volatile было бы понятно: "мол, не ты один имеешь доступ к переменной, так что изменяй ее там, где она есть" Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Жизнь слишком коротка. Ориентированность на результат - вот залог успеха. А ковыряние в дизассемблере, как правило, - это время, слитое в унитаз.
|
|
|
|
|
Jul 20 2011, 08:35
|
Участник

Группа: Участник
Сообщений: 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)  Но справедливости ради надо заметить, что обычно все же глобальные переменные в цикле задержки не крутят Это да, я в тестовом примере не озаботился оптимальностью.
|
|
|
|
|
Jul 20 2011, 08:41
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

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

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

|
Цитата(scifi @ Jul 20 2011, 12:41)  Если честно, не ожидал такой реакции :-) Чтобы совсем "добить", немного на тему преждевременной оптимизаци. Признаюсь честно, сам грешил преждевременной оптимизацией поначалу. Заглядывал в дизассемблер, пытался понять, какой исходный код лучше подсунуть компилятору, чтобы на выходе получилось эффективнее. Это занятие сродни разгадыванию кроссвордов: пользы для дела никакой, оправдано только как досуг. А вред очевиден: потерянное время, засранные исходники. Да я нормально отреагировал) Спасибо за ссылку, познавательно. Читал рекомендации, что оптимизировать надо там, где не пролезает по каким-то критериям. Вот тут и не пролезало: это ж надо в 2 раза меняется частота моргания, начал смотреть в дизассемблер.
|
|
|
|
|
Jul 20 2011, 09:06
|
Гуру
     
Группа: Свой
Сообщений: 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(); } } За счёт большого числа нопов зависимость времени выполнения функции от уровня оптимизации кода становится маленькой. Не очень красиво, но проще, чем с таймером.
|
|
|
|
|
Jul 20 2011, 09:16
|
Участник

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

|
Цитата(scifi @ Jul 20 2011, 13:06)  Тогда предлагаю такой вариант: Возьму на заметку,спасибо, но я с таймером разобрался. Сейчас в прерываниях UARTa ковыряюсь.
Сообщение отредактировал IgorKossak - Jul 20 2011, 10:30
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Jul 20 2011, 09:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(scifi @ Jul 20 2011, 12:10)  Можно, конечно, поугадывать ход мыслей компиляторописателей, но зачем? Это, возможно, и не нужно, хотя и не вредно совсем. А вот изучить документацию на используемый компилятор, и задать нужный уровень оптимизации нужно сразу. Оптимизация собственно кода (преждевременная, запоздалая или какая другая) в данном случае помянута ни к селу ни к городу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|