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 iar_tailcall_patch.zip (4.82 kb; 184 hits) Скачать файл
iar_tailcall_patch2.zip 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 ]

Прикрепленный к сообщению файл:

patch_iar4.42.1.501_v2.zip patch_iar4.42.1.501_v2.zip (591.52 kb; 68 hits) Скачать файл

 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