GetSmart 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Недавно в теме "typedef" обнаружил нечто. Сначала думал у меня руки кривые. Потом создал простейший проект в IAR EWARM 4.20 и испугался не на шутку. Потому как уже много проектов делал на ИАРе с максимальной оптимизацией. Можно сказать, на кон поставлена моя репутация (:)). Ведь все шишки от заказчиков повалятся на меня, а не на IAR. Вобщем, прилагаю скриншот проекта. Ничего особенного. Всё что надо - видно на экране. Ассемблерные вставки применял в качестве volatile кода, чтобы наглядно и компилер не выкинул. Разумеется их можно заменить на любые другие действия. Всё чудесно работает на низких и средних оптимизациях, но не на максимальных (обоих). Самое интересное выделено красным. Зелёная полоса - начало main(). Проект тоже прикрепил на всякий пожарный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Картинки какие-то, ну очень цветные... Предпочитаю листинги читать. 17 void main() 18 { \ main: \ 00000000 30402DE9 PUSH {R4,R5,LR} 19 init(); \ 00000004 ........ BL init 20 if (cnt >= 1024) asm("MOV R14,R15"); \ 00000008 ........ LDR R4,??DataTable2 ;; cnt \ 0000000C 000094E5 LDR R0,[R4, #+0] \ 00000010 400E50E3 CMP R0,#+1024 \ 00000014 010000BA BLT ??main_0 \ 00000018 0FE0A0E1 MOV R14,R15 \ 0000001C 000000EA B ??main_1 21 else asm("MOV R15,R14"); \ ??main_0: \ 00000020 0EF0A0E1 MOV R15,R14 22 cnt = 1024; \ ??main_1: \ 00000024 400EA0E3 MOV R0,#+1024 \ 00000028 000084E5 STR R0,[R4, #+0] 23 stop(); \ 0000002C ........ LDR R5,??DataTable3 ;; `?<Constant "\\375\\362\\356 \\352\\356\\355\\345\\366\\` \ ??main_2: \ 00000030 0510A0E1 MOV R1,R5 \ 00000034 040084E2 ADD R0,R4,#+4 \ 00000038 ........ _BLF sprintf,??sprintf??rA \ 0000003C FBFFFFEA B ??main_2 24 } Это правда 4.42, и раритетных не коллекционирую, посему рассмотреть подробно не могу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 27 мая, 2008 Опубликовано 27 мая, 2008 (изменено) · Жалоба А вот мой: \ In segment CODE, align 4, keep-with-next \ 00000000 CODE32 17 void main() 18 { \ main: \ 00000000 30402DE9 STMDB SP!,{R4,R5,LR} ;; Push 19 init(); \ 00000004 ........ BL init 20 if (cnt >= 1024) asm("MOV R14,R15"); \ 00000008 ........ LDR R4,??DataTable2 ;; cnt \ 0000000C 000094E5 LDR R0,[R4, #+0] \ 00000010 0FE0A0E1 MOV R14,R15 21 else asm("MOV R15,R14"); \ 00000014 0EF0A0E1 MOV R15,R14 22 cnt = 1024; \ 00000018 400EA0E3 MOV R0,#+0x400 \ 0000001C 000084E5 STR R0,[R4, #+0] 23 stop(); \ 00000020 ........ LDR R5,??DataTable3 ;; `?<Constant "\\375\\362\\356 \\352\\356\\355\\345\\366\\` \ ??main_0: \ 00000024 0510A0E1 MOV R1,R5 \ 00000028 040084E2 ADD R0,R4,#+0x4 \ 0000002C ........ _BLF sprintf,sprintf??rA \ 00000030 FBFFFFEA B ??main_0 24 } Изменено 27 мая, 2008 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба А вот мой: А сишный исходник для чего похерили??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба А сишный исходник для чего похерили???Я их просто не включил. Вот архив вместе с листингами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Вот, что в теме "typedef" меня удивило: typedef float real; const double tmp = 1.0/3; if (*(real *)&tmp == tmp) { asm("NOP"); } else { asm("NOP"); asm("NOP"); } Это я вставил в начало процедуры (любой) в одном моём проекте. Смысл был в том, чтобы отличить тип, допустим float от double (либо на этапе компиляции, либо в рунтайме) и выполнить одно из действий. Там при приведении типа в real можно вместо него сразу float поставить. Не суть. Суть в том, что опять оба варианта в IFе выполняются на EWARM 4.20. Как-то рабочий проект из 4.20 скомпилил на 4.30 и он не заработал. Тоже на максимуме оптимизации. Мне сейчас очень интересно почему :) Я тогда ещё подумал, что новые версии глючные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Как-то рабочий проект из 4.20 скомпилил на 4.30 и он не заработал. Тоже на максимуме оптимизации. Ну по этому поводу могу сказать только то, что никогда свои исходники без макимальных оптимизаций не компилировал и всегда пользуюсь свежим IAR. На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал. По нынешним временам вообще лучше 5 версией пользоваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
YAM 0 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба Согласен с zltigo, перешел на IAR после "голимости" Keil-a для 51 семейства. Сейчас использую 5-е версии для AVR и ARM. Всегда использую полную оптимизацию по скорости или, где требуется по размеру. Не встречал еще ни одной ошибки, связанной с компилятором... Только свои ручки :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба YAM, ну, вот, к примеру ) http://electronix.ru/forum/index.php?showtopic=44643 проявляется именно при макс. оптимизации. Ещё сталкивался с неверными результатами вычислений с плавающей точкой, причём тот же код корректно работал в Keil. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба YAM, ну, вот, к примеру ) Дело не в примерах - примеров можно пачками посмотреть в списках исправленных багов в каждой новой версии IAR, дело в том, насколько стиль написания провоцирует натыкания на грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба Дело не в примерах ... дело в том, насколько стиль написания провоцирует натыкания на грабли.У меня в примерах что, какой-то неправильный стиль написания?На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал.ИМХО надо создать FAQ по "неправильным" стилям написания :) Кстати, какая версия-то IARa была? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба У меня в примерах что, какой-то неправильный стиль написания? Трудно сказать, я не имею старых IAR-ов, посему не могу глянуть, что будет, например, без столь не любимых мною asm(), что будет при более общирном коде, а не исскуственной оберточке. ИМХО надо создать FAQ по "неправильным" стилям написания Не берусь :( стиль складывался стихийно с набиванием реальных шишек на многиз имногих реально еще глюковатых компиляторах начиная с середины 80x. Кстати, какая версия-то IARa была? Какая-то свежайшая трехлетней давности. Могу по списку исправленных багов найти, а нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться