|
|
  |
свежак KGP win32/arm/avr/mips/m68k, GNU tools chain |
|
|
|
Nov 2 2011, 16:12
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958

|
Солнце еще не погасло, но я кажется начинаю разбираться. Вопрос по коду. Он вылетает в ошибку если пытаться .bss сунуть в память сразу после .data (пытаюсь расположить их в оперативу) CODE SECTIONS { .txt1 0xbfc00000 : { boot.o (.text) }
.txt2 0xbfc00180 : { except.o (.text) }
.txt3 (ADDR(.txt2) + SIZEOF(.txt2)) : AT (ADDR(.txt2) + SIZEOF(.txt2)) { tini.o (.text) }
.txt4 (ADDR(.txt3) + SIZEOF(.txt3) - 0x20000000) : AT (ADDR(.txt3) + SIZEOF(.txt3)) { main_text_start = .; CREATE_OBJECT_SYMBOLS main.o (.text .text.* .text.cos) mxm_ash.o (.text) *(.text.*) }
_gp=ALIGN(16) + 0x7ff0;
.rodata (main_text_start + SIZEOF (.rodata)) { *(.rodata .rodata.*) }
.sdata (ADDR(.rodata) + SIZEOF(.rodata)) { PROVIDE (_errno=0); *(.sdata .sdata.* .gnu.linkonce.s.*) }
.data 0xa0000000 : { *(.data) SORT(CONSTRUCTORS) }
.bss /*(ADDR(.data) + SIZEOF(.data))*/ : /*<--Если снять ремарку, то появляются ошибки*/ { *(.bss) *(COMMON) }
.sbss : { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) }
} Ошибки выглядят вот так: Код comdiv32-kgp-elf-ld: small-data section exceeds 64KB; lower small-data size limit (see option -G) main.o: In function 'timera_interrupt': (.text+0x910):relocation truncated to fit: R_MIPS_GPREL16 against 'timer_counter' Остальные аналогичные. Почему не дает-то? по всякому уже пробовал...
Сообщение отредактировал IgorKossak - Nov 2 2011, 17:55
Причина редактирования: [codebox]
|
|
|
|
|
Nov 8 2011, 19:49
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
свежак для ARM. хост - linux64 http://klen.org/Files/DevTools/linux-x86_6..._64-20111108.7z75.2 Mb в мультилиб добавил отдельный вариант для микросхем Cortex-M4 и Cortex-M4F соответственно при компиляции с ключеми -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 будет компилятся код с подержкой cоспроца и также будут линковатся с версиями библиотек которые собраны с этими же ключами (libc libm libgfortan ... ). в выходном коде Вы с радостью обнаружите инструкции сопроца. если подсунуть только -mcpu=cortex-m4 то процес аналогичный за исключением того что либы без поддержки сопроца, но за счет того что в едре четверки реализован simd набор можно тоже получит профицит по сравнению с кодом скомпленным с -mcpu=cortex-m3 (который в обязательном порядке должен работать на Cortex-M4 ) поскольку самого пациента нихт... тестировал глазами глядя на выходящий асм. с нетерпением жду отзывов и момента когда к нам привезут микросхемы на опыты.
|
|
|
|
|
Nov 9 2011, 05:35
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958

|
Цитата(klen @ Nov 7 2011, 12:29)  2_Ash_snz уу.... бойци невидимого(или недвижиммого ??) фронта прорезались... дайте карту раскладки памяти на кристалле(плате), напишем Вам тестовый скрипт линкера, а то тот который Вы предлагаете чудной. Бойцы невидимого фронта сильно зависят от задач, которые ставят выше. ОК, Раскладку нарисую. А почему чудной? вроде довольно последовательно...
|
|
|
|
|
Nov 9 2011, 09:16
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958

|
Цитата(klen @ Nov 9 2011, 12:29)  чудной поому что Вы явно распихиваете объектники - зачем такой гимор? а если еще модуль появится в проекте - оптья скрипт править? я правильно понял содержимое скрипта? Верно. Так и есть. Карта: ОЗУ 0xa000 0000 - 0xa00F FFFF (1MB) ПЗУ 0xBFC0 0000 - 0xBFCF FFFF (1MB) Это все виртуальные адреса. При этом существует кешируемая память. т.е. физические адреса будут теже (кому в ОЗУ - тому в ОЗУ, кому в ПЗУ - тому в ПЗУ) а виртуальные станут на -0x2000 0000 меньше Получается что при обращении по уменьшенному адресу данные побегут через кеш проца, но наруже попадают все равно туда же. Кешируемое: ОЗУ 0x8000 0000 - 0x800f ffff ПЗУ 0x9fc0 0000 - 0x9fcf ffff boot.o Мы четко располагаем в 0xbfc0 0000 это стартовый адрес - никуда не дется except.o тоже четко в 0xbfc0 0180 это адрес обработчика прерываний. tini.o - инициализация, расположили за ними. Это все без вариантов в некешируемой области (еще и на ассемблере). Текст основной программы main.o в кешируемую область, поэтому от адреса - 0x20000000, но расположили в бинарнике сразу за предыдущей секцией, чтобы не получать бинарник на полГига и запихать его в пзушку. Расположение остальных секций - шаманство с переменными. зы на самом деле при обращении в ПЗУ по стартовому адрему 0xbfc0 0000 мы попадаем не в начало ПЗУ, это ровно ее середина. Соответственно начало ПЗУ в адресе 0xbfb0 0000 и размер ее 2МБ, но мы за первостью опытов используем только верхнюю половину размером с 1 МБ...
Сообщение отредактировал Ash_snz - Nov 9 2011, 09:18
|
|
|
|
|
Nov 9 2011, 19:22
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Nov 9 2011, 01:49)  Что-то у меня не заработало (на M3). Ругается линкер: Цитата ld: warning: creating a segment to contain the file and program headers outside of any MEMORY region Тестовый пример я постил здесь, на нём ошибка тоже проявляется.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 10 2011, 08:20
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007

|
Цитата(klen @ Sep 25 2011, 15:33)  Решил осваивать C++, как пример изучаю scmRTOS. Со старой сборкой (4.6.0 20101030) всё компилится и работает (пример из исходников ОС), а с указанной выше имеем: Цитата ----------------------------------------------------------- arm-kgp-eabi-gcc (Klen's GNU package (KGP) for ARM/elf platform) 4.7.0 20110618 (experimental) --- C++ compiling ./src/main.cpp... C:/DevTools/arm_kgp_eabi_x86_32/bin/arm-kgp-eabi-g++ -c -mcpu=cortex-m3 -mthumb -I "./src" -I "SamplesCommon" -I "scmRTOS/Common" -I "scmRTOS/Cortex-M3" -I "scmRTOS/Extensions/Profiler" -MD -DSTM32F10X_MD_VL -DVER_MAJOR=0 -DVER_MINOR=1 -Wa,-adhlns=./lst/main.lst -O3 -g -fno-exceptions -fno-rtti -ffunction-sections -fdata-sections -fno-threadsafe-statics -funsigned-bitfields -fshort-enums -Wall -Wextra -Winline -Wpointer-arith -Wredundant-decls -Wshadow -Wcast-qual -Wcast-align -pedantic -o obj/main.o ./src/main.cpp mingw32-make: *** [obj/main.o] Error 1 Попробовал этот вызов запустить из консоли винды, получил:
Попробовал заменить эту библиотеку старой (от 4.6.0 сборки), сообщение осталось то же самое.
|
|
|
|
|
Nov 10 2011, 15:53
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958

|
2 Klen Умудрился собрать бинарник со следующим скриптом-> И даже размер не гиговый. CODE MEMORY { ROM : ORIGIN = OxbfcOOOOO, LENGTH = 1M /*ROM2 : ORIGIN = 0x10000000, LENGTH = 1M*/ RAM : ORIGIN = 0x80000000 , LENGTH = 1M } /*REGION_ALIAS ( "REGION_TEXT" , ROM) ; */ REGION_ALIAS("REGION_TXT1", ROM) ; REGION__ALIAS ( "REGION_TXT2" , ROM) ; REGION___ALIAS ( "REGION_TXT3" , ROM) ; REGION__ALIAS ( "REGION_TXT4" , ROM) ; REGION_ALIAS("REGION_RODATA", ROM) ; REGION_ALIAS("REGION_DATA", RAM) ; REGION_ALIAS("REGION_SDATA", RAM) ; REGION_ALIAS("REGION_BSS", RAM) ; REGION_ALIAS("REGION_SBSS", RAM) ; REGION^ALIAS("REGION_DEFAULT",ROM) ;
SECTIONS { .txtl 0xbfc00000 : { boot.o(.text) } > REGION_TXT1
.txt2 0xbfc00180 : { except.o(.text) }>REGION_TXT2
.txt3 (ADDR(.txt2) + SIZEOF(.txt2)): AT (ADDR(.txt2) + SIZEOF(.txt2)) { tini.o(.text) }>REGION_TXT3
.txt4 ((ADDR( .txt3) + SIZEOF(.txt3))-0x20000000 ) : AT (ADDR( .txt3) + SIZEOF(.txt3)) { main_text_start = . ; CREATE_OBJECT_SYMBOLS main.o(.text .text.* .text.cos) mxm_ash.o(.text) *(.text.*) PROVIDE (errno = .); }
.rodata: AT (ADDR( .txt3) + SIZEOF(.txt3) + SIZEOF(.txt4)) { *(.rodata .rodata.*) }> REGION_RODATA
/*_gp = ALIGN(16) + 0x7ff0;*/
.sdata 0x80000000 : AT (ADDR( .txt3) + SIZEOF(.txt3) + SIZEOF(.txt4) + SIZEOF(.rodata) { /*PROVIDE ( _errno = 0xbfc00000);*/ *(.sdata .sdata.* .gnu.linkonce.s.*) } > REGION_SDATA
.sbss : AT (ADDR(.rodata) + SIZEOF(.rodata) + SIZEOF(.sdata)) { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) }> REGION_SBSS
.data: AT (ADDR(.sbss) + SIZEOF(.sbss)) { *(.data) SORT(CONSTRUCTORS) } > REGION_DATA
/*. = ADDR(.data) + SIZEOF(.data); . = ALIGN (32);*/
.bss: AT (ADDR(.data) + SIZEOF(.data)) { *(.bss) *(COMMON) } > REGION_BSS
/*.default : AT (ADDR(.rodata) + SIZEOF(.rodata) + SIZEOF(.sdata) + SIZEOF(.sbss) { *(.* .*.-*) }*/
_gp = ALIGN(32);/* + Ox7ffO;*/
} Принцип скрипта такой же, к сожалению. По скрипту остались вопросы: - где и зачем должен быть global pointer - _gp? в какой области памяти и вообще на кой он? - где должен быть __errno? Смутно догадываюсь что это номер ошибки мат библиотеки. - почему при расположении errno в оперативе он ругается R_MIPS_26 (кажется так)? Предполагаю что ошибка невозможности джампа через 26 битный адрес. Надо пересобирать libm для джампа по 32 разрядам?
|
|
|
|
|
Nov 12 2011, 15:50
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958

|
Цитата(klen @ Nov 12 2011, 15:08)  2_Ash_snz По поводу R_MIPS_26 я точно не знаю, но очень похоже на то что вы сказали. пробуйте вообще все пересобрать с поддержкой длинных вызовов - а там видно будет. Вообще не имея документации на микросхемы все про комдивчик мне видится очень мутным - я полагал что будет еще проще чем с армами, судя по тому что имеет microchip c pic32 в котором также m4k ядро. Смотри личку. У нас кстати R3000 ядро. Пересобрать, это Новая задача  Вызов принят. В прошлый раз все было пересобрано великим Кленом под фаст маф и хард флоат.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|