Перейти к содержанию
    

Проблемы с адресацией памяти.

Здравствуйте уважаемые форумчане. Свалилась на меня задача обновления комплекса ПО (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 аналогичную этой?

Fig_09-01.png

Изменено пользователем 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

 

Спасибо за линк на рабочий скрипт.

Изменено пользователем tdi@013h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решилось добавлением строк

_sbrk = .;                        
               _write = .;                        
               _close = .;                        
               _fstat = .;                        
               _isatty = .;        
               _lseek = .;                        
               _read = .; 
               _exit = .;
               _kill = .;
               _getpid = .;

В секцию .text

Ну это не совсем корректный метод. Раз _sbrk() подцепился, значит где-то есть вызов malloc(). И значит программа рухнет при этом вызове.

Вот тут я приаттачивал минимальный набор системных заглушек. Добавьте этот файл к своему проекту, тогда всё будет правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При запуске тогоже самого через консоль та же байда.

image.png

Изменено пользователем tdi@013h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил syscalls, не взлетело. Жалуется на отсутствие всё тех же вызовов.

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

 

На этапе заливки начинает ругаться такими словами

Во-первых, покажите, как запускается 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 - может и сам дурить.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

openocd запускается так.

image.png

 

openocd.cfg в аттаче.

openocd.txt

Изменено пользователем 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

Как в консольном режиме ей указать адреса флэша?

Изменено пользователем tdi@013h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Может запускаете не тот gdb?

Как в консольном режиме ей указать адреса флэша?

Так вроде в openocd.cfg указывается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Новую тему поднимать не буду, продолжу здесь.

С заливкой, запуском и скриптами вроде разобрался. имеется такая мистика:

Есть 2 машины. версии openocd, Codesourcery совпадают. (Немного отличаются версии ОС и эклипса)

Одинаковым компилятором на машинах собирается бинарник проекта(из одинаковых исходников) разной длинны(около 100 кбайт разницы),

соответственно проект неправильной длинны не запускается,

ибо не совпадают указатели на память.

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

Изменено пользователем tdi@013h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...