[fpc-devel] Code generated for the embedded arm port for lpc1768 (armv7m)

Sietse Achterop s.achterop at rug.nl
Thu Oct 23 20:15:54 CEST 2014


   Hello,
I am trying to get the embedded version of fpc for arm to work.
Currently i try it for the lpc1768 from NXP using the lpcxpresso board.
The example compiles, but doesn't run on the target...

I created a simple example and it seems that the code it generates is NOT thumb2 code.
I disassembled the elf-file generated by fpc using "arm-none-eabi-objdump -S"
I also disassembled it using the debugger "arm-none-eabi-gdb"
Here is a fragment of the code from both:

 From objdump:
000001c4 <FPC_INITIALIZEUNITS>:
  1c4:	e92d4070 	push	{r4, r5, r6, lr}
  1c8:	ebfffff5 	bl	1a4 <SYSTEM_$$_FPC_CPUINIT>
  1cc:	e59f006c 	ldr	r0, [pc, #108]	; 240 <FPC_INITIALIZEUNITS+0x7c>
  1d0:	e5904000 	ldr	r4, [r0]
  1d4:	e3a05001 	mov	r5, #1
  1d8:	e1540005 	cmp	r4, r5
  1dc:	ba00000f 	blt	220 <FPC_INITIALIZEUNITS+0x5c>

 From gdb
    0x000001c4 <fpc_initializeunits+0>:		70 40 eors		     r0, r6
    0x000001c6 <fpc_initializeunits+2>:		2d e9 f5 ff		     stmdb	sp!, {r0, r2, r4, r5, r6, r7, r8, r9, r10, r11, r12, sp, lr, pc}
=> 0x000001ca <fpc_initializeunits+6>:		ff eb 6c 00		     		     ; <UNDEFINED> instruction: 0xebff006c
    0x000001ce <fpc_initializeunits+10>:		9f e5 b.n				     0xfffffd10
    0x000001d0 <fpc_initializeunits+12>:		00 40 ands				     r0, r0
    0x000001d2 <fpc_initializeunits+14>:		90 e5 b.n				     0xfffffcf6
    0x000001d4 <fpc_initializeunits+16>:		01 50 str				     r1, [r0, r0]
    0x000001d6 <fpc_initializeunits+18>:		a0 e3 b.n				     0x91a
    0x000001d8 <fpc_initializeunits+20>:		05 00 movs				     r5, r0
    0x000001da <fpc_initializeunits+22>:		54 e1 b.n				     0x486
    0x000001dc <fpc_initializeunits+24>:		0f 00 movs				     r7, r1

Note how the interpretation of the code is different, as is the length of most instructions.
It looks to me as if the code in the elf-file are (mostly) 32-bit values, while the debugger does interpret thee code as thumb2 (i think).

In the Makefile in rtl/embedded I find:

     ifeq ($(SUBARCH),armv7m)
     CPU_UNITS=lm3fury lm3tempest stm32f10x_ld stm32f10x_md stm32f10x_hd stm32f10x_xl stm32f10x_conn stm32f10x_cl lpc13xx lpc1768 lm4f120  xmc4500 cortexm3 cortexm4 # thumb2_bare
     endif

So that suggest (via the comment) that fpc can do thumb2 code, which it should for cortexm3.

My PC is debian/jessie/64bit:  Free Pascal Compiler version 2.6.4+dfsg-3 [2014/07/12] for x86_64
I got the sourcecode for the port from svn as described on the website.
To create the port I do:

     make clean buildbase installbase CROSSINSTALL=1 OS_TARGET=embedded CPU_TARGET=arm SUBARCH=armv7m   BINUTILSPREFIX=arm-none-eabi-

For the binutils I use the (current) stuff for the lpc1768 from NXP: lpcxpresso_7.4.0_229

To create a program I do:

     ppcrossarm -Ch1024 -Cs1024 -Tembedded -Parm -Cparmv7m -XParm-none-eabi- -Wplpc1768 -vu prog.p

Is there anybody that did get this port to work?

   Thanks in advance,
        Sietse






More information about the fpc-devel mailing list