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

 
 
 
Reply to this topicStart new topic
> Оптимизация программы для NIOS II, Различное поведение программы при включении/отключении оптимизации
Artemvvv
сообщение Jul 8 2011, 10:45
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 11-11-09
Из: Minsk
Пользователь №: 53 562



Имеется простой кусок кода:
Код
while (1)
{
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, count & 0x01);
    delay = 0;
    while (delay < 10000000) {
        delay++;
    }        
    count++;
}

По идее должно меняться значение count через некоторую задержку, создаваемую выполнением цикла. Когда выбрана опция оптимизации Off (оптимизация выключена), то программа работает как и должна. Если включить любой тип отпимизации - Level1,2,3, Size, то компилятор выкашивает из программы цикл, типа его результат нигде не используется:
Код
delay = 0;
while (delay < 10000000) {
    delay++;
}

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

Сообщение отредактировал Artemvvv - Jul 8 2011, 10:46
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Jul 8 2011, 10:58
Сообщение #2


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Компилятор видит, что delay нигде дальше не используется, поэтому и выкидывает цикл. Либо используйте новое значение переменной, либо объявите переменную delay как volatile.
Либо делайте задержку по-другому. Таймером, например.
Go to the top of the page
 
+Quote Post
Artemvvv
сообщение Jul 8 2011, 11:17
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 11-11-09
Из: Minsk
Пользователь №: 53 562



Цитата(andrew_b @ Jul 8 2011, 13:58) *
Компилятор видит, что delay нигде дальше не используется, поэтому и выкидывает цикл. Либо используйте новое значение переменной, либо объявите переменную delay как volatile.
Либо делайте задержку по-другому. Таймером, например.

Большое спасибо, сделал volatile, теперь при оптимизации цикл остается.
Go to the top of the page
 
+Quote Post
WitFed
сообщение Dec 8 2011, 15:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



Сейчас компиляторы настолько хитрые пошли, что код типа
Код
  delay = 0;
  while (delay < 10000000) delay++;
  count = count + 1 + delay - delay;

Тоже оптимизируют напрочь. Хотя delay как бы используется после вычисления, хотя и сокращается.
А вот это:
Код
  delay = 0;
  while (!(delay & 0x1000)) delay++;
  count = count + 1 + delay - delay;

им еще пока не под силу просчитать, хотя интеллекта примерно столько же требует wink.gif
Go to the top of the page
 
+Quote Post

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

 


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


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