I didn't need to adapt the __sdcc_banked_call routine, I was able to use the provided example unmodified.

rf_send_b is expecting payload_len to be at SP -4 and payload to be at SP -1. rf_send doesn't put payload on the stack at all so rf_send_b doesn't find payload_len in the correct position.

 Maarten Brock wrote:
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user

------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to