Anthony,

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

Ok.

> 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.

No, rf_send_b wants payload at SP+1 (plus 1) and it puts it there 
itself at the start of the function when receiving DPL/DPH/B. It 
treats payload as a local variable.

>   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
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to