реклама на сайте
подробности

 
 
> ARM gcc, вызвать THUMB функцию из ROM
SM
сообщение Aug 27 2014, 17:02
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SM
сообщение Aug 27 2014, 18:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Проблему сам решил, через ж. автогеном. Сделал ассемблерный файл rom_funcs.S, внутри которого написал:

Код
      .globl rom_func
      .thumb_set rom_func, 0x123456


Ну и прилинковал получившийся объектный модуль в общую кучу. А из скрипта линкера убрал указание адреса. В результате вызов из THUMB-кода по BL, что и требовалось.

-----
Но вопрос остался - а не через зад, можно? Прямо линкеру указать, что этот символ thumb и имеет такое-то значение?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 28 2014, 02:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SM @ Aug 28 2014, 00:23) *
Проблему сам решил, через ж. автогеном. Сделал ассемблерный файл rom_funcs.S, внутри которого написал:

Выключайте автоген:
typedef void (__thumb *iap_entry_typ)(u32 *, u32 *);
#define iap_entry ((iap_entry_typ)0x7FFFFFF1)
iap_entry(buf, buf);

for IAR
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 28 2014, 05:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
den_po
сообщение Aug 28 2014, 10:20
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 28 2014, 10:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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, и там кратность уже равна четырем.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 14:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016