|
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: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, и там кратность уже равна четырем.
|
|
|
|
Сообщений в этой теме
SM ARM gcc, вызвать THUMB функцию из ROM Aug 27 2014, 17:02     den_po Цитата(SM @ Aug 28 2014, 14:41) О непосре... Aug 28 2014, 12:44      SM Цитата(den_po @ Aug 28 2014, 16:44) У вас... Aug 28 2014, 13:09 den_po можно без линкера сделать указатель на функцию, а ... Aug 27 2014, 22:17 Golikov A. ИМХО корректнее честный АСМ вызов, чем игры со сме... Aug 28 2014, 10:05 scifi Цитата(SM @ Aug 27 2014, 21:02) Я сделал ... Aug 28 2014, 10:36 Сергей Борщ Там есть еще одна фигня - линкер может вставлять B... Aug 28 2014, 12:02 SM Цитата(Сергей Борщ @ Aug 28 2014, 16:02) ... Aug 28 2014, 12:09  jcxz Цитата(SM @ Aug 28 2014, 18:09) Хватает, ... Aug 29 2014, 02:41   SM Цитата(jcxz @ Aug 29 2014, 06:41) если BX... Aug 29 2014, 05:33 jcxz Цитата(Сергей Борщ @ Aug 28 2014, 18:02) ... Aug 29 2014, 03:53 den_po В общем, говорим мы о разных вещах.
Если в исходни... Aug 28 2014, 20:44 Golikov A. А у меня есть другое предложение, а что если вам с... Aug 29 2014, 06:31 SM Цитата(Golikov A. @ Aug 29 2014, 10:31) А... Aug 29 2014, 06:40  jcxz Цитата(SM @ Aug 29 2014, 12:40) При этом ... Aug 29 2014, 06:59   SM Цитата(jcxz @ Aug 29 2014, 10:59) то можн... Aug 29 2014, 07:03 jcxz Цитата(Golikov A. @ Aug 29 2014, 12:31) А... Aug 29 2014, 06:47 Golikov A. да пофиг, пусть переключается, вы в функции насиль... Aug 29 2014, 06:45 SM Цитата(Golikov A. @ Aug 29 2014, 10:45) В... Aug 29 2014, 06:55 Golikov A. А второй вопрос, если все вызовы этой функции сдел... Aug 29 2014, 07:05 SM Цитата(Golikov A. @ Aug 29 2014, 11:05) Я... Aug 29 2014, 07:07  jcxz Цитата(SM @ Aug 29 2014, 13:07) Не хочетс... Aug 29 2014, 07:18   SM Цитата(jcxz @ Aug 29 2014, 11:18) Это, им... Aug 29 2014, 07:35    jcxz Цитата(SM @ Aug 29 2014, 13:35) А чего-то... Aug 29 2014, 07:44     SM Цитата(jcxz @ Aug 29 2014, 11:44) Мне каж... Aug 29 2014, 07:48      sasamy Цитата(SM @ Aug 29 2014, 11:48) В общем, ... Aug 29 2014, 09:52 Сергей Борщ Увы... Максимум, что приходит в голову - засунуть ... Aug 29 2014, 08:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|