I'm using:

u...@instant-contiki:~/contiki-2.x/examples/udp-ipv6$ sdcc -v
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 
2.9.4 #5556 (Oct 29 2009) (UNIX)


compile flags are:

sdcc --codeseg BANK1 --std-c99 --model-large --stack-auto  -c 
../../cpu/cc2430/dev/cc2430_rf.c -o obj-brione/cc2430_rf.o
sdcc --codeseg HOME --std-c99 --model-large --stack-auto  -c 
../../cpu/cc2430/dev/cc2430_rf_intr.c -o obj-brione/cc2430_rf_intr.o

In the following routines, I see incorrect variable passing on the stack.

int cc2430_rf_send(void *data, unsigned short len);
int cc2430_rf_send_b (void *data, unsigned short len) __banked;

int
cc2430_rf_send(void *payload, unsigned short payload_len)
{
   printf("sending %x bytes.\n",payload_len);
   printf("payload addr %08lx.\n", payload);
   return cc2430_rf_send_b(payload, payload_len);
}




int
cc2430_rf_send_b(void *payload, unsigned short payload_len) __banked
{
   uint8_t i, counter;
   printf("sending %x bytes.\n",payload_len);
   printf("payload addr %08lx.\n", payload);
  }

In the assembly for cc2430_rf_send  the payload arg is mov'd to dpl, 
dph, b instead of pushed on the stack;
                             996 
;------------------------------------------------------------
                             997 ;Allocation info for local variables in 
function 'cc2430_rf_send'
                             998 
;------------------------------------------------------------
                             999 ;payload_len               Allocated to 
stack - offset -4
                            1000 ;payload                   Allocated to 
registers r2 r3 r4
                            1001 
;------------------------------------------------------------
                            1002 ;       
../../cpu/cc2430/dev/cc2430_rf_intr.c:123: cc2430_rf_send(void *payload, 
unsigned short payload_len)
                            1003 ;       
-----------------------------------------
                            1004 ;        function cc2430_rf_send
                            1005 ;       
-----------------------------------------
    01E7                    1006 _cc2430_rf_send:

<calls to printf deleted>

    0240 D0 04              1054         pop     ar4
    0242 D0 03              1055         pop     ar3
    0244 D0 02              1056         pop     ar2
                            1057 ;       
../../cpu/cc2430/dev/cc2430_rf_intr.c:127: return 
cc2430_rf_send_b(payload, payload_len);
    0246 E5*00              1058         mov     a,_bp
    0248 24 FC              1059         add     a,#0xfc
    024A F8                 1060         mov     r0,a
    024B E6                 1061         mov     a,@r0
    024C C0 E0              1062         push    acc
    024E 08                 1063         inc     r0
    024F E6                 1064         mov     a,@r0
    0250 C0 E0              1065         push    acc
    0252 8A 82              1066         mov     dpl,r2
    0254 8B 83              1067         mov     dph,r3
    0256 8C F0              1068         mov     b,r4
    0258 78r00              1069         mov     r0,#_cc2430_rf_send_b
    025A 79s00              1070         mov     r1,#(_cc2430_rf_send_b 
 >> 8)
    025C 7As00              1071         mov     r2,#(_cc2430_rf_send_b 
 >> 16)
    025E 12s00r00           1072         lcall   __sdcc_banked_call




                            1087 
;------------------------------------------------------------
                            1088 ;Allocation info for local variables in 
function 'cc2430_rf_send_b'
                            1089 
;------------------------------------------------------------
                            1090 ;payload_len               Allocated to 
stack - offset -4
                            1091 ;payload                   Allocated to 
stack - offset 1
                            1092 ;i                         Allocated to 
registers r5
                            1093 ;counter                   Allocated to 
registers r2
                            1094 
;------------------------------------------------------------
                            1095 ;       
../../cpu/cc2430/dev/cc2430_rf.c:158: cc2430_rf_send_b(void *payload, 
unsigned short payload_len) __banked
                            1096 ;       
-----------------------------------------
                            1097 ;        function cc2430_rf_send_b
                            1098 ;       
-----------------------------------------
    0254                    1099 _cc2430_rf_send_b:
    0254 C0*00              1100         push    _bp
    0256 85 81*00           1101         mov     _bp,sp
    0259 C0 82              1102         push    dpl
    025B C0 83              1103         push    dph
    025D C0 F0              1104         push    b
                            1105 ;       
../../cpu/cc2430/dev/cc2430_rf.c:161: printf("sending %x 
bytes.\n",payload_len);
    025F E5*00              1106         mov     a,_bp
    0261 24 FC              1107         add     a,#0xfc
    0263 F8                 1108         mov     r0,a
    0264 E6                 1109         mov     a,@r0
    0265 C0 E0              1110         push    acc
    0267 08                 1111         inc     r0
    0268 E6                 1112         mov     a,@r0
    0269 C0 E0              1113         push    acc
    026B 74r0A              1114         mov     a,#__str_0


Program output is
sending 2d bytes.
payload_len addr 40006b00.
sending 9000 bytes.
payload addr 00e09100.



------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to