Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM ассемблер, вызов внешней функции.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
AHTOXA
Во всех ассемблерных исходниках, которые мне встречались, вызов внешней функции делался так:
Код
    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-ти).
Внимание, вопрос: почему везде используется первый вариант?
Сергей Борщ
QUOTE (AHTOXA @ Apr 11 2012, 12:28) *
Внимание, вопрос: почему везде используется первый вариант?
1) Наследие всяких tdmi. Функция может быть как ARM, так и THUMB и при переходе надо переключать режим, что и делает BLX.
2) "Дальнобойность" BL ограничена (например, может не хватить для прыжка флеш->ОЗУ), в то время как BLX перекрывает все адресное пространство.
AHTOXA
Я так и думал, что по привычке.
Что касаемо дальнобойности, то, имхо, её потеря стоит такого выигрыша в быстродействии (60 тактов вместо 70-ти).
(Тем более, что GCC всё равно лепит свои дурацкие veneer-ы при вызове RAM-функций, так что BL ROM_TO_RAM нам пока не грозитsm.gif )
AHTOXA
Проверил на примере 1-Eventflag. Старый вариант обеспечивает передачу управления за 2.7мкс, новый - за 2.55. Итого выигрыш = 5.5%, очень недурноsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.