Loading RTEMS-application with U-boot on Raspberry Pi or MicroZed
Jan Sommer
soja-lists at aries.uberspace.de
Tue Apr 12 20:55:43 UTC 2016
Am Tuesday 12 April 2016, 08:07:35 schrieb Sebastian Huber:
> On 11/04/16 15:43, Jan Sommer wrote:
> > I just tried the same setup with the Xilinx MicroZed board at work.
> > There, the same behaviour appears.
> > If I compile a simple bare metal application I can load the binary to
> > the correct address and run it or load the elf-file somewhere into the
> > memory and use the bootelf-command to start the application.
> > If I try to do the same with a compiled RTEMS-application, it won't
> > work. The same RTEMS-application runs if I put it directly into the
> > bootimage (without using u-boot).
> >
> > How does it work on other ARM-boards? The BeagleBone uses u-boot to
> > load all its binaries, doesn't it?
>
> You have to specify the correct entry and load addresses for the
> mkimage. For example:
>
Ok. If I try to follow that procedure, I have:
readelf -l blinker-rtems.exe
Elf file type is EXEC (Executable file)
Entry point 0x8040
There are 4 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x010014 0x00100c54 0x00100c54 0x00008 0x00008 R 0x4
LOAD 0x0000b4 0x00000000 0x00000000 0x00000 0x01440 RW 0x1
LOAD 0x0000b4 0x00008000 0x00008000 0x0f300 0xf8000 RWE 0x4
LOAD 0x00f3c0 0x00100000 0x00100000 0x01280 0x7efc000 RW 0x20
Section to Segment mapping:
Segment Sections...
00 .ARM.exidx
01 .vector
02 .start .text .init .fini .robarrier
03 .rodata .ARM.exidx .eh_frame .init_array .fini_array .jcr .rtemsroset .data .bss .work
.start is in section 02, hence my load address would be 0x8000 and the entry point is 0x8040 (I hope I got that right?).
If I create my image using:
mkimage -A arm -O rtems -T standalone -C none -a 0x8000 -e 0x8040 -d blinker-rtems.exe blinker-rtems.img
And load it via u-boot with
fatload mmc 0:1 ${kernel_addr_r} blinker-rtems.img
bootm ${kernel_addr_r}
It either hangs after Transferring control to RTEMS or resets with:
## Booting kernel from Legacy Image at 01000000 ...
Image Name: blinker1
Image Type: ARM RTEMS Standalone Program (uncompressed)
Data Size: 3494208 Bytes = 3.3 MiB
Load Address: 00008000
Entry Point: 00008040
Verifying Checksum ... OK
Loading Standalone Program ... OK
## Transferring control to RTEMS (at address 00008040) ...
data abort
pc : [<19273304>]\0x09 lr : [<1bf59eb0>]
reloc pc : [<fd330304>]\0x09 lr : [<00016eb0>]
sp : 1bb46c00 ip : 00000520\0x09 fp : 1bf59e84
r10: 00000000 r9 : 1bb46ee8\0x09 r8 : 400001d3
r7 : 1bb475bc r6 : 1bf59e84\0x09 r5 : 1bf912bc r4 : 00000000
r3 : 00000002 r2 : 00000000\0x09 r1 : 00000000 r0 : 400001d3
Flags: nZcv IRQs off FIQs off Mode SVC_32
Resetting CPU ...
resetting ...
Again, if I follow the same procedure with the simple bare metal application, it works.
Best regards,
Jan
> readelf -l ticker.exe
>
> Elf file type is EXEC (Executable file)
> Entry point 0x400145
> There are 5 program headers, starting at offset 52
>
> Program Headers:
> Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
> EXIDX 0x00ec70 0x0040eb70 0x0040eb70 0x00008 0x00008 R 0x4
> LOAD 0x000100 0x00400000 0x00400000 0x0ebc4 0x0ebc4 RWE 0x40
> LOAD 0x00ecc8 0x20401148 0x0040ebc4 0x006a4 0x006a4 RW 0x8
> LOAD 0x00f380 0x20400000 0x20400000 0x00000 0x5f000 RW 0x20
> LOAD 0x00f36c 0x2045f000 0x2045f000 0x00000 0x01000 RW 0x1
>
> Section to Segment mapping:
> Segment Sections...
> 00 .ARM.exidx
> 01 .start .text .init .fini .rodata .ARM.exidx .eh_frame
> .init_array .fini_array .jcr .rtemsroset
> 02 .data
> 03 .vector .bss .work
> 04 .xbarrier .robarrier .rwbarrier .stack .nocachenoload
>
> Then use:
>
> mkimage -a 0x00400000 -e 0x400145
>
>
More information about the users
mailing list