Hello,

I experienced problems with the floating point package.
If I use a cast from float to integer, the msp430 totally crashes.

This cast uses the __fixunssfsi subroutine, which in turn calles
the __fixsfsi routine. Code of this routine is included below.
The first command and the last command before ret indicate
that it needs 12 additional bytes on the stack. This additional
stack space however does not seem to be reserved properly.

In particular I had a look how the stack pointer is initialized an
I found out that the 12 up most bytes of the msp430f149 are
NOT used. The code generated by the compiler initializes r1
with the value 2548; the up most byte of the ram is 2559 instead,
so I would expect r1 to be initialized at 2560. (Note: the 149 has
2048Bytes Ram + 512bytes SFR).

Comparing these 12 bytes offset with the 12 bytes the __fixsfsi
needs additional stack space I became curios and tried some
tricks in order to get the stackpointer initialized at 2560.
Adding RESERVE_RAM(-12) does the job. I was a bit surprised
that the compiler allowed me to consume this neg. amount of bytes
above the stack, but the result was

(a) the sp get properly initialized at 2560

(b) the float to int cast no longer crashes the msp430 into  nowhere land.

Greetings.

00003b26 <__fixsfsi>:
   3b26:    31 80 0c 00     sub    #12,    r1    ;#0x000c
   3b2a:    81 4e 08 00     mov    r14,    8(r1)    ;
   3b2e:    81 4f 0a 00     mov    r15,    10(r1)    ;
   3b32:    0e 41           mov    r1,    r14    ;
   3b34:    0f 41           mov    r1,    r15    ;
   3b36:    3f 52           add    #8,    r15    ;r2 As==11
   3b38:    b0 12 7a 3d     call    #15738        ;#0x3d7a
   3b3c:    0e 43           clr    r14        ;
   3b3e:    6f 41           mov.b    @r1,    r15    ;
   3b40:    6f 93           cmp.b    #2,    r15    ;r3 As==10
   3b42:    3a 24           jz    $+118        ;abs 0x3bb8
   3b44:    0e 93           cmp    #0,    r14    ;r3 As==00
   3b46:    33 20           jnz    $+104        ;abs 0x3bae
   3b48:    0e 43           clr    r14        ;
   3b4a:    6f 93           cmp.b    #2,    r15    ;r3 As==10
   3b4c:    01 2c           jc    $+4          ;abs 0x3b50
   3b4e:    1e 43           mov    #1,    r14    ;r3 As==01
   3b50:    0e 93           cmp    #0,    r14    ;r3 As==00
   3b52:    2d 20           jnz    $+92         ;abs 0x3bae
   3b54:    0e 43           clr    r14        ;
   3b56:    6f 92           cmp.b    #4,    r15    ;r2 As==10
   3b58:    2d 24           jz    $+92         ;abs 0x3bb4
   3b5a:    0e 93           cmp    #0,    r14    ;r3 As==00
   3b5c:    07 20           jnz    $+16         ;abs 0x3b6c
   3b5e:    1d 41 02 00     mov    2(r1),    r13    ;
   3b62:    0d 93           cmp    #0,    r13    ;r3 As==00
   3b64:    24 38           jl    $+74         ;abs 0x3bae
   3b66:    3d 90 1f 00     cmp    #31,    r13    ;#0x001f
   3b6a:    0b 38           jl    $+24         ;abs 0x3b82
   3b6c:    c1 93 01 00     cmp.b    #0,    1(r1)    ;r3 As==00
   3b70:    04 24           jz    $+10         ;abs 0x3b7a
   3b72:    0e 43           clr    r14        ;
   3b74:    3f 40 00 80     mov    #-32768,r15    ;#0x8000
   3b78:    21 3c           jmp    $+68         ;abs 0x3bbc
   3b7a:    3e 43           mov    #-1,    r14    ;r3 As==11
   3b7c:    3f 40 ff 7f     mov    #32767,    r15    ;#0x7fff
   3b80:    1d 3c           jmp    $+60         ;abs 0x3bbc
   3b82:    3c 40 1e 00     mov    #30,    r12    ;#0x001e
   3b86:    1e 41 04 00     mov    4(r1),    r14    ;
   3b8a:    1f 41 06 00     mov    6(r1),    r15    ;
   3b8e:    0c 8d           sub    r13,    r12    ;
   3b90:    0c 93           cmp    #0,    r12    ;r3 As==00
   3b92:    05 24           jz    $+12         ;abs 0x3b9e
3b94: 12 c3 clrc 3b96: 0f 10 rrc r15 ;
   3b98:    0e 10           rrc    r14        ;
   3b9a:    1c 83           dec    r12        ;
   3b9c:    fb 23           jnz    $-8          ;abs 0x3b94
   3b9e:    c1 93 01 00     cmp.b    #0,    1(r1)    ;r3 As==00
   3ba2:    0c 24           jz    $+26         ;abs 0x3bbc
   3ba4:    3e e3           inv    r14        ;
   3ba6:    3f e3           inv    r15        ;
   3ba8:    1e 53           inc    r14        ;
   3baa:    0f 63           adc    r15        ;
   3bac:    07 3c           jmp    $+16         ;abs 0x3bbc
   3bae:    0e 43           clr    r14        ;
   3bb0:    0f 43           clr    r15        ;
   3bb2:    04 3c           jmp    $+10         ;abs 0x3bbc
   3bb4:    1e 43           mov    #1,    r14    ;r3 As==01
   3bb6:    d1 3f           jmp    $-92         ;abs 0x3b5a
   3bb8:    1e 43           mov    #1,    r14    ;r3 As==01
   3bba:    c4 3f           jmp    $-118        ;abs 0x3b44
   3bbc:    31 50 0c 00     add    #12,    r1    ;#0x000c
3bc0: 30 41 ret

Reply via email to