|
|
  |
ARM gcc, вызвать THUMB функцию из ROM |
|
|
|
Aug 29 2014, 03:53
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ Aug 28 2014, 18:02)  Там есть еще одна фигня - линкер может вставлять BX просто потому, что для B не хватает дальности "прыжка". Линкёр команды не генерит. Максимум, что он может - вставить врапперы (или как оно там называется), когда видит, что цель перехода - вне пределов досягаемости. Когда компилятор генерит выходные секции из исходника, то внутри секции он может вычислить расстояния переходов, и соответственно - использовать команду перехода с непосредственным смещением в теле. Если же переход идёт в другую секцию, то расстояние станет известно только на этапе компоновки, а значит при компиляции оно не известно. Тогда линкёр может вставить враппер с косвенным переходом внутри для увеличения длины перехода. А в данном случае переход идёт из перемещаемой области (для компилятора её адрес не известен) в константный адрес. Тут само собой нужен BX сразу без всяких доп. врапперов.
|
|
|
|
|
Aug 29 2014, 05:33
|
Гуру
     
Группа: Свой
Сообщений: 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.htmlBLX Label, как и BL Label, имеют зону досягаемости +-32 Мбайт. И, вообще, повторю в стодвадцатый раз уже. Генерация кода происходит так, как мне надо, если для задания адреса ф-ции я использую ассемблерный .thumb_set (собственно, все уже работает, красоты не хватает). Вопрос в том, как сделать без ассемблера так, чтобы вызовы были при помощи непосредственной адресации и корректными (иначе чутка не влезаю в нужный мне размер кода), то есть я хочу описать средствами С и/или линкера THUMB-функцию, расположенную вне моего кода в ROM, так, чтобы при генерации кода она вызывалась через BL/BLX с непосредственной адресацией.
|
|
|
|
|
Aug 29 2014, 06:40
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(Golikov A. @ Aug 29 2014, 10:31)  А у меня есть другое предложение, а что если вам сделать переход все равно какой, а переключиться на thumb режим уже внутри вашей функции? У меня задача обратная  Мне надо НЕ переключаться в ARM, при вызове ROM-функций (они находятся по фиксированным адресам в ROM (в бутлоадере) в процессоре, и все имеют thumb-код), из моего кода, который тоже THUMB. А по умолчанию gcc считает, что такая функция, объявленная заданием адреса через скрипт линкера, она ARM. При этом без излишеств, так как у меня всего 500 байт есть на весь мой код... С .thumb_set я уложился в 480 байт, но хочу сделать без него, и чтобы с тем же результатом.
|
|
|
|
|
Aug 29 2014, 06:45
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
да пофиг, пусть переключается, вы в функции насильно переключите обратно и дальше поехали, ну потеряете немного тактов, но как я понимаю если пошли по пути экономии памяти, с тактами уже можно прощаться  . В thumb режиме если я не ошибаюсь команда перехода уже не +-32MB, а всего то +-2MB если мы про 16 битный режим, может это как-то влияет на попытки переключится? Еще следить надо что команда перехода с переключением а не выбором режима, то есть надо еще считать число переходов  Цитата При этом без излишеств, так как у меня всего 500 байт есть на весь мой код... С .thumb_set я уложился в 480 байт, да пипец какой-то.... Ваша жизнь создана из ограничений, я ваще не понимаю как вы так существуете  В ПЛИС вы себя ужимаете все до единиц флипфлопов подсчитываете, в процах тоже... Как же вы машину заправляете  ..... Ну если уж так жметесь, то даже не знаю что предложить...
|
|
|
|
|
Aug 29 2014, 06:55
|
Гуру
     
Группа: Свой
Сообщений: 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)  Как же вы машину заправляете  ..... Вот тут я отрываюсь по полной!  UPD Я бы, конечно, как это вообще люблю делать (на других процах), написал бы все от начала и до конца на асме... Но дюже неудобный он у ARM-а для писания на нем... Вот и извращаюсь с С.
|
|
|
|
|
Aug 29 2014, 06:59
|
Гуру
     
Группа: Свой
Сообщений: 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 как функцию, прилинковать в известное место (по известному смещению) своего выходного исполняемого образа и вызывать как обычную функцию.
|
|
|
|
|
Aug 29 2014, 07:03
|
Гуру
     
Группа: Свой
Сообщений: 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, что и требуется.
|
|
|
|
|
Aug 29 2014, 07:18
|
Гуру
     
Группа: Свой
Сообщений: 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 поправили.  Чтобы он грузился с SPI-флеши находящейся в Sleep-mode. Это, имхо, полезнее.
|
|
|
|
|
Aug 29 2014, 07:35
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(jcxz @ Aug 29 2014, 11:18)  Это, имхо, полезнее. У каждого свое IMHO. Мы купили 1000 NAND-ов с 4К страницами, из них половину запаяли  Не выкидывать же и перепаивать... Об этом баге и в TI не знали... Короче, как я понял, нет другого способа объявить функцию как thumb, кроме как: 1) скомпилировать ее (она должна быть в файле определена вместе с ее телом, то есть не быть внешней) вместе с файлом с указанием ключа -mthumb 2) ассемблерный .thumb_set 3) ассемблерный .thumb_func А чего-то типа __attribute__ ((thumb)) или __thumb в арсенале gcc нет. Итого, объявить внешнюю функцию по заданному адресу можно только методом 2) - .thumb_set. это верные выводы? PS о том, как вызвать некий адрес как thumb или ARM речь не ведется, и не велась. Речь именно про объявление функции средствами C или линкера по заранее заданному адресу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|