Отговори на тема  [ 29 мнения ]  Отиди на страница Предишна  1, 2
Позиционно независим код Cortex + gcc 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Хубаво че си го оправил. Верно глупава ситуация. Както и да е, ей така се прави с линкерска секция без да копираш на ръка кода - направо си викаш функцията от рам.

Код:
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(ROM_VECTOR_TABLE)

MEMORY
{
   ROM (rx)   : ORIGIN = 0x00100000, LENGTH = 512k
   RAM (rwx)   : ORIGIN = 0x00200000, LENGTH = 128k
}

SECTIONS
{
   .romvect   :
   {
      KEEP( * ( .romvect ) )
      .      = ALIGN( 0x10 );
   } >ROM

   .text :
   {
      .      = ALIGN( 0x10 );
      *      ( .text    )
      *      ( .text*   )
      *      ( .rodata  )
      *      ( .rodata* )
      *      ( .glue_7  )
      *      ( .glue_7t )

      KEEP( * ( .init ) )
      KEEP( * ( .fini ) )
   } >ROM

   .preinit_array :
   {
      .      = ALIGN( 0x4 );
      PROVIDE_HIDDEN   ( __preinit_array_start = . );
      KEEP( * ( SORT( .preinit_array.* ) ) )
      KEEP( * ( .preinit_array* ) )
      PROVIDE_HIDDEN   ( __preinit_array_end = . );
   } >ROM

   .init_array :
   {
      .      = ALIGN( 0x4 );
      PROVIDE_HIDDEN   ( __init_array_start = . );
      KEEP( * ( SORT( .init_array.* ) ) )
      KEEP( * ( .init_array* ) )
      PROVIDE_HIDDEN   ( __init_array_end = . );
   } >ROM

   .fini_array :
   {
      .      = ALIGN( 0x4 );
      PROVIDE_HIDDEN   ( __fini_array_start = . );
      KEEP( * ( .fini_array* ) )
      KEEP( * ( SORT( .fini_array.* ) ) )
      PROVIDE_HIDDEN   (__fini_array_end = . );
   } >ROM

   .last_code :
   {
      .      = ALIGN( 0x1000 );
   } >ROM

   .data :
   {
      __ram_load   = LOADADDR( .data );
      __ram_start   = . ;
      KEEP ( * ( .ramvect ) )
      .      = ALIGN( 0x4 );
      *      ( .text.fastcode )
      .      = ALIGN( 0x4 );
      *      ( .data )
      .      = ALIGN( 0x4 );
      *      ( .data* )
      .      = ALIGN( 0x4 );
      __ram_end   = . ;
   } >RAM AT>ROM

   .bss :
   {
      .      = ALIGN( 0x4 );
      __bss_start   = . ;

      *      ( .bss )
      *      ( .bss* )

      .      = ALIGN( 0x4 );
      __bss_end   = . ;
    } >RAM



Това е моя линкерски скрипт, не е за копи пействане че съм променил една камара неща за моя боотстрапер, пък и е за арм7тдми - давам ти го за пример да видиш къде се добавя секцията за код в рам-а - обърни внимание на .text.fastcode - това прави магията. После в сорса слагаш един атрибут в дефиницията на функцията и си готов. Ей така:
Код:

void Btldr(void) __attribute__((section(".fastcode")));
void Btldr(void)
{
}



В инициализиращия код преди main() има един цикъл който копира от флаш-а всички инициализирани данни в рам-а, заедно с кода на тази функция така че не се налага да заделяш място и да копираш на ръка, освен това се копира точно колкото ти трябва. Автоматично ти се решава и проблема със нечетния адрес за thumb кода. Кода ти става по лесно преносим ако решиш да минеш на друг арм, че и на друга архитектура даже.

_________________
Мразя да мразя ...


Чет Окт 27, 2011 12:34 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
Бе то и аз исках с линкер скрипта... ама на за мен е като санскрит. Чопля там почти на сляпо, когато ми се наложи, повече на проба/грешка :( Лошото е че таак и не съм попаднал на читаво четиво, където е описано тайнството "линкер-скриптов език"

Какво е грешката relocation truncated to fit: R_ARM_THM_CALL against symbol `Btldr' defined in .fastcode section in ./image.o ?

Загадка..

Каква е разликата между

* ( .text )
* ( .text* )
?

Препочъчай нещо за четене най-добре, ако се намира някъде...


Чет Окт 27, 2011 3:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Позиционно независим код Cortex + gcc
setoy написа:
Лошото е че таак и не съм попаднал на читаво четиво, където е описано тайнството "линкер-скриптов език"


Като за начало що не прочетеш документацията ...
А пък това със секциите 100 пъти сме го коментирали и в тоя форум.


Цитат:
Какво е грешката relocation truncated to fit: R_ARM_THM_CALL against symbol `Btldr' defined in .fastcode section in ./image.o ?


Така по памет не мога ти цитирам причините за всички грешки. Показва ти символа, виж го що за символ е - етикет, функция, променлива.... откъде се ползва и как. Явно е компилирало код, който линкера не може да адаптира. Примерно ако преход и имаш оставена двубайтова инструкция, а пък линкера трябва да му присвои далечен адрес.


Код:
Каква е разликата между

      *      ( .text    )
      *      ( .text*   )

Едното матчва всички символи от текст секцията, а други матчва всички символи от секция започваща с text.
По принцип второто не е много коректно. Трябва да е:

* ( .text.* )

А пък тъй като подобни двойни филтри се ползват често, за да не ти набъбва скрипта по-добре ги записвай на един ред така:
* ( .text .text.* )


Чет Окт 27, 2011 4:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Грешката най вероятно означава че инструкцията за викане на функция не може да адресира толкова далечен адрес - в стандартния арм лимита май беше 64мб, а при кортексите може и да е по малък. За да се оправи това се дава една опция на компилатора първо да зарежда адреса на фукцията в регистър и после да прави калл с регистъра - вкарва ти една инструкция отгоре на всеки калл - грозна работа, ама няма как. Виж какво пише в документацията:
Цитат:
-mlong-calls
-mno-long-calls
Tells the compiler to perform function calls by first loading the address of the function into a register and then performing a subroutine call on this register. This switch is needed if the target function will lie outside of the 64 megabyte addressing range of the offset based version of subroutine call instruction.

Even if this switch is enabled, not all function calls will be turned into long calls. The heuristic is that static functions, functions which have the `short-call' attribute, functions that are inside the scope of a `#pragma no_long_calls' directive and functions whose definitions have already been compiled within the current compilation unit, will not be turned into long calls. The exception to this rule is that weak function definitions, functions with the `long-call' attribute or the `section' attribute, and functions that are within the scope of a `#pragma long_calls' directive, will always be turned into long calls.

This feature is not enabled by default. Specifying -mno-long-calls will restore the default behavior, as will placing the function calls within the scope of a `#pragma long_calls_off' directive. Note these switches have no effect on how the compiler generates code to handle function calls via function pointers.

Т.е. тъй като си задал секция на фукцията би трябвало да я няма тая грешка, ама все пак си поиграй малко с прагми, атрибути опции да го оправиш.

Разликата между .text и .text* е че звездата заменя какви да е символи - в случая допълнителни code подсекции.

Литература за това няма кой знае каква - търси в гугъл, ако не намериш питай ако мога да помогна. Доста порових докато го разбера как се конфигурира тоя линкер, но не съм запазил линковете така че няма как да ти дам откъде да прочетеш.

Я сега аз да те питам нещо - борих се тия дни с едно L3S8630 но нещо не успях да го подкарам, не мога да се свържа с JTAG към него, ти с кое луминари работиш? С готов кит или сам си си правил платка?

_________________
Мразя да мразя ...


Чет Окт 27, 2011 4:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Позиционно независим код Cortex + gcc
Забравих да обясня за текс и текст.*

Значи по принцип ".text" е секцията по подразбиране за код. И тъй като е по подразбиране нормално е да очакваш, че из някой сорс (по-точно обектен) файл ще има код в такава секция. Затова трябва да я сложиш.
Но тоя начин да блъскаш всичко в една секция е меко казано грозен. По-добре да си сложиш в опциите на компилатора (мейкфайла):
Код:
GCCFLAGS +=-ffunction-sections -fdata-sections

Това ще накара компилатора всяка функция (и данни) да се разполага в отделна секция. Примерно ако имаш функция foo() тя ще се разположи в секция .text.foo
Отделните секции са за предпочитане най-малкото заради опимизациите. Линкерът първо слага нещата, които са задължителни, т.е. с KEEP(). И докато ги слага гледа дали те не ползват символи от други секции и добавя и тия секции.
Забележи, че оптимизацията е на ниво секции. Ако нищо от дадена секция не се ползва и няма KEEP - цялата секция се разкарва... Но едно нещо да се ползва - цялата секция остава.


Чет Окт 27, 2011 4:57 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
С 9В96 и 9В92 работя в момента... Имаме и наши платки, и китове. За вероятна причина да не отговаря по JTAG веднага се сещам, ако е ревизия С3 или С5, ресета на ядрото и ресета на JTAG интерфейса вътрешно са дадени накъсо и ако дебъгера се опита да прави ресет на ядрото... самоубива си връзката с дебъг-интерфейса и се дисконектва със съобщение за грешка :D Може и друга да е причината де, но първо това провери.

Миро, документацията съм я чел... преглеждам я редовно даже, но за да явно се предполага, че трябва да имам някакви по-основни познания, които като че ли ми липсват.

Благодаря много, Палавров, ще си поиграя и ще видя от какво е


Чет Окт 27, 2011 5:08 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Ей тук е темата където Миро много добре обяснява линкерските скриптове:

viewtopic.php?f=7&t=9305

Мерси за инфото за стелариса - и на мен ми намирисва че е нещо свързано с ресета - грешката която дава openocd е:
Цитат:
Timeout (1000ms) waiting for ACK=OK/FAULT in JTAG-DP transaction

и ефекта е че въобще не мога да се свържа през openocd - на всички команди ми казва че не е опознал таргета и отказва да работи. В скрипта за настройка има няколко опции с които се регулира това нещо:

Код:
#reset_config srst_only
#reset_config srst_only separate
reset_config trst_and_srst
#reset_config none


да знаеш дали ще се оправи с някоя от тях?

_________________
Мразя да мразя ...


Чет Окт 27, 2011 5:34 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
Определено не... това конфигурира коя линия за ресет да се ползва и как , в случай че са изведени и двете на пинове. А тя тази за JTAG-a не е изведена въобще, но вътрешно е свързана с другата... няма оправия, освен да не правиш никакъв ресет в процеса на свързване. Обаче съобщението за таймоут не е от това.

viewtopic.php?f=2&t=8399

Ето тук и аз съм питал знае ли някой от какво е :) Единственото, което мога да кажа е, че "Debug port unlock" процедурата понякога помага процесора да дойде на себе си... а понякога не помага


Чет Окт 27, 2011 5:59 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Жалко, щеше ми се да си спестя един чип на платката за физичния интерфейс на етернета.
Между другото - ровичках из сорсовете на openocd да го видя за какво е това и единственото което разбрах е че грешката става в първия момента в който openocd се опита да прочете нещо от дебъг регистрите на кортекса - примерно id на чипа и т.н. Т.е. JTAG работи до някъде, но дебъг котролера в процесора нещо не отговаря. Е, ще си карам със arm7tdmi засега - пък по нататък ще го почопля пак, все трябва да има оправия.

_________________
Мразя да мразя ...


Чет Окт 27, 2011 6:23 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
Точно -mlong-calls се оказа ключа за палатката ! Благодаря много на palavrov и Миро.

palavrov, ти все пак го пробвай отключването... няколко пъти дори, че не всеки път "хваща" от раз :) За целта ти трябва: http://www.ti.com/tool/lmflashprogrammer , ресет бутон и няколко минути време :)


Пет Окт 28, 2011 12:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Абе тя моята е сложна - платката е в Пловдив, аз съм в Брюксел - работя по интернет без да виждам какво става. Освен това цялата развойна работа е под линукс, нямам и кит от тексасците така че няма как да им ползвам туулчето за отключване. За късмет снощи пак порових в гугле и видях че в openocd има команда която прави същото нещо като тоя туул та смятам да я пробвам като колегата ми накичи пак всички платки. Само за инфо - командата е:
Цитат:
— Command: stellaris recover bank_id

Performs the Recovering a "Locked" Device procedure to restore the flash specified by bank_id and its associated nonvolatile registers to their factory default values (erased). This is the only way to remove flash protection or re-enable debugging if that capability has been disabled.

Note that the final "power cycle the chip" step in this procedure must be performed by hand, since OpenOCD can't do it.

Warning: if more than one Stellaris chip is connected, the procedure is applied to all of them.

_________________
Мразя да мразя ...


Пет Окт 28, 2011 1:18 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
Стана ли отключването с опен-оцд ? Защото при мен:

Цитат:
srst_only separate srst_gates_jtag srst_open_drain
Info : USER ACTION: power cycle Stellaris chip, then restart OpenOCD.
3 [main] openocd_m 1848 exception::handle: Exception: STATUS_ACCESS_VIOLA
ION
955 [main] openocd_m 1848 open_stackdumpfile: Dumping stack trace to openoc
_m.exe.stackdump


Нещо гърми на излизане от функцията COMMAND_HANDLER(stellaris_handle_recover_command)... и нищо не е свършено. Не е важно де, с другото тоол-че си става, просто ми стана любопитно да пробвам и с опен-оцд


Пет Ное 11, 2011 3:48 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Позиционно независим код Cortex + gcc
Ами не стана - каза ми че не може да опознае чипа като стеларис и съответно въобще не изпълни командата. Простотия - сега не ми се занимава повече да чопля ... проблем ли е да пратя колегата някой ден до теб да пробвате дали ще можеш да отключиш процесора на нашата платка?

_________________
Мразя да мразя ...


Пет Ное 11, 2011 3:53 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Позиционно независим код Cortex + gcc
Няма никакъв проблем. Ако има път към Стара Загора, да звънне, ще се разберем.


Пет Ное 11, 2011 5:00 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 29 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни