[fpc-pascal] arm big endian questions and info

Terry Kemp tkemp at klc.net.nz
Mon Mar 12 20:31:34 CET 2007


On Mon, 2007-03-12 at 16:41 +0000, Henry Vermaak wrote:
> > > these results are (everything compiled with -CfSOFT for big endian):
> > >
> > > 1)  writeln('Hello World') outputs "Hello WorldHello W".  all other
> > > writeln and readln calls seem to work after that.
> > >
> > > 2)  i get "Runtime error 207" when i attempt floating point operations.
> >
> > Try to get a stack trace please.
> >
Interesting. I was about to send the following... 

I played around on the weekend with several toolchains and multiple
cross-compile options (with / without -Ce, -CfSOFT etc) . With all of
these (arm-xscale-linux-gnu-, armv5b-softfloat-linux-, armeb-linux- and
armbe-linux-) I was getting runtime 207s with float. testing program
with qemu-armeb gave same result as running on (NSLU2) board.

FWIW arm-xscale-linux-gnu- in little endian with -CfSOFT seems work fine
in qemu-arm emulator


Changing endian_little to endian_big in compiler/systems/i_linux.pas
(which I believe is the correct thing to do for big endian arm systems)
results in bizarre output and hanging / segfaults.
A simple writeln('hello') outputs the string twice - hellohello without
CRLF - then - if set to writeln a float value as well - on qemu-armeb it
displays 2 of each hellohello0.0000.000 (without line feeds) - on NSLU2
board it hangs... hellohello - stuck forever.

My suspicion is that endian_big /needs/ to be defined in
compiler/systems/i_linux.pas but it severely breaks stuff. There may be
some {$IFDEF arm} that bypasses endian defs or the big endian bit
rotation is wrong for arm??  

What I would like to know is what the alignment stuff...
            alignment    :
              (
                procalign       : 4;
                loopalign       : 4;
                jumpalign       : 0;
                constalignmin   : 0;
                constalignmax   : 4;
                varalignmin     : 0;
                varalignmax     : 4;
                localalignmin   : 4;
                localalignmax   : 8;
                recordalignmin  : 0;
                recordalignmax  : 4;
                maxCrecordalign : 4
              );
            first_parm_offset : 8;
            stacksize    : 262144;
            abi : abi_default
          );
does and if it needs to be changed for a big endian arm.

FWIW I have a prototype industrial evaporator running using a NSLU2 as
the controller. I am using a 2.0.5 fpc-armbe compiler with the
endian_big define set. The only issue I have is with float so I had to
use fixed point for analog data. It goes well though.

Terry




More information about the fpc-pascal mailing list