Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с адресацией памяти.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
tdi@013h
Здравствуйте уважаемые форумчане. Свалилась на меня задача обновления комплекса ПО (Eclipse 3.5.1+Codeosurce 4.5.1+OpenOCD всё крутится под Calculate Linux).
Есть железка на stm32f107 и проект под неё написанный. На соседнем компьютере с аналогичным ПО (версии эклипса, кодсоурса по древнее будут) проект собирается, линкуется, заливается в контроллер и всё работает.
С обновлением на стадии линковки начинают лезть ошибки. Проект, все файлы в нём и скрипт линковки идентичны. Ошибки такие
Код
section .ARM.extab.text.__gxx_personality_v0 loaded at [0802e5d0,0802e5f3] overlaps section .init_array loaded at [0802e5d0,0802e5d7]
section .fini_array loaded at [0802e5d8,0802e5db] overlaps section .ARM.extab.text.__gxx_personality_v0 loaded at [0802e5d0,0802e5f3]
section .init loaded at [0802db0c,0802db17] overlaps section .data loaded at [0802db0c,0802e5cf]


Пробовал скормить стандартный сценарий generic.ld из состава Codesource, предварительно изменив количество памяти в тексте сценарии. Проект линкуется, создаёт объект, но на стадии заливки начинаются проблемы (section too long, если не изменяет память, чуть позже скину точный лог).

Кусочно объединить "родной" скрипт и generic.ld не удалось, ошибки.
Текст родного скрипта.

Linker Script

В силу слабого знакомства с предметом темы вообще слабо представлю логику происходящего(кроме того, что с адресацией памяти косяк).

Вопроса два:
Что поправить в "родном" скрипте?
Где бы найти картинку под мой stm32f107 аналогичную этой?
AHTOXA
Вот тут лежит рабочий скрипт для 107.
tdi@013h
Со скриптом из предыдущего поста получается вот так. Тоже на стадии линковки.
Код
opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text+0xa): undefined reference to `_exit'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x12): undefined reference to `_sbrk'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text+0x14): undefined reference to `_kill'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text+0x2c): undefined reference to `_getpid'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text+0x16): undefined reference to `_write'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text+0x12): undefined reference to `_close'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text+0x14): undefined reference to `_fstat'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text+0x12): undefined reference to `_isatty'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text+0x16): undefined reference to `_lseek'
/opt/codesource/arm-none-eabi/lib/thumb2/libc.a(lib_a-readr.o): In function `_read_r'


Решилось добавлением строк
Код
_sbrk = .;                        
               _write = .;                        
               _close = .;                        
               _fstat = .;                        
               _isatty = .;        
               _lseek = .;                        
               _read = .;
               _exit = .;
               _kill = .;
               _getpid = .;

В секцию .text

Спасибо за линк на рабочий скрипт.
AHTOXA
Цитата(tdi@013h @ Feb 8 2011, 17:46) *
Решилось добавлением строк
Код
_sbrk = .;                        
               _write = .;                        
               _close = .;                        
               _fstat = .;                        
               _isatty = .;        
               _lseek = .;                        
               _read = .;
               _exit = .;
               _kill = .;
               _getpid = .;

В секцию .text

Ну это не совсем корректный метод. Раз _sbrk() подцепился, значит где-то есть вызов malloc(). И значит программа рухнет при этом вызове.
Вот тут я приаттачивал минимальный набор системных заглушек. Добавьте этот файл к своему проекту, тогда всё будет правильно.
tdi@013h
Добавил syscalls, не взлетело. Жалуется на отсутствие всё тех же вызовов.

Пока собрал по своему варианту.
Через jtag цепляется, пишет скорости, пишет что всё стерто.
На этапе заливки начинает ругаться такими словами
Код
source /home/edd/workspace/OB7_NEW/target.ini
target extended-remote localhost:3333
Remote 'g' packet reply is too long: 753c7eb02f295aa5f532d266a4fdbf0e0eb4a4759e90273038c749e82d4d20465c1b8931542c8b12
1215b052acec5ae862e89d40fcffffffffffffffffffffff000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000020000001
monitor  soft_reset_halt
"monitor" command not supported by this target.
monitor reset halt
"monitor" command not supported by this target.
working_area 0 0x20000000 0x5000 nobackup
Undefined command: "working_area".  Try "help".
monitor sleep 500
"monitor" command not supported by this target.
monitor stm32x mass_erase 0
"monitor" command not supported by this target.
monitor sleep 500
"monitor" command not supported by this target.
load /home/evgen/Work_New/eclipse/OB7_NEW/Debug/ob7
You can't do that when your target is `exec'
monitor sleep 500
"monitor" command not supported by this target.
symbol-file /home/evgen/Work_New/eclipse/OB7_NEW/Debug/ob7
/home/evgen/Work_New/eclipse/OB7_NEW/Debug/ob7: \320\235\320\265\321\202 \321\202\320\260\320\272\320\276\320\263\320\276 \321\204\320\260\320\271\320\273\320\260 \320\270\320\273\320\270 \320\272\320\260\321\202\320\260\320\273\320\276\320\263\320\260.
monitor sleep 500
"monitor" command not supported by this target.
monitor sleep 500
"monitor" command not supported by this target.
b main
During symbol reading, debug info gives in-file macro definition with zero line 0: __STDC__ 1.
Breakpoint 1 at 0x80003aa: file ../main.cpp, line 85.
monitor  reset halt
"monitor" command not supported by this target.

Что оно от меня хочет?
Мой target.ini здесь.
http://rghost.ru/4266968

При попытке залить не объектник, а *.hex получаю такие ошибки
Код
Open On-Chip Debugger 0.4.0-rc2-dev-snapshot (2011-02-07-16:18)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html
trst_and_srst separate srst_gates_jtag trst_push_pull srst_open_drain
1000 kHz
jtag_nsrst_delay: 100
jtag_ntrst_delay: 100
Warn : use 'mychip' as target identifier, not '0'
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM-Pro V1.x compiled Nov 26 2009 20:13:00
Info : JLink caps 0xb9ff7bbf
Info : JLink hw version 3011000
Info : JLink max mem block 22976
Info : Vref = 3.306 TCK = 1 TDI = 0 TDO = 1 TMS = 0 SRST = 0 TRST = 0

Info : J-Link JTAG Interface ready
Info : clock speed 1000 kHz
Info : JTAG tap: auto0.tap tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: auto1.tap tap/device found: 0x06418041 (mfg: 0x020, part: 0x6418, ver: 0x0)
Info : mychip: hardware has 6 breakpoints, 4 watchpoints
Warn : mychip -- clearing lockup after double fault
Info : JTAG tap: auto0.tap tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: auto1.tap tap/device found: 0x06418041 (mfg: 0x020, part: 0x6418, ver: 0x0)
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
background polling: on
TAP: auto0.tap (enabled)
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
Info : device id = 0x10016418
Info : flash size = 256kbytes
stm32x mass erase complete
Info : accepting 'gdb' connection from 0
Warn : acknowledgment received, but no packet pending
Info : dropped 'gdb' connection - error -400

tdi@013h
При запуске тогоже самого через консоль та же байда.
AHTOXA
Цитата(tdi@013h @ Feb 9 2011, 15:38) *
Добавил syscalls, не взлетело. Жалуется на отсутствие всё тех же вызовов.

Как это так? wacko.gif Может куда-то не туда добавили?

Цитата(tdi@013h @ Feb 9 2011, 15:38) *
На этапе заливки начинает ругаться такими словами

Во-первых, покажите, как запускается openocd (параметры).
Во-вторых, в вот мой рабочий скрипт для gdb:
Код
target remote | openocd --pipe -f interface/arm-usb-ocd.cfg  -f target/stm32.cfg
load
monitor soft_reset_halt
set mem inaccessible-by-default off
compare-sections
tbreak main
continue

Поправьте интерфейс и таргет под свои реалии. Openocd при этом отдельно запускать не надо.
Если ничего не поможет, возьмите стабильную версию openocd, dev-snapshot - может и сам дурить.
tdi@013h
openocd запускается так.


openocd.cfg в аттаче.
tdi@013h
Откатился по openocd до 0.3.1, но лыжи по прежнему не едут.
tdi@013h
Пересобиранием openocd вылечилось. Теперь такая проблема с заливкой.
Если общаться с gdb через консоль, то нехитрая последовательность команд
Код
target remote localhost:3333
monitor soft_reset_halt
load /home/edd/workspace/OB7_NEW/Debug/ob7
b main
monitor soft_reset_halt

выполняется, и загружает прошивку в память железки.

При попытке сделать всё тоже самое через связку Eclipse+Zylin имеем ругань
Код
source /home/edd/workspace/OB7_NEW/target.cfg
target remote localhost:3333
Remote 'g' packet reply is too long: c80a00202f295aa5f53292e4a4ddbf0e0cb4a4779e
90377038c549e82d4c20065c1b8931542c8b121015b150a8e84ae862e89d40e4b90208ffffffff
1d000008000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000020000001
monitor soft_reset_halt
"monitor" command not supported by this target.
load /home/edd/workspace/OB7_NEW/Debug/ob7
You can't do that when your target is `exec'
b main
During symbol reading, debug info gives in-file macro definition with zero line 0: __STDC__ 1.
Breakpoint 1 at 0x80003aa: file ../main.cpp, line 85.
monitor soft_reset_halt
"monitor" command not supported by this target.


Куда смотреть?


Также прошу помощи по команде
Код
(gdb) monitor flash write_image erase unlock /home/edd/workspace/OB7_NEW/Debug/ob7 0x08000000
auto erase enabled
auto unlock enabled
No flash at address 0x10000000

No flash at address 0x1002e7d8

Как в консольном режиме ей указать адреса флэша?
AHTOXA
Цитата(tdi@013h @ Feb 22 2011, 17:03) *
Куда смотреть?

Может запускаете не тот gdb?
Цитата(tdi@013h @ Feb 22 2011, 17:03) *
Как в консольном режиме ей указать адреса флэша?

Так вроде в openocd.cfg указывается?
tdi@013h
К gdb путь явно прописал.
/opt/codesource/bin/arm-none-eabi-gdb
tdi@013h
Поздравьте.
Всю прошлую неделю насиловал "труп".
Проблема была с железякой.
AHTOXA
Бывает sm.gif
tdi@013h
Новую тему поднимать не буду, продолжу здесь.
С заливкой, запуском и скриптами вроде разобрался. имеется такая мистика:
Есть 2 машины. версии openocd, Codesourcery совпадают. (Немного отличаются версии ОС и эклипса)
Одинаковым компилятором на машинах собирается бинарник проекта(из одинаковых исходников) разной длинны(около 100 кбайт разницы),
соответственно проект неправильной длинны не запускается,
ибо не совпадают указатели на память.
Куда смотреть?
Сергей Борщ
QUOTE (tdi@013h @ Mar 1 2011, 14:36) *
Куда смотреть?
Сравнивать библиотеки, ключи компиляции, ключи линковки, ключи получения бинарника.
tdi@013h
Библиотеки армовские вместе с компилятором перетащил, скрипт линковки один, перетащен файлом(им же и зацеплен). Оптимизация кода поставлена в 0.
Есть разница в версиях Эклипса: 3.4.0 против 3.5.1
Настройки IDE перетащены методом поэкранного сравнивания и копипаста.

Для сравнения:

Правильно собранный бинарник
Код
text       data        bss        dec        hex
171064       2664       5024     178752      2ba40


И мой
Код
text       data        bss        dec        hex
169624       2664       5024     177312      2b4a0


Разница между секциями text и dec ровно 1440 байт.
Сергей Борщ
QUOTE (tdi@013h @ Mar 2 2011, 11:54) *
Есть разница в версиях Эклипса: 3.4.0 против 3.5.1
Настройки IDE перетащены методом поэкранного сравнивания и копипаста.
Дайте компилятору/линкеру ключ -v и сравнивайте внимательно ключи, с которыми он вызывается.
tdi@013h
Методом arm-none-eabi-readelf project -all >> log.txt
Получил информацию по собираемым бинарникам. Различия начинаются почти сразу.
Картинка
Справа правильный, слева неправильный бинарник
Скрипт компоновщика падла одинаковый.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.