|
ARM gcc, вызвать THUMB функцию из ROM |
|
|
|
Aug 27 2014, 17:02
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Я что-то запутался... Как мне объявить внешнюю thumb функцию, расположенную по заданному статическому адресу? Я сделал вот так: 1) arm-rom.h Код int rom_func (void* dev_descr, int data); 2) скрипт для линкера Код .... SECTIONS { .... rom_func = 0x123456; } Все тут хорошо, но линкер думает, что rom_func следует исполнять как ARM, а не как THUMB, и генерирует соотв. BLX инстукцию (при вызове из THUMB кода). А как мне указать, что он THUMB?
|
|
|
|
|
Aug 27 2014, 18:23
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Проблему сам решил, через ж. автогеном. Сделал ассемблерный файл rom_funcs.S, внутри которого написал: Код .globl rom_func .thumb_set rom_func, 0x123456 Ну и прилинковал получившийся объектный модуль в общую кучу. А из скрипта линкера убрал указание адреса. В результате вызов из THUMB-кода по BL, что и требовалось. ----- Но вопрос остался - а не через зад, можно? Прямо линкеру указать, что этот символ thumb и имеет такое-то значение?
|
|
|
|
|
Aug 28 2014, 05:58
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(jcxz @ Aug 28 2014, 06:02)  for IAR Спасибо, конечно, но в теме было про gcc. Никаких IAR там быть не может. Это около-линуксовая тема. Обхожу баг ROM-загрузчика AM3517, который не может загрузить из NAND больше 2К кода, если NAND имеет размер страницы больше, чем 2К. Цитата(den_po @ Aug 28 2014, 02:17)  а в качестве адреса указывать адрес функции +1 Проверено, при этом линкер при оптимизации накладывает маску на адрес 0xFFFFFFF8, чем убивает и +1, и если код находится на смещениях +2 (если gcc понимает, что указатель можно соптимизировать в прямой вызов). И генерирует команды перехода BLX... В общем, мимо. Можно, конечно, volatile указатель объявить, но не хочется указатели, хочется прямой вызов сделать корректно (без asm).
|
|
|
|
|
Aug 28 2014, 10:20
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(SM @ Aug 28 2014, 09:58)  Проверено, при этом линкер при оптимизации накладывает маску на адрес 0xFFFFFFF8, чем убивает и +1 И с какой, интересно, стати? Или речь о непосредственном операнде? Тут такое дело, если из арм кода вызывается BLX 0x123456 (обратите внимание - чётно), то оно переключает в тумбу. Может лажанул с кратностью 2, но сути не меняет, чётный адрес в непосредственном операнде BLX переключит режим.
Сообщение отредактировал den_po - Aug 28 2014, 10:32
|
|
|
|
|
Aug 28 2014, 10:36
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(SM @ Aug 27 2014, 21:02)  Я сделал вот так: 1) arm-rom.h Код int rom_func (void* dev_descr, int data); А если так: Код int __attribute__((interfacethumb)) rom_func (void* dev_descr, int data);
|
|
|
|
|
Aug 28 2014, 10:41
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(den_po @ Aug 28 2014, 14:20)  И с какой, интересно, стати? Или речь о непосредственном операнде? О непосредственном. То есть, когда gcc понимает, что указатель можно заоптимизировать до его смерти. При этом линкер, не видя какого-то атрибута, что адрес, куда перейти, относится к thumb режиму, обнуляет ему младшие два бита принудительно, причем без всяких варнингов. Да и ручное прибавление единицы к адресу в указателе, это еще более мощный автоген в ж., чем ассемблерный .thumb_set Цитата(scifi @ Aug 28 2014, 14:36)  А если так: То так: warning: 'interfacethumb' attribute directive ignored [-Wattributes] gcc 4.7.2 PS И, все наоборот - в тумбу переключает нечетный адрес, и при этом в тумбе адресация кратна двум. А четный адрес переключает в ARM, и там кратность уже равна четырем.
|
|
|
|
|
Aug 28 2014, 12:44
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(SM @ Aug 28 2014, 14:41)  О непосредственном. То есть, когда gcc понимает, что указатель можно заоптимизировать до его смерти. При этом линкер, не видя какого-то атрибута, что адрес, куда перейти, относится к thumb режиму, обнуляет ему младшие два бита принудительно, причем без всяких варнингов. Кто-то из нас что-то недопонимает. Если адрес thumb функции N*4, на выходе из предложенного мной кода получается обычно один из двух вариантов: 1) BLX (N*4) 2) LDR Rx, =N*4+1 BLX Rx Если адрес thumb функции N*4+2, на выходе получается один вариант: LRD Rx, =N*4+2+1 BLX Rx У вас какой-то другой результат получается? Цитата(SM @ Aug 28 2014, 14:41)  Да и ручное прибавление единицы к адресу в указателе, это еще более мощный автоген в ж., чем ассемблерный .thumb_set Чем это хуже использования заданного статического адреса?
Сообщение отредактировал den_po - Aug 28 2014, 12:47
|
|
|
|
|
Aug 28 2014, 13:09
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(den_po @ Aug 28 2014, 16:44)  У вас какой-то другой результат получается? Естественно, другой. - Если я делаю вызов ф-ции, описанной по .thumb_set из THUMB-кода, то я получаю BL N*2 ; thumb -> thumb - Если я делаю вызов ф-ции, описанной по .set из THUMB-кода, то я получаю BLX N*4 ; thumb -> arm - Если я делаю вызов ф-ции, описанной по .thumb_set из ARM-кода, то я получаю (должен получить, не пробовал, не надо) BLX N*2+1 ; arm -> thumb - Если я делаю вызов ф-ции, описанной по .set из ARM-кода, то я получаю BL N*4 ; arm -> arm ну, естественно, линкеру дана опция ком. строки --use-blx, иначе она всякий там гемор с регистрами генерирует Цитата(den_po @ Aug 28 2014, 16:44)  Чем это хуже использования заданного статического адреса? Тем, что линкер/компилятор разбираются сами, где там +1 сделать, где не сделать, где BL поставить, где BLX. (тем более, докучи, откуда компилятор узнает, что при переходе по указателю нужен будет BLX, а не BL). Собственно, вопрос то не в этом. Вопрос - как уйти от .thumb_set и ассемблера, по аналогии с IAR-овским __thumb
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|