Anthony,

I see no problem with payload being sent through 
DPL/DPH/B. It is properly assigned when sending in 
cc2430_rf_send() and properly read and put on stack when 
receiving in cc2430_rf_send_b(). Are you messing up DPTR 
or B or the stack in your adapted __sdcc_banked_call 
except the one push of the current bank?

Btw. Did you know that sdcc can also printf pointers 
with %p?

Maarten

> 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