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

 
 
> IAR->debug/release->Optimizations, неработает или не понимаю как...
D1ma
сообщение Nov 14 2009, 12:49
Сообщение #1


Участник
*

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



Здравствуйте!
Объясните, пожалуйста, как пользоваться оптимизацией в IAR (точней как она работает)!
Есть такие настройки : смотри файл
Прикрепленное изображение


Но моя программа работает только в debug -> size ->low
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Сергей Борщ
сообщение Nov 14 2009, 13:37
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(D1ma @ Nov 14 2009, 14:49) *
Но моя программа работает только в debug -> size ->low
Значит в ней есть ошибки (места, поведение которых не регламентировано стандартом, которые при низких уровнях оптимизации работают именно так, как вы задумали). Поищите по форуму ключевое слово volatile - 90% проблем от его неиспользования там, где оно необходимо.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
D1ma
сообщение Nov 14 2009, 16:58
Сообщение #3


Участник
*

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



Цитата
DECLARING OBJECTS VOLATILE
There are three main reasons for declaring an object volatile:
● Shared access; the object is shared between several tasks in a multitasking
environment
● Trigger access; as for a memory-mapped SFR where the fact that an access occurs
has an effect
● Modified access; where the contents of the object can change in ways not known to
the compiler.
Definition of access to volatile objects
The ISO/ANSI standard defines an abstract machine, which governs the behavior of
accesses to volatile declared objects. The AVR IAR C/C++ Compiler considers each
read and write access to an object that has been declared volatile as an access. The
unit for the access is either the entire object or, for accesses to an element in a composite
object—such as an array, struct, class, or union—the element. For example:
Код
char volatile a;
a = 5; /* A write access */
a += 6; /* First a read then a write access */

An access to a bitfield is treated as an access to the underlaying type.
Rules for accesses
Accesses to volatile declared objects are subject to the following rules:
1 All accesses are preserved
2 All accesses are complete, that is, the whole object is accessed
3 All accesses are performed in the same order as given in the abstract machine
4 All accesses are atomic, that is, non-interruptable.

The AVR IAR C/C++ Compiler adheres to these rules for all 8-bit types.
The following object types are treated in a special way:
For all combinations of object types not listed, only rule number one applies.

обясните , пожалуйста, толково как этим и где пользоваться и какой смысл такого обяв.. в даном примере
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 14 2009, 19:56
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(D1ma @ Nov 14 2009, 20:58) *
обясните , пожалуйста, толково как этим и где пользоваться и какой смысл такого обяв.. в даном примере

Здесь всего лишь пример объявления. Поищите на русском языке, если английский труден.

Обычно volatile используется для переменных, которые изменяются в прерывании.

Типа delay_counter в задержке:

void Delay (int delay)
{ delay_counter =delay;
for (;;)
{ if (!delay_counter) return; }
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 15 2009, 18:04
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(D1ma @ Nov 14 2009, 18:58) *
обясните , пожалуйста, толково как этим и где пользоваться и какой смысл такого обяв.. в даном примере
Поясняю. Какой код оптимизатор может породить для этого участка без volatile?
Ответ:
1) загрузить в память по адресу a число 11.
Что он делает с квалификатором volatile:
1) Загрузить в память по адресу a число 5
2) Считать содержимое памяти по адресу a
3) Прибавить к полученному значению 6
4) Записать полученный результат по адресу a.
С точки зрения скорости и/или размера кода первый вариант явно оптимальнее. Но ведь какое-то прерывание может ожидать в этой ячейке значение 5, а такого момента просто никогда не произойдет. Или по вашей задумке прерывание должно изменить a между записью в него 5 и чтением для сложения - без volatile результат будет совершенно другим.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 15 2009, 18:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Moderator:
Автору - настоятельно рекомендую пользоваться поиском хотя-бы по форуму. На все дежурные вопросы ответы уже есть.
http://www.google.lv/search?hl=ru&clie...mp;aq=f&oq=


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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