реклама на сайте
подробности

 
 
> Проблемы с отладкой ATSAMS34C
RootSDF
сообщение May 22 2013, 07:08
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 18-11-10
Пользователь №: 61 004



В общем, подключаюсь отладчиком к контроллеру и наблюдаю следующую вещь: камень после старта прыгает по адресу 0x40003С попадая в где-то в первую половину таблицы векторов прерывания, затем выполняя ее как код доходит до функций лежащих сразу за таблицей, после чего благополучно падает в прерывание Hard fault. В таблице векторов прерывания, по крайней мере, адрес обработчика Reset Handler стоит верно. Почему контроллер вместо адреса 0x400118 (Reset handler) берет левый адрес?

В качестве отладчика J-Link, среда Eclipse IDE for C/C++ Developers Version: Juno Service Release 2 Build id: 20130225-0426, компилятор Yagarto binutils: 2.23.1, gcc: 4.7.2, newlib: 1.20.0, gdb: 7.5.1. Отлаживаю через GDB Hardware Debuging.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
RootSDF
сообщение May 22 2013, 08:53
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 18-11-10
Пользователь №: 61 004



Посмотрел логи GDB (J-link) сервера:

Connected to 127.0.0.1
Reading all registers
Read 4 bytes @ address 0x00000000 (Data = 0x2000B1E0)
Resetting target
Read 4 bytes @ address 0x00000000 (Data = 0x2000B1E0)
JTAG speed set to 6000 kHz
Target endianess set to "little endian"
Select flash device: AT91SAM3S4C
Flash breakpoints enabled
Downloading 16256 bytes @ address 0x00400000 - Verified OK
Downloading 9472 bytes @ address 0x00403F80 - Verified OK
Downloading 56 bytes @ address 0x00406480 - Verified OK
Writing register (PC = 0x00400000)
Read 4 bytes @ address 0x00000000 (Data = 0x2000B1E0)
Read 4 bytes @ address 0x00000004 (Data = 0x00400119)
Read 4 bytes @ address 0x00000008 (Data = 0x004000CD)
Read 4 bytes @ address 0x0000000C (Data = 0x004000D5)
Read 4 bytes @ address 0x00000010 (Data = 0x004000DD)
Read 4 bytes @ address 0x00000014 (Data = 0x004000E5)
Read 4 bytes @ address 0x00000018 (Data = 0x004000ED)
Read 4 bytes @ address 0x0000001C (Data = 0x00000000)
Read 4 bytes @ address 0x00000020 (Data = 0x00000000)
Read 4 bytes @ address 0x00000024 (Data = 0x00000000)
Read 4 bytes @ address 0x00000028 (Data = 0x00000000)
Read 4 bytes @ address 0x0000002C (Data = 0x004000F5)

получается что отладчик сам меняет значение регистра PC на 0x00400000.
На каком этапе и кто это может делать?

Провел эксперимент: взял старую версию ПО написанную еще на IAR`е. IAR c J-Link работает напрямую, не через GDB сервер.
Попытался ее отладить на контроллере. Среда выдает предупреждения что прошивка записалась неправильно.
При этом он останавливается по правильному адресу 0x400118.
Получается что все таки адрес береться правильно. Почему он в режиме работы через GDB меняется на 0x400000?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2013, 11:18
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (RootSDF @ May 22 2013, 11:53) *
получается что отладчик сам меняет значение регистра PC на 0x00400000.
На каком этапе и кто это может делать?
Посмотрите, нет ли в вашем скрипте линкера строки ENTRY(0x00400000)?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
RootSDF
сообщение May 22 2013, 12:38
Сообщение #4





Группа: Новичок
Сообщений: 4
Регистрация: 18-11-10
Пользователь №: 61 004



Решить проблему получилось добавлением команды "monitor reset" сразу после загрузки образа ПО командой "load".
Из того что я наблюдал в логах GDB сервера (J-link) и логах в консоли (Eclipse):

1971 load
&"load\n"
load
~"Loading section .text, size 0x3b90 lma 0x400000\n"
Loading section .text, size 0x3b90 lma 0x400000
1971+download,{section=".text",section-size="15248",total-size="481233"}
~"Loading section .relocate, size 0x38 lma 0x403b90\n"
Loading section .relocate, size 0x38 lma 0x403b90
1971+download,{section=".relocate",section-size="56",total-size="481233"}
~"Start address 0x400000, load size 15304\n"
Start address 0x400000, load size 15304
~"Transfer rate: 7472 KB/sec, 7652 bytes/write.\n"
Transfer rate: 7472 KB/sec, 7652 bytes/write.
1971^done

после загрузки ПО регистр pc автоматически загружается значением 0x400000. Что мне и мешало.
Строки ENTRY в скрипте линкера я не нашел.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2013, 12:51
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (RootSDF @ May 22 2013, 15:38) *
Строки ENTRY в скрипте линкера я не нашел.
Возможно в этом и была проблема. Эта строка должна содержать что-то вроде ENTRY(Reset_Handler), где Reset_Handler - имя функции, чей адрес заносится в ячейку 0x00400004



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 13:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016