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

 
 
 
Reply to this topicStart new topic
> компилятор, похоже, оптимизирует ф-ю задержки, как заставить отрабатывать без оптимизации?
Метценгерштейн
сообщение Feb 20 2013, 15:33
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 20 2013, 15:35
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Метценгерштейн @ Feb 20 2013, 21:33) *
volatile не помогает.

Вообще-то обязано помогать. Куда вы его писали?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 20 2013, 15:56
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
void Delay(uint32_t step)
{
    for (volatile  uint32_t i = 0; i < step; i++);
}


а как оно- volatile связано тут? где здесь переменная, кот. может внезапно поменяться?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Feb 20 2013, 16:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Метценгерштейн @ Feb 20 2013, 19:33) *
Компилятор IAR

В Кейле можно запретить оптимизировать фрагмент посредством "#pragma". Наверное, и в ИАРе тоже можно:
http://www.keil.com/support/man/docs/armcc...cc_cjaieafa.htm
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 20 2013, 16:40
Сообщение #5


Гуру
******

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



Цитата(Метценгерштейн @ Feb 20 2013, 19:33) *
передавал число в ф-ю и смотрел отладчиком- все честно, ходит по циклу и вываливается.

Если уж "ходит по циклу", значит цикл на месте. Может, не тот полупериод на осциллографе смотрите?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 20 2013, 16:46
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



точно!
не тот полупериод смотрел )
как всегда, под вечер туго соображаю)

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



Сообщение отредактировал Метценгерштейн - Feb 20 2013, 16:57
Go to the top of the page
 
+Quote Post
igorle
сообщение Feb 21 2013, 08:32
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



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


С volatile связано очень сильно.
Во-первых, без этого компилятор может сообразить что результатом этого цикла будет i=step.
Во-вторых без этого компилятор может один раз использовать регистр для переменной i, а другой - ячейку памяти. Время доступа разное, так что ВНЕЗАПНО один и тот-же код может дать разную задержку. Такие функции зачастую инлайнятся, или вообще определяются с помощью дефайнов. И без volatile вас ждет полная неопределенность.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 21 2013, 15:26
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



где корректно поставить volatile тогда?

Сообщение отредактировал Метценгерштейн - Feb 21 2013, 15:26
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 21 2013, 17:08
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



У вас правильно написано.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
gerber
сообщение Feb 21 2013, 18:19
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Если уж так, совсем по-взрослому, говорить о реализации циклов задержки, то помимо volatile необходимо позаботиться о размещении переменной в некэшируемой памяти.
Или если всё же в кэшируемой, то помнить об этом:
Код
volatile int i;
.............................................................
i++; //assume "i" in cache after increment
for(i=0; i<delay; i++);

Но это актуально только для циклов, отмеряющих программно точные временные интервалы.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
msalov
сообщение Feb 21 2013, 19:17
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Можно сделать volatile не индекс, а тело цикла:
Код
for (register unsigned int i = step; i; --i)
    asm ("");
Только значение задержки в попугаях для той же временной задержки изменится в большую сторону.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 14:27
Рейтинг@Mail.ru


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