ARM M4 разветвляется на нечитаемый адрес сразу после сброса - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над проектом для Silicon Labs Thunderboard React (RD0057), на котором установлен процессор EFR32BG1xxxF256 (Cortex M4).

Недавно, когда я начал программировать плату и отлаживать кодсразу переходит в грубую ошибку перед входом в основной.(IACCVIOL и STKERR оба установлены).

Я:

  • Вернул код к предыдущей версии, которую я знаю, скомпилирован и запущен
  • Попробовал другую плату у меня
  • Использовал адаптер J-Link, чтобы полностью стереть флэш-память и перепрограммировать ее
  • Попробовал пустой пример проекта

Все с тем же результатом

Затем я прошел по коду и увидел, что сразу после сброса кода:

  • начиная с адреса 0xf210000
  • некоторые случайные, казалось бы, не связанные вещи (4 строки)
  • загружает R3 с 0x4
  • загружает R2 с R3 (после выполнения этого R2 показывает 0xFFFFF в отладчике)
  • bx R2 (который разветвляется на ffffffe0, который говорит «Fail to read memory» и запускает жесткий диск)ошибка)

Инструменты: - Thunderboard React RD0057 - WSTK 4001A Rev A01 (функционирует как адаптер J-Link) - Simplicity Studio - Bluetooth SDK 2.10.1

Мне нужно потренироватьсяспособ опубликовать мой код позже сегодня вечером, но звучит ли этот вопрос знакомо кому-нибудь?Я думаю, что это может быть не связано с кодом, потому что это произошло в известных хороших версиях проекта и в пустых примерах проектов.Любая помощь приветствуется.

Обновление 1:

Pastebin of Start of Binary , выдержка из первых трех записей:

007c 0020 4da0 0000 49a0 0000 49a0 0000
49a0 0000 49a0 0000 49a0 0000 49a0 0000
49a0 0000 49a0 0000 49a0 0000 49a0 0000

Я проверил двоичный файлкак и предполагалось, и первые несколько записей кажутся векторной таблицей (группа 0x49A0, которая, как я полагаю, переводит загрузку адресов в регистры).

Затем я использовал J-link "J-Mem" для считыванияпамять чипа.Это показало все 0xFFFF после программирования чипа с помощью IDE (пустой чип).Затем я использовал утилиту командной строки J-Link для прошивки двоичного файла с начальным адресом, установленным в 0x00.Затем снова прочитайте память, и это выглядит успешно, содержимое совпадает с файлом bin.Выполнение этого показывает, что я преодолел ту первую загрузку и ветвление, которые раньше вызывали серьезную ошибку, но теперь выполняю еще одну серьезную ошибку в другом месте.

  • Необходимо определить, почему среда IDE не удалась при программировании кода.Предполагая, что что-то установлено неправильно со смещением, потому что кажется, что он полностью отсутствует в диапазоне адресов флэш-памяти.
  • Необходимо определить, где происходит эта новая серьезная ошибка и является ли она ошибкой моего кода или другой странной вещью.

1 Ответ

0 голосов
/ 07 декабря 2018

если у вас есть GNU binutils, построенный для руки / большого пальца, возьмите это

.thumb
.thumb_func
.global _start
_start:
.word 0x20001000
.word reset
.word hang
.word hang
.word hang
.thumb_func
reset:
    nop
    nop
    nop
    nop
    nop
    b reset
.thumb_func
hang:   b .

постройте его

arm-none-eabi-as flash.s -o flash.o
arm-none-eabi-ld -Ttext=0 flash.o -o flash.elf
arm-none-eabi-objdump -D flash.elf > flash.list
arm-none-eabi-objcopy flash.elf -O binary flash.bin

не обязательно должно быть рукой - нет, это может быть рукой-linux-gnueabi или что-то вроде arm-кое-что.

проверьте файл списка, это то, что вы ищете для загрузки cortex-m.

00000000 <_start>:
   0:   20001000    andcs   r1, r0, r0
   4:   00000015    andeq   r0, r0, r5, lsl r0
   8:   00000021    andeq   r0, r0, r1, lsr #32
   c:   00000021    andeq   r0, r0, r1, lsr #32
  10:   00000021    andeq   r0, r0, r1, lsr #32

00000014 <reset>:
  14:   46c0        nop         ; (mov r8, r8)
  16:   46c0        nop         ; (mov r8, r8)
  18:   46c0        nop         ; (mov r8, r8)
  1a:   46c0        nop         ; (mov r8, r8)
  1c:   46c0        nop         ; (mov r8, r8)
  1e:   e7f9        b.n 14 <reset>

00000020 <hang>:
  20:   e7fe        b.n 20 <hang>

первое слово во флэш-памяти получаетзагруженный в указатель стека для вас, вы можете изменить указатель стека в вашем коде начальной загрузки, если хотите, это просто сохраняет шаг.Следующим должен быть адрес для сброса или с 1, должен быть установлен lsbit.Сброс на 0x0014 выше, поэтому вектор сброса должен иметь 0x0014 | 1 = 0x0015.

Остальные векторы не имеют значения, чтобы вы загрузились.этот помещает его в простой бесконечный цикл, который вы можете остановить и возобновить с помощью отладчика и, по возможности, найти его по разным адресам при повторении остановки и возобновления.

возможно, проще загрузить файл elf, чем файл bin сотладчикно в то же время инструмент может не писать правильно, используйте инструмент для вывода нескольких слов, начиная с 0x00000000

Если ваш двоичный файл не начинается с таблицы векторов и / или если таблица векторов имеетчетные адреса в нем сойдут с рельсов сразу после сброса.

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

...