Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: компилятор, похоже, оптимизирует ф-ю задержки
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
Код
void Delay(uint32_t step)
{
for (uint32_t i = 0; i < step; i++);
}

int main() {
  
   for (;;) {
    on (LED_Green);
    Delay(0xFFFF);
    off (LED_Green);
    }
}

передавал число в ф-ю и смотрел отладчиком- все честно, ходит по циклу и вываливается.

Но, вне зависимости от переданного аргумента, задержка на осцилле не меняется.
volatile не помогает.
Компилятор IAR
AHTOXA
Цитата(Метценгерштейн @ Feb 20 2013, 21:33) *
volatile не помогает.

Вообще-то обязано помогать. Куда вы его писали?
Метценгерштейн
Код
void Delay(uint32_t step)
{
    for (volatile  uint32_t i = 0; i < step; i++);
}


а как оно- volatile связано тут? где здесь переменная, кот. может внезапно поменяться?
kovigor
Цитата(Метценгерштейн @ Feb 20 2013, 19:33) *
Компилятор IAR

В Кейле можно запретить оптимизировать фрагмент посредством "#pragma". Наверное, и в ИАРе тоже можно:
http://www.keil.com/support/man/docs/armcc...cc_cjaieafa.htm
aaarrr
Цитата(Метценгерштейн @ Feb 20 2013, 19:33) *
передавал число в ф-ю и смотрел отладчиком- все честно, ходит по циклу и вываливается.

Если уж "ходит по циклу", значит цикл на месте. Может, не тот полупериод на осциллографе смотрите?
Метценгерштейн
точно!
не тот полупериод смотрел )
как всегда, под вечер туго соображаю)

иногда нужно, чтобы кто- то свежую мысль подал. Спасибо.

igorle
Цитата(Метценгерштейн @ Feb 20 2013, 19:56) *
а как оно- volatile связано тут? где здесь переменная, кот. может внезапно поменяться?


С volatile связано очень сильно.
Во-первых, без этого компилятор может сообразить что результатом этого цикла будет i=step.
Во-вторых без этого компилятор может один раз использовать регистр для переменной i, а другой - ячейку памяти. Время доступа разное, так что ВНЕЗАПНО один и тот-же код может дать разную задержку. Такие функции зачастую инлайнятся, или вообще определяются с помощью дефайнов. И без volatile вас ждет полная неопределенность.
Метценгерштейн
где корректно поставить volatile тогда?
AHTOXA
У вас правильно написано.
gerber
Если уж так, совсем по-взрослому, говорить о реализации циклов задержки, то помимо volatile необходимо позаботиться о размещении переменной в некэшируемой памяти.
Или если всё же в кэшируемой, то помнить об этом:
Код
volatile int i;
.............................................................
i++; //assume "i" in cache after increment
for(i=0; i<delay; i++);

Но это актуально только для циклов, отмеряющих программно точные временные интервалы.
msalov
Можно сделать volatile не индекс, а тело цикла:
Код
for (register unsigned int i = step; i; --i)
    asm ("");
Только значение задержки в попугаях для той же временной задержки изменится в большую сторону.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.