|
IAR 6.4 Optimization Bug, изменение работы алгоритма при включении оптимизации |
|
|
|
Oct 3 2012, 05:50
|
Местный
  
Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659

|
Здравствуйте. Была в проекте написана простая функция преобразования числа uint32 в строку, без оптимизации работает, при включении Optimization/High/Speed и наличии опции Function Inlining вместо всего числа в строку заносит только последнюю цифру. Функцию конечно поправил так чтоб работала и при оптимизации но как то все равно неприятно, где еще ждать косяков. сам код: CODE // ///8************************************************* // перевод числа i в строку символов в buf длиной = maxlen uint32_t Int2Str(uint32_t i,uint8_t *buf,uint32_t maxlen){ uint32_t j; uint32_t k,l; uint32_t idx;
idx=0; // используется только для преобразования даты if((i<10000)&&(maxlen)&&(maxlen<=4)){ for(j=(maxlen-1);j;j--){ buf[idx]='0'; k=Pow10(j); for(l=9;l;l--){ if(i>=k){ i-=k; buf[idx]++; }else l=1; // выход из цикла } idx++; } buf[idx]='0'+i; idx++; } // buf[idx]=0; return idx; }
///8************************************************* uint32_t Pow10(uint32_t p){// возвращает 10^p uint32_t ret=1; if(p>8)ret=0; else{ for(;p;p--)ret*=10; } return ret; }
Отдельный проект с этими функциями в IAR:
iarbug.rar ( 15.32 килобайт )
Кол-во скачиваний: 76Было обнаружено на STM32F103, проверено наличие бага и для LPC2378 Спасибо.
|
|
|
|
|
 |
Ответов
|
Oct 3 2012, 11:47
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Может быть, кому-то захочется покопаться: Исходник (орфография и пунктуация автора сохранены): CODE #include <ctype.h> #include <stdint.h> #include <intrinsics.h>
uint32_t Int2Str(uint32_t i,uint8_t *buf,uint32_t maxlen); uint32_t Pow10(uint32_t p);
volatile uint8_t buf[5];
void main(void){ // Int2Str(777,buf,3); while(1){ Int2Str(777,(uint8_t*)buf,3); buf[0]++; buf[2]++; buf[4]++; } }
///8************************************************* // перевод числа i в строку символов в buf длиной = maxlen uint32_t Int2Str(uint32_t i,uint8_t *buf,uint32_t maxlen){ uint32_t j; uint32_t k,l; uint32_t idx;
idx=0; // используется только для преобразования даты if((i<10000)&&(maxlen)&&(maxlen<=4)){ for(j=(maxlen-1);j;j--){ buf[idx]='0'; k=Pow10(j); for(l=9;l;l--){ if(i>=k){ i-=k; buf[idx]++; }else l=1; // выход из цикла } idx++; } buf[idx]='0'+i; idx++; } // buf[idx]=0; return idx; }
/* // корректно оптимизируемый код uint32_t Int2Str(uint32_t i,uint8_t *buf,uint32_t maxlen){ uint32_t j; uint32_t k,l; uint32_t idx;
idx=0; // используется только для преобразования даты if((i<10000)&&(maxlen)&&(maxlen<=4)){ for(j=(maxlen-1);j;j--){ *buf='0'; k=Pow10(j); for(l=9;l;l--){ if(i>=k){ i-=k; (*buf)++; }else l=1; // выход из цикла } buf++; } *buf='0'+i; idx++; } // buf[idx]=0; return idx; }
*/
///8************************************************* uint32_t Pow10(uint32_t p){// возвращает 10^p uint32_t ret=1; if(p>8)ret=0; else{ for(;p;p--)ret*=10; } return ret; }
Дизассемблер: CODE void main(void){ main: 0x2f4: 0x480f LDR.N R0, ??DataTable1 ; buf 0x2f6: 0xe00f B.N ??main_0 ; 0x318 }else l=1; // auoia ec oeeea ??main_1: 0x2f8: 0x2601 MOVS R6, #1 for(l=9;l;l--){ ??main_2: 0x2fa: 0x1e76 SUBS R6, R6, #1 0x2fc: 0xd116 BNE.N ??main_3 ; 0x32c for(j=(maxlen-1);j;j--){ 0x2fe: 0x1e64 SUBS R4, R4, #1 for(j=(maxlen-1);j;j--){ 0x300: 0xd10c BNE.N ??main_4 ; 0x31c buf[idx]='0'+i; 0x302: 0x3330 ADDS R3, R3, #48 ; 0x30 0x304: 0x7083 STRB R3, [R0, #0x2] return idx; 0x306: 0x7803 LDRB R3, [R0] 0x308: 0x1c5b ADDS R3, R3, #1 0x30a: 0x7003 STRB R3, [R0] 0x30c: 0x7883 LDRB R3, [R0, #0x2] 0x30e: 0x1c5b ADDS R3, R3, #1 0x310: 0x7083 STRB R3, [R0, #0x2] 0x312: 0x7903 LDRB R3, [R0, #0x4] 0x314: 0x1c5b ADDS R3, R3, #1 0x316: 0x7103 STRB R3, [R0, #0x4] ??main_0: 0x318: 0x4b07 LDR.N R3, ??DataTable1_1 ; 0x309 (777) for(j=(maxlen-1);j;j--){ 0x31a: 0x2402 MOVS R4, #2 uint32_t ret=1; ??main_4: 0x31c: 0x2501 MOVS R5, #1 if(p>8)ret=0; 0x31e: 0x0026 MOVS R6, R4 for(;p;p--)ret*=10; ??main_5: 0x320: 0x00af LSLS R7, R5, #2 0x322: 0x197d ADDS R5, R7, R5 0x324: 0x006d LSLS R5, R5, #1 for(;p;p--)ret*=10; 0x326: 0x1e76 SUBS R6, R6, #1 for(;p;p--)ret*=10; 0x328: 0xd1fa BNE.N ??main_5 ; 0x320 for(l=9;l;l--){ 0x32a: 0x2609 MOVS R6, #9 if(i>=k){ ??main_3: 0x32c: 0x42ab CMP R3, R5 0x32e: 0xd3e3 BCC.N ??main_1 ; 0x2f8 i-=k; 0x330: 0x1b5b SUBS R3, R3, R5 buf[idx]++; 0x332: 0xe7e2 B.N ??main_2 ; 0x2fa ??DataTable1: 0x334: 0x40000120 DC32 buf ??DataTable1_1: 0x338: 0x00000309 DC32 777 ; ' ...' exit: 0x33c: 0xb580 PUSH {R7, LR} 0x33e: 0xf000 0xf825 BL ?Veneer (4) for _exit ; 0x38c 0x342: 0xbc09 POP {R0, R3} 0x344: 0x4718 BX R3
Да, код заполняет в буфере только позицию buf[2] = '7'.
|
|
|
|
Сообщений в этой теме
Sagittarius IAR 6.4 Optimization Bug Oct 3 2012, 05:50 Lotor Что Вы хотели донести до общественности? Правильне... Oct 3 2012, 06:01 Sagittarius Цитата(Lotor @ Oct 3 2012, 10:01) Что Вы ... Oct 3 2012, 06:17  Lotor Цитата(Sagittarius @ Oct 3 2012, 10:17) 1... Oct 3 2012, 06:50 VslavX Цитата(Sagittarius @ Oct 3 2012, 08:50) Б... Oct 3 2012, 06:55 Sagittarius Цитата(VslavX @ Oct 3 2012, 10:55) Вы мен... Oct 3 2012, 07:43  Lotor Цитата(Sagittarius @ Oct 3 2012, 11:43) э... Oct 3 2012, 08:31  VslavX Цитата(Sagittarius @ Oct 3 2012, 10:43) Р... Oct 3 2012, 09:01 scifi Кстати, и мне интересно. Без доказательств всё это... Oct 3 2012, 10:14 Sagittarius в архиве проект под IAR, оптимизация включена. Зап... Oct 3 2012, 11:21 KRS Так вы бы листинг и привели с указанием ошибки... Oct 3 2012, 11:44 KRS Видно что
buf[idx]++;
компилятор выкинул
Кстати е... Oct 3 2012, 12:30 chernenko Может я не то что-то делаю, но у меня на 6.10 (дру... Oct 3 2012, 12:40 KRS так писали про 6.4
у меня
IAR ANSI C/C++ Compiler... Oct 3 2012, 12:52 chernenko Цитата(KRS @ Oct 3 2012, 16:52) так писал... Oct 3 2012, 13:03 Lotor Таки глюк компилятора...
PS: Как действовать авто... Oct 3 2012, 13:42 KRS а новый компилер 6.40.4 (кажется) кто нибудь испол... Oct 3 2012, 14:21 Sagittarius Цитата(KRS @ Oct 3 2012, 17:21) а новый к... Oct 4 2012, 07:24 KRS Глючат именно циклы с предусловием (и не только ци... Oct 4 2012, 07:29 VslavX Версия 5.41 - генерирует нормально. Мда, никак оно... Oct 4 2012, 07:38 grisha_scorpion Используйте квалификатор volatile. И будет вам сча... Oct 10 2012, 07:33 Сергей Борщ QUOTE (grisha_scorpion @ Oct 10 2012, 10... Oct 10 2012, 08:04  grisha_scorpion Цитата(Сергей Борщ @ Oct 10 2012, 12:04) ... Oct 10 2012, 10:58   scifi Цитата(grisha_scorpion @ Oct 10 2012, 14... Oct 10 2012, 11:09   Сергей Борщ QUOTE (grisha_scorpion @ Oct 10 2012, 13... Oct 10 2012, 12:55 KRS кстати с volatile тоже не все в порядке!
при ц... Oct 10 2012, 18:45 scifi Цитата(KRS @ Oct 10 2012, 22:45) кстати с... Oct 10 2012, 19:26 MrAlex а что уже можно тип не указывать? только unsigned? Oct 11 2012, 08:35 scifi Цитата(MrAlex @ Oct 11 2012, 12:35) а что... Oct 11 2012, 08:47 KRS В новом IAR 6.40.5
компилятор
IAR ANSI C/C++ Compi... Oct 15 2012, 10:44 Andy Mozzhevilov Цитата(KRS @ Oct 15 2012, 14:44) В новом ... Oct 15 2012, 10:51  KRS Цитата(Andy Mozzhevilov @ Oct 15 2012, 14... Oct 15 2012, 13:18   ig_z QUOTE (KRS @ Oct 15 2012, 16:18) ЕМНИП ра... Oct 15 2012, 13:31    Dog Pawlowa Цитата(ig_z @ Oct 15 2012, 16:31) Не знаю... Oct 17 2012, 06:51     jcxz Если кто отправлять будет, то напишите до кучи и п... Oct 19 2012, 04:59      Andy Mozzhevilov Цитата(jcxz @ Oct 19 2012, 08:59) Если кт... Oct 19 2012, 05:14       jcxz Цитата(Andy Mozzhevilov @ Oct 19 2012, 11... Oct 19 2012, 06:43        IgorKossak Цитата(jcxz @ Oct 19 2012, 09:43) Если бы... Oct 19 2012, 07:31         jcxz При дальнейшем уменьшении проблемной функции, баг ... Oct 19 2012, 12:21      Sagittarius Цитата(jcxz @ Oct 19 2012, 08:59) ЗЫ: Про... Oct 22 2012, 06:21 Andy Mozzhevilov Я достаточно давно ловил баг еще в какой-то 4-й ве... Oct 15 2012, 16:03 KRS Про бак IAR так и не узнал, по крайней мере в
V6.... Nov 13 2012, 06:30 Nixon А в новой, 6.50.2 версии он не вылечен? Dec 24 2012, 14:19 KRS Цитата(Nixon @ Dec 24 2012, 18:19) А в но... Dec 24 2012, 18:48 MK2 Еще один возможно прикол версии 6.4
Кодstatic clas... Jan 30 2013, 10:07 Сергей Борщ QUOTE (MK2 @ Jan 30 2013, 12:07) подобное... Jan 30 2013, 10:19  MK2 Цитата(Сергей Борщ @ Jan 30 2013, 13:19) ... Jan 30 2013, 11:45   zhz В версии 6.50.5 баг с оптимизацией вроде бы исправ... Apr 17 2013, 23:48    jcxz Цитата(zhz @ Apr 18 2013, 05:48) В версии... Apr 18 2013, 01:42     jcxz И точно!!! Мой баг исправили, о котор... Apr 18 2013, 04:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|