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

 
 
> новая проблема Оптимизация компилятора IAR
Alex ma
сообщение Mar 21 2007, 20:03
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Есть глобальная структура с 4 переменными которые используются во функции MiDI
По адресу 01F4.

Есть функция:
void MiDI(void){
while(1){
здесь код.
ret //выход
};
};

Данная функция вызывается из другого места по указателю на нее.
Выполнив нужные действия выходим из нее, потом возвращаемся обратно, при минимальной оптимизации все нормально вот асм:
4: void MiDI (void){
+000005EF: C020 RJMP PC+0x0021 Relative jump

Но стоит повысить оптимизацию так вот получается вот что асм
4: void MiDI (void){
+00000444: 93BA ST -Y,R27 Store indirect and predecrement
+00000445: 93AA ST -Y,R26 Store indirect and predecrement
+00000446: EFA4 LDI R26,0xF4 Load immediate
+00000447: E0B1 LDI R27,0x01 Load immediate
+00000448: C020 RJMP PC+0x0021 Relative jump

СОХРАНЯЕТ В СТЕКЕ ДАННЫХ регистры R27, R26!
Он думает цикл бесконечный а, я выхожу из него ! по ret (макрос), и происходит потеря данных, ведь я не восстанавливаю из стека данных.
Как компилятор отучить делать вот так
+00000444: 93BA ST -Y,R27 Store indirect and predecrement
+00000445: 93AA ST -Y,R26 Store indirect and predecrement
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IgorKossak
сообщение Mar 22 2007, 12:45
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Каков смысл городить ret (макрос), если стандартного return(); вполне достаточно для корректного выхода из любого цикла, да и из функции заодно?
Go to the top of the page
 
+Quote Post
Alex ma
сообщение Mar 22 2007, 19:04
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Цитата(IgorKossak @ Mar 22 2007, 14:45) *
Каков смысл городить ret (макрос), если стандартного return(); вполне достаточно для корректного выхода из любого цикла, да и из функции заодно?


Error[Pe118]: a void function may not return a value E:\Documens\Alex\Ìîè äîêóìåíòû\MUKS-01\MUKS01v02\task.c 10
это на return();
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 23 2007, 00:17
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Alex ma @ Mar 22 2007, 19:04) *
Error[Pe118]: a void function may not return a value E:\Documens\Alex\Ìîè äîêóìåíòû\MUKS-01\MUKS01v02\task.c 10
это на return();

А что оно говорит если написать так return; // без скобочек ?

Цитата(rezident @ Mar 22 2007, 19:28) *
Все верно ошибку компилятор выдает. "Пустая" функция не может возвращать значение.
И все же стандартизованный способ прерывания цикла это оператор break. wink.gif В крайнем случае goto на метку вне цикла.

return это вполне валидный способ прекращения цикла,
а вот goto - не всегда
при использовании goto можно легко получать переполнение стека,
если его использовать необдуманно
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 23 2007, 00:50
Сообщение #5


Гуру
******

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



Цитата(singlskv @ Mar 22 2007, 23:17) *
при использовании goto можно легко получать переполнение стека,
если его использовать необдуманно

Легко? Cтрашилка. Никакое необдуманоое и даже преднамеренное "плохое" использование goto не должно приводить к переполнению стека или каким либо другим деструктивным последствиям при сколь-нибудь пригодном для работы компиляторе языка высокого уровня. Потеря оптимальности кода может в некоторых "необдуманных" случаях действительно заметной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 23 2007, 01:26
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Mar 23 2007, 00:50) *
Легко? Cтрашилка. Никакое необдуманоое и даже преднамеренное "плохое" использование goto не должно приводить к переполнению стека или каким либо другим деструктивным последствиям при сколь-нибудь пригодном для работы компиляторе языка высокого уровня. Потеря оптимальности кода может в некоторых "необдуманных" случаях действительно заметной.

goto не возвращает стек в исходное состояние, то есть если переменная была заведена
на стеке то стек будет расходоваться зазря до выхода из функции
ну и в принципе можно нарисовать такую ситуацию когда отведенного стека
просто не хватит
наверное на AVR это не очень актуальная проблемма, но например на
PC легко таким образом организовать переполнение
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 23 2007, 09:11
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(singlskv @ Mar 23 2007, 00:26) *
goto не возвращает стек в исходное состояние, то есть если переменная была заведена
на стеке то стек будет расходоваться зазря до выхода из функции


Дело в том, что это вас интересовать не должно. Компилятор (ИАР особенно) - он грамотный, он посмотрит, как все выполняется, и переменную уберет (или не уберет) из стека в нужный момент. Обычно этот момент - всегда выход из функции, т.к. постоянно дергать стек вперед/назад довольно накладно. Так что пользуйте goto, пользуйте return, break, все будет ок, а вот ассемблеровкий ret поперк - это неправильно в любом случае.

И вообще, правильно написаная программа должна компилироваться с макс. оптимизацией и работать. Если такого не происходит, ищите ошибки у себя (обычное дело - volatile забыли, вот как у вас - ret поперек всадили - это даже не ошибка, это... Ну не хочу плохие слова говорить wink.gif )


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alex ma   новая проблема Оптимизация компилятора IAR   Mar 21 2007, 20:03
- - rezident   Попробуйте выходить по break, а ret поставить посл...   Mar 21 2007, 20:21
|- - Alex ma   Цитата(rezident @ Mar 21 2007, 22:21) Поп...   Mar 21 2007, 21:14
|- - rezident   Цитата(Alex ma @ Mar 22 2007, 21:04) Erro...   Mar 22 2007, 19:28
|- - zltigo   Цитата(singlskv @ Mar 23 2007, 00:26) got...   Mar 23 2007, 09:07
||- - singlskv   Цитата(zltigo @ Mar 23 2007, 09:07) А ret...   Mar 24 2007, 01:06
||- - xemul   Цитата(singlskv @ Mar 24 2007, 01:06) Хор...   Mar 24 2007, 11:29
||- - zltigo   Цитата(singlskv @ Mar 24 2007, 00:06) а е...   Mar 24 2007, 12:32
||- - singlskv   Цитата(zltigo @ Mar 24 2007, 12:32) 1.Доб...   Mar 24 2007, 12:38
||- - zltigo   Цитата(singlskv @ Mar 24 2007, 11:38) ......   Mar 24 2007, 12:59
- - _Bill   Цитата(Alex ma @ Mar 21 2007, 20:03) Есть...   Mar 23 2007, 13:25
- - Rst7   Цитата12 или 22 байта ?а если будут множественное ...   Mar 24 2007, 10:33


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

 


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


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