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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> ARM gcc, вызвать THUMB функцию из ROM
jcxz
сообщение Aug 29 2014, 03:53
Сообщение #16


Гуру
******

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



Цитата(Сергей Борщ @ Aug 28 2014, 18:02) *
Там есть еще одна фигня - линкер может вставлять BX просто потому, что для B не хватает дальности "прыжка".

Линкёр команды не генерит. Максимум, что он может - вставить врапперы (или как оно там называется), когда видит, что цель перехода - вне пределов досягаемости.
Когда компилятор генерит выходные секции из исходника, то внутри секции он может вычислить расстояния переходов, и соответственно - использовать команду перехода с непосредственным смещением в теле.
Если же переход идёт в другую секцию, то расстояние станет известно только на этапе компоновки, а значит при компиляции оно не известно. Тогда линкёр может вставить враппер с косвенным
переходом внутри для увеличения длины перехода.

А в данном случае переход идёт из перемещаемой области (для компилятора её адрес не известен) в константный адрес. Тут само собой нужен BX сразу без всяких доп. врапперов.
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 05:33
Сообщение #17


Гуру
******

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



Цитата(jcxz @ Aug 29 2014, 06:41) *
если BX


Не BX, а BLX, речь только о BLX с непосредственной адресацией. Ее отличие от BL (тоже с непосредственной адресацией) только в том, что она переключает режим ARM/THUMB, а BL - нет.

Собственно, первоисточник - http://infocenter.arm.com/help/index.jsp?t...c/Cihfddaf.html
BLX Label, как и BL Label, имеют зону досягаемости +-32 Мбайт.

И, вообще, повторю в стодвадцатый раз уже. Генерация кода происходит так, как мне надо, если для задания адреса ф-ции я использую ассемблерный .thumb_set (собственно, все уже работает, красоты не хватает). Вопрос в том, как сделать без ассемблера так, чтобы вызовы были при помощи непосредственной адресации и корректными (иначе чутка не влезаю в нужный мне размер кода), то есть я хочу описать средствами С и/или линкера THUMB-функцию, расположенную вне моего кода в ROM, так, чтобы при генерации кода она вызывалась через BL/BLX с непосредственной адресацией.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2014, 06:31
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А у меня есть другое предложение, а что если вам сделать переход все равно какой, а переключиться на thumb режим уже внутри вашей функции? Тогда вам не надо будет следить за переходами на вашу функцию, переход может быть любым, а функция всегда отработает правильно не зависимо от того как на нее перешли?
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 06:40
Сообщение #19


Гуру
******

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



Цитата(Golikov A. @ Aug 29 2014, 10:31) *
А у меня есть другое предложение, а что если вам сделать переход все равно какой, а переключиться на thumb режим уже внутри вашей функции?


У меня задача обратная sm.gif Мне надо НЕ переключаться в ARM, при вызове ROM-функций (они находятся по фиксированным адресам в ROM (в бутлоадере) в процессоре, и все имеют thumb-код), из моего кода, который тоже THUMB. А по умолчанию gcc считает, что такая функция, объявленная заданием адреса через скрипт линкера, она ARM.

При этом без излишеств, так как у меня всего 500 байт есть на весь мой код... С .thumb_set я уложился в 480 байт, но хочу сделать без него, и чтобы с тем же результатом.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2014, 06:45
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



да пофиг, пусть переключается, вы в функции насильно переключите обратно и дальше поехали, ну потеряете немного тактов, но как я понимаю если пошли по пути экономии памяти, с тактами уже можно прощатьсяsm.gif .
В thumb режиме если я не ошибаюсь команда перехода уже не +-32MB, а всего то +-2MB если мы про 16 битный режим, может это как-то влияет на попытки переключится?
Еще следить надо что команда перехода с переключением а не выбором режима, то есть надо еще считать число переходовsm.gif


Цитата
При этом без излишеств, так как у меня всего 500 байт есть на весь мой код... С .thumb_set я уложился в 480 байт,

да пипец какой-то.... Ваша жизнь создана из ограничений, я ваще не понимаю как вы так существуетеsm.gif В ПЛИС вы себя ужимаете все до единиц флипфлопов подсчитываете, в процах тоже... Как же вы машину заправляетеsm.gif.....


Ну если уж так жметесь, то даже не знаю что предложить...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 29 2014, 06:47
Сообщение #21


Гуру
******

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



Цитата(Golikov A. @ Aug 29 2014, 12:31) *
А у меня есть другое предложение, а что если вам сделать переход все равно какой, а переключиться на thumb режим уже внутри вашей функции? Тогда вам не надо будет следить за переходами на вашу функцию, переход может быть любым, а функция всегда отработает правильно не зависимо от того как на нее перешли?

Да, непонятно мне тоже. Почему-бы SM не сделать просто функцию-обёртку этого ROM-вызова, переключаясь внутри этой обёртки в thumb, а вызывая её обычным образом?
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 06:55
Сообщение #22


Гуру
******

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



Цитата(Golikov A. @ Aug 29 2014, 10:45) *
В thumb режиме если я не ошибаюсь команда перехода уже не +-32MB, а всего то +-2MB

В thumb допустимы и 32-битные команды, с ".W" - в общем, блин, нету проблем с этим. Ведь !!!! с .thumb_set все происходит как надо, и проблем нет. Но он мне просто не нравится. Красоты хочется, чтобы без ассемблерной добавки.

Цитата(jcxz @ Aug 29 2014, 10:47) *
Да, непонятно мне тоже. Почему-бы SM не сделать просто функцию-обёртку этого ROM-вызова, переключаясь внутри этой обёртки в thumb, а вызывая её обычным образом?

Вылезаю за допустимый размер. Код + три слова данных (два на хидер и одно в конце моё) должны влезть в один ECC-сектор NAND памяти (512 байт).

Цитата(Golikov A. @ Aug 29 2014, 10:45) *
Как же вы машину заправляетеsm.gif.....

Вот тут я отрываюсь по полной! lol.gif

UPD
Я бы, конечно, как это вообще люблю делать (на других процах), написал бы все от начала и до конца на асме... Но дюже неудобный он у ARM-а для писания на нем... Вот и извращаюсь с С.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 29 2014, 06:59
Сообщение #23


Гуру
******

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



Цитата(SM @ Aug 29 2014, 12:40) *
При этом без излишеств, так как у меня всего 500 байт есть на весь мой код... С .thumb_set я уложился в 480 байт, но хочу сделать без него, и чтобы с тем же результатом.

Если вопрос в размере и известно, что расстояние до этих ROM-функций позволяет использовать BL (с его укороченной досягаемостью) и известен стартовый адрес образа
вашего кода в памяти, то можно в асм-файле определить команды перехода на ROM-функции как обычные константы (не знаю как в gcc, но в IAR):
wrap_funcX: DC16 XXXX ;здесь код команды безусловный B с непосредственным 11-битным смещением
описать wrap_funcX как функцию, прилинковать в известное место (по известному смещению) своего выходного исполняемого образа и вызывать как обычную функцию.
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 07:03
Сообщение #24


Гуру
******

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



Цитата(jcxz @ Aug 29 2014, 10:59) *
то можно в асм-файле определить

Ну елки-палки. С asm-файлом у меня все и без таких извратов работает! Хочется средствами С обойтись.

rom_func.h:
Код
int rom_func (void* dev_descr, int data);


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


и в результате в thumb-коде получается обычный BL 0x123456, что и требуется.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 29 2014, 07:05
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А второй вопрос, если все вызовы этой функции сделать ассемблерными вставками с правильным переходом? То есть вызывать ее не через
My_func()... А переходом с сохранением и восстановлением регистров потом ручками, коль вы искушены в асме?
Я так понимаю что если код столь мал, то вряд ли он потом будет сильно кем то еще модифицироваться и наращиваться, можно и последить, коли такая острая задача.

ассемблерные вставки вполне допустимы и всеми нормально воспринимаются в коде на С
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 07:07
Сообщение #26


Гуру
******

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



Цитата(Golikov A. @ Aug 29 2014, 11:05) *
Я так понимаю что если код столь мал, то вряд ли он потом будет сильно кем то еще модифицироваться и наращиваться, можно и последить, коли такая острая задача.

Не хочется вставок и лишнего асма. Это опенсурс проект... Выкладывать его буду в виде патча к x-loader-у для работы с AM3517 с NAND-ами с 4К-страницами, как обход бага его ROM-бутлоадера, связанного с такими NAND.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 29 2014, 07:18
Сообщение #27


Гуру
******

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



Цитата(SM @ Aug 29 2014, 13:07) *
Не хочется вставок и лишнего асма. Это опенсурс проект... Выкладывать его буду в виде патча к x-loader-у для работы с AM3517 с NAND-ами с 4К-страницами, как обход бага его ROM-бутлоадера, связанного с такими NAND.

Вряд-ли без асм или intrinsic-функций или без какой другой привязки к компилятору обойдётесь.
По-моему это всё ерунда.
Лучше-бы тогда уж ROM-бутлоадер OMAP L-137 поправили. sm.gif
Чтобы он грузился с SPI-флеши находящейся в Sleep-mode. Это, имхо, полезнее.
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 07:35
Сообщение #28


Гуру
******

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



Цитата(jcxz @ Aug 29 2014, 11:18) *
Это, имхо, полезнее.


У каждого свое IMHO. Мы купили 1000 NAND-ов с 4К страницами, из них половину запаяли sm.gif Не выкидывать же и перепаивать... Об этом баге и в TI не знали...

Короче, как я понял, нет другого способа объявить функцию как thumb, кроме как:
1) скомпилировать ее (она должна быть в файле определена вместе с ее телом, то есть не быть внешней) вместе с файлом с указанием ключа -mthumb
2) ассемблерный .thumb_set
3) ассемблерный .thumb_func

А чего-то типа __attribute__ ((thumb)) или __thumb в арсенале gcc нет.

Итого, объявить внешнюю функцию по заданному адресу можно только методом 2) - .thumb_set.

это верные выводы?

PS
о том, как вызвать некий адрес как thumb или ARM речь не ведется, и не велась. Речь именно про объявление функции средствами C или линкера по заранее заданному адресу.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 29 2014, 07:44
Сообщение #29


Гуру
******

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



Цитата(SM @ Aug 29 2014, 13:35) *
А чего-то типа __attribute__ ((thumb)) или __thumb в арсенале gcc нет.
Итого, объявить внешнюю функцию по заданному адресу можно только методом 2) - .thumb_set.

Мне кажется Ваш вопрос больше не про ARM, а про средства разработки. Так что здесь более уместна: http://electronix.ru/forum/index.php?showforum=162
может там лучше подскажут.
Go to the top of the page
 
+Quote Post
SM
сообщение Aug 29 2014, 07:48
Сообщение #30


Гуру
******

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



Цитата(jcxz @ Aug 29 2014, 11:44) *
Мне кажется Ваш вопрос больше не про ARM

Мне так не кажется... thumb - это сугубо ARM-овское - ни к какому другому ядру отношения не имеет.

В общем, долгое гугление на эту тему тоже ничего не дало, кроме .thumb_set... Так что, пожалуй, перспектив что-то еще узнать практически нет. Я тут надеялся, что кто-то уже это проходил до меня из местных.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:03
Рейтинг@Mail.ru


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