|
новая проблема Оптимизация компилятора IAR |
|
|
|
Mar 21 2007, 20:03
|
Частый гость
 
Группа: Новичок
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Mar 22 2007, 19:04
|
Частый гость
 
Группа: Новичок
Сообщений: 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();
|
|
|
|
|
Mar 22 2007, 19:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Alex ma @ Mar 22 2007, 21:04)  Error[Pe118]: a void function may not return a value E:\Documens\Alex\Ìîè äîêóìåíòû\MUKS-01\MUKS01v02\task.c 10 это на return(); Все верно ошибку компилятор выдает. "Пустая" функция не может возвращать значение. И все же стандартизованный способ прерывания цикла это оператор break.  В крайнем случае goto на метку вне цикла.
|
|
|
|
Сообщений в этой теме
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  singlskv Цитата(Alex ma @ Mar 22 2007, 19:04) Erro... Mar 23 2007, 00:17   zltigo Цитата(singlskv @ Mar 22 2007, 23:17) при... Mar 23 2007, 00:50    singlskv Цитата(zltigo @ Mar 23 2007, 00:50) Легко... Mar 23 2007, 01:26     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     Rst7 Цитата(singlskv @ Mar 23 2007, 00:26) got... Mar 23 2007, 09:11 _Bill Цитата(Alex ma @ Mar 21 2007, 20:03) Есть... Mar 23 2007, 13:25 Rst7 Цитата12 или 22 байта ?а если будут множественное ... Mar 24 2007, 10:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|