U-Boot: приложение вылетает - но почему

Я пытаюсь запустить автономное приложение для U-Boot.

Цель — это кирпичик LEGO EV3 с процессором TI OMAP (ARM9).

Вывод U-Boot перед зависанием:

U-Boot > fatload mmc 0:1 c0007FC0 uimage
reading uimage

384 bytes read
U-Boot > bootm
## Booting kernel from Legacy Image at c0007fc0 ...
   Image Name:   ITK EV3 sample OS
   Image Type:   ARM Linux Standalone Program (uncompressed)
   Data Size:    320 Bytes =  0.3 kB
   Load Address: c0008000
   Entry Point:  c0008000
   Loading Standalone Program ... OK
OK

Я попытался выполнить следующие команды для размещения по адресу 0xC0008000 в «uimage»:

mov pc, lr (ARM code)
bx lr (ARM code)
bx lr (Thumb code)

Эти команды должны просто возвращаться (в зависимости от того, активен ли режим ARM или Thumb). Однако все три команды приводят к зависанию U-Boot, поэтому после последнего «ОК» вывод больше не выполняется.

Почему U-Boot зависает?


person Martin Rosenau    schedule 22.01.2014    source источник
comment
В U-Boot автономный означает двоичный образ, такой как пример hello_world.bin. Такие загруженные двоичные файлы выполняются с помощью команды go. Загруженные изображения/файлы, выполняемые с помощью команды bootm, должны иметь установленную оболочку U-Boot, обычно являются ядрами ОС и могут подвергаться специальной обработке, выполняемой перед выполнением. См. это. Вместо того, чтобы указывать linux в качестве типа ОС в команде mkimage, попробуйте указать u-boot или просто опустите спецификацию ОС.   -  person sawdust    schedule 23.01.2014


Ответы (1)


Сам нашел ответ:

В версии u-boot, используемой на блоке EV3, есть ошибка: начальный адрес, который уже преобразован в прямой, преобразуется дважды, так что результат, конечно же, неправильный.

При сохранении числа с прямым порядком байтов в файле вывод u-boot будет неправильным:

   Image Type:   ARM Linux Standalone Program (uncompressed)
   Data Size:    320 Bytes =  0.3 kB
   Load Address: c0008000
   Entry Point:  008000c0               <--- actually 0xC0008000!!!
   Loading Standalone Program ... OK
OK
U-Boot >

однако загрузка будет работать. Эта ошибка затрагивает только автономные программы, а не ядра Linux.

Моя проблема в том, что программа, возможно, будет опубликована, поэтому она должна работать как с глючной, так и с исправленной версией u-boot.

Поэтому я думаю о загрузке программы по адресу, например

0xC00101C0

который хранится с прямым и обратным порядком байтов одинаково.

person Martin Rosenau    schedule 23.01.2014