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

 
 
> Проблема с inline в EWAVR, Оптимизация Function inlining режет код
Makki
сообщение Sep 24 2013, 17:45
Сообщение #1


Участник
*

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



Такая ситуация: имеем несколько вложенных друг в друга функций: main( level1 (level2 ())), полная оптимизация по скорости.
При компиляции код функций уровня вложенности больше 2 просто исчезает (в дизассемблере смотрел), хоть просто возвращай переменную, хоть что угодно.
Выполняется main( level1 ()) без вызова level2 ()
Убил часа 4 на поиск причины. Пока не добрался до function inlining.
Отключил function inlining, все остальное так и оставил - помогло.

Кто-нибудь знает, что это такое было???

И таки да, у меня Kickstart на 4 кб.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Sep 25 2013, 12:08
Сообщение #2


Гуру
******

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



modbus_frame_check() в том виде, в котором он приведен в примере, не может вернуть 0 ни при каких условиях. Вызов исключен законно.
Go to the top of the page
 
+Quote Post
Makki
сообщение Sep 25 2013, 12:20
Сообщение #3


Участник
*

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



Естественно об этом я тоже думал. Вот такой код:

CODE

//Функция проверки кадра
//Возвращает 0 если все ОК
//#pragma inline=forced
unsigned char modbus_frame_check(void)
{
//Ошибки физического уровня (в usart0_received)
if((usart_flags&(1<<mberr))!=0){return 1;}
//Длина кадра (не менее 4 символов)
unsigned char num=usart_count;
if(num<4){return 2;}
//Контрольная сумма
num-=2;
//if(crc16(&usart_stack[0],num)!=(usart_stack[num]+(usart_stack[num+1]<<8))){return 3;}
//
return 0;//num;
}


Генерит то же самое:

CODE
@00000096: modbus_slave_routine
285: ClearBits(usart_flags,(1<<t15)|(1<<t35)|(1<<mberr)|(1<<rxok));
+00000096: B100 IN R16,0x00 In from I/O location
+00000097: 700F ANDI R16,0x0F Logical AND with immediate
+00000098: B900 OUT 0x00,R16 Out to I/O location
286: TCNT1H=0;
+00000099: E000 LDI R16,0x00 Load immediate
+0000009A: BD0D OUT 0x2D,R16 Out to I/O location
287: TCNT1L=0;
+0000009B: BD0C OUT 0x2C,R16 Out to I/O location
288: TCCR1B=(1<<WGM12)|(0<<CS12)|(0<<CS11)|(0<<CS10);
+0000009C: E008 LDI R16,0x08 Load immediate
+0000009D: BD0E OUT 0x2E,R16 Out to I/O location
292: while((usart_flags&(1<<rxok))==0){;}
+0000009E: 9B02 SBIS 0x00,2 Skip if bit in I/O register set
+0000009F: CFFE RJMP PC-0x0001 Relative jump
294: while((usart_flags&(1<<t15))==0){;}
+000000A0: 9B00 SBIS 0x00,0 Skip if bit in I/O register set
+000000A1: CFFE RJMP PC-0x0001 Relative jump
296: if(modbus_frame_check()!=0){goto start;}
+000000A2: B100 IN R16,0x00 In from I/O location
+000000A3: CFF2 RJMP PC-0x000D Relative jump
Go to the top of the page
 
+Quote Post



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

 


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


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