AHTOXA 15 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Во всех ассемблерных исходниках, которые мне встречались, вызов внешней функции делался так: LDR R1, =os_context_switch_hook BLX R1 Но недавно я наткнулся на сайт, где прочитал, что это делается проще: bl os_context_switch_hook Первый вариант компилится во что-то вроде: ldr r1, [pc, #76] blx r1 ... .word 0x080024a5 , а второй вариант - в bl 80024a5 . Второй вариант короче, быстрее, и не сбивает конвейер. (С ним переключатель контекста scmRTOS выполняется за 60 тактов вместо 70-ти). Внимание, вопрос: почему везде используется первый вариант? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 132 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Внимание, вопрос: почему везде используется первый вариант?1) Наследие всяких tdmi. Функция может быть как ARM, так и THUMB и при переходе надо переключать режим, что и делает BLX. 2) "Дальнобойность" BL ограничена (например, может не хватить для прыжка флеш->ОЗУ), в то время как BLX перекрывает все адресное пространство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Я так и думал, что по привычке. Что касаемо дальнобойности, то, имхо, её потеря стоит такого выигрыша в быстродействии (60 тактов вместо 70-ти). (Тем более, что GCC всё равно лепит свои дурацкие veneer-ы при вызове RAM-функций, так что BL ROM_TO_RAM нам пока не грозит:) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Проверил на примере 1-Eventflag. Старый вариант обеспечивает передачу управления за 2.7мкс, новый - за 2.55. Итого выигрыш = 5.5%, очень недурно:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться