MOV PC,Rx : Эльфостроение : Форум |
den_po: |
30.07.09, 14:08 |
есть у иаровского компилятора c/c++ одна неприятная фича, заключается она в оптимизации. сама по себе оптимизация это хорошо, но вот в данном конкретном случае может давать весьма неприятный результат. всё дело в оптимизации переходов. небольшой пример. Код: typedef void (*FN)(); void a(FN fn) { fn(); } тут внутри функции a идёт вызов функции по указателю. компилируется такой код в такое: Код: // 7 void a(FN fn) // 8 { // 9 fn(); ??a: MOV PC,R0 ;; tailcall CFI EndBlock cfiBlock1 // 10 } команда MOV PC,R0 плохая, на процессорах наших телефонов она вызывает ребуты. да, не всегда, но получить проблемы более чем легко. особенно напрягает, когда ребуты случаются в разных местах, найти причину сбоев становится очень тяжело. предлагаю вашему вниманию патчи для компиляторов IAR C/C++ 4.41 и 4.42. после применения патча компилятор начинает генерировать такой код: Код: // 7 void a(FN fn) // 8 { // 9 fn(); ??a: BX R0 ;; tailcall CFI EndBlock cfiBlock1 // 10 } команда заменяется только в коде, компилируемом вами. если вы используете стандартные иаровские библиотеки, в ваш код могут попасть MOV, потому что эти библиотеки не собираются заново, а линкуются уже собранные. в общем, если в вашем эльфе окажется MOV PC, Rx (смотреть в генерируемых листингах), и из-за этой команды у вас проблемы, будем думать. вероятно, придётся менять команды в пост-билде. Прикрепленный к сообщению файл: iar_tailcall_patch.zip (4.82 kb; 184 hits) Скачать файл iar_tailcall_patch2.zip (2.45 kb; 271 hits) Скачать файл |
den_po: |
18.08.09, 01:22 |
вторая версия. только для 4.42 (ну не пользуюсь я 4.41). ещё больше замен. иногда ребут бывает при смене режимов thumb->arm, если возврат из функции делается командой POP {..., PC}, причём, если код в эльфе мы исправить можем, в прошивке оно всё равно останется неисправленным. не знаю, что с таким делать. свою проблему я решил использованием thumb, но эльфы активно используют swi, там тумбой не обойтись. |
BigHercules: |
05.10.10, 16:39 |
den_po писал: вторая версия. только для 4.42 Привет! А можно сделять патч для компилятора версии 4.42.1.501 ? Заранее спасибо. |
den_po: |
05.10.10, 16:45 |
BigHercules, это надо экзешник iccarm.exe надыбать и портировать |
BigHercules: |
05.10.10, 16:56 |
den_po пишет: BigHercules, это надо экзешник iccarm.exe надыбать и портировать Вот портировал для компилятора версии 4.42.1.501 [ Редактировано BigHercules в 14.10.10 18:12 ] |
IDOL1234: |
01.11.11, 12:04 |
А почему ребутит-то? Да ещё и не всегда? Причина известна? А то на какое-то колдунство похоже.. |
awg: |
01.11.11, 13:19 |
ты чото очень много вопросов задаешь, не выкурив пару тройку сигарет, пытая гугл и т.д. и т.п. что за напор такой, от твоих вопросов подташнивать начинает )) |
IDOL1234: |
02.11.11, 00:30 |
Хм. Не курю. patch_iar4.42.1.501_v2.zip сообщает, что IAR не найден iar_tailcall_patch2.zip, согласно моему антивирусу, является трояном. Можно ли как-нибудь избавиться от этого магического ребута, не прибегая к переустановке IAR и к помощи вирусов? |
awg: |
02.11.11, 13:17 |
ну вот как так можно? я удивляюсь! но коменс |
URL этой темы: https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=4182 © 2005-2018 supertrubka.org |