jcxz 217 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба 54 минуты назад, Kabdim сказал: А IAR не умеет lto с ассемблерными вставками? Никогда не использовал inline asm - не умею его правильно готовить. Пробовал его так: inline u32 AtomicSwp(u32 volatile *ptr, u32 arg) { u32 i; asm( "p1: LDREX %0, [%1] \n" " STREX R3, %2, [%1]\n" " CMP R3, #0 \n" " BNE p1 " : "=r" (i) : "r" (ptr), "r" (arg) : "R3", "cc"); return i; } Но при компиляции IAR падает с сообщением: Tool Internal Error: Internal Error: [CoreUtil/General]: 1: bad byte count for graph (184 vs. 186) Internal Error: [CoreUtil/General]: 1: bad byte count for graph (184 vs. 186) Не понимаю - в чём проблема? Если Вы имеете опыт с IAR-ским встроенным асмом - подскажите как его правильно приготовить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба Попробовал добавить volatile возвращаемому параметру: inline u32 volatile AtomicSwp2(u32 volatile *ptr, u32 arg) { u32 i; do i = __LDREX(ptr); while (__STREX(arg, ptr)); return i; } Получил немного отличающийся результат, чуть лучше, но лишние команды всё равно все в наличии, хоть они теперь и ушли за пределы цикла: 0xF104 0x010C ADD R1,R4,#+12 0x2200 MOVS R2,#+0 ??ConfigExec_7: 0xF104 0x000C ADD R0,R4,#+12 0xE850 0x0F00 LDREX R0,[R0] 0xE841 0x2300 STREX R3,R2,[R1] 0x2B00 CMP R3,#+0 0xD1F7 BNE.N ??ConfigExec_7 0x9000 STR R0,[SP, #+0] 0x9800 LDR R0,[SP, #+0] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба 23 минуты назад, jcxz сказал: Не понимаю - в чём проблема? Читайте по губам: Internal Error. Программисты накосячили. Пишите в спортлототехподдержку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба Хех! Получилось!!! Поборол этот inline ассемблер. Сделал так: inline u32 AtomicSwp(u32 volatile *ptr, u32 arg) { u32 i; asm( "p01: LDREX %0, [%1] \n" " STREX R3, %2, [%1]\n" " CMP R3, #0 \n" " BNE p01 " : "=&r"(i) : "r"(ptr), "r"(arg) : "R3", "cc"); return i; } Что даёт результат на полной оптимизации: 0xF104 0x010C ADD R1,R4,#+12 0x2200 MOVS R2,#+0 ??p01: 0xE851 0x0F00 LDREX R0, [R1] 0xE841 0x2300 STREX R3, R2, [R1] 0x2B00 CMP R3, #0 0xD1F9 BNE ??p01 То, что доктор прописал! 2 минуты назад, Сергей Борщ сказал: Читайте по губам: Internal Error. Программисты накосячили. Я это понимаю. Но от этого не легче. Уже нашёл причину: ему не нравилось имя метки "p1". Заменил на "p01" и жизнь наладилась. PS: Получается, что нужно все эти мои функции теперь переписать на встроенный асм. Никогда раньше его не использовал - не знаю какие могут быть подводные камни? (кроме проблем переноса кода на другой компилятор). Несколько настораживает фраза из мануала IAR: "The compiler’s various optimizations will disregard any effects of the inline statements, which will not be optimized at all." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба Переписал функцию так: inline u32 AtomicSwp(u32 volatile *ptr, u32 arg) { u32 r, i; asm( "p01: LDREX %0, [%2] \n" " STREX %1, %3, [%2]\n" " CMP %1, #0 \n" " BNE p01 " : "=&r"(r), "=&r"(i) : "r"(ptr), "r"(arg) : "cc", "memory"); i = i; return r; } Что логически корректнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 26 февраля, 2019 Опубликовано 26 февраля, 2019 · Жалоба 32 минуты назад, jcxz сказал: Уже нашёл причину: ему не нравилось имя метки "p1" Возможно это не причина, а катализатор. А компилятор дожен выдавать вменяемое сообщение об ошибке, так что Intrnal Error надо в любом случае обязательно отправлять в техподдержку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба Только что получил из поддержки IAR письмо о том что мой багрепорт о кривой работе оптимизатора с LDREX/STREX принят и перенаправлен в development team. Ждём новой версии с исправленным багом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба 1 hour ago, jcxz said: Только что получил из поддержки IAR письмо о том что мой багрепорт о кривой работе оптимизатора с LDREX/STREX принят и перенаправлен в development team. Ждём новой версии с исправленным багом Или раньше не обращал внимания, или IAR стал чуть чаще баги выпускать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба 39 минут назад, haker_fox сказал: Или раньше не обращал внимания, или IAR стал чуть чаще баги выпускать... Этот баг похоже был давно. Он есть и в 7.80.4 и в поддержке протестили последнюю версию 8.32.3 - там тоже есть. Мне вот что удивительно: Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба 26 minutes ago, jcxz said: Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX? Я не использую. К сожалению систему команд начал изучать тщательно относительно недавно. А так - критические секции) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба Используем Просто, я, например, по работе пишу в Keil, а в нем описанного действительно некорректного поведения, к счастью, замечено не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 3 марта, 2019 Опубликовано 3 марта, 2019 · Жалоба В 01.03.2019 в 19:36, jcxz сказал: Мне вот что удивительно: Неужто никто не использует механизм эксклюзивного доступа LDREX/STREX? В gcc мне такого тоже не встречалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 3 марта, 2019 Опубликовано 3 марта, 2019 · Жалоба Везде свои баги. Вопрос был к пользователям IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба Итак - багу официально присвоено имя: EWARM-6716. Теперь это не какой-то там безымянный баг. Ждём новой версии IAR с фиксом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба Будет повод обновиться наконец? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться