i am using an 89v51rd2 controller with out external RAM, i use the following reentrant function for one of the functionalities, i cant avoid it because this function can be recursively called any no of times,
void reentrantfunction(unsigned char data1, unsigned char data2) compact reentrant { unsigned char local1, local2 = 0;
if(data2) statements;
switch(data2) { case 0: ……. break; ………… case 5: ….. break; } Function2();
for(local1=0; (local1<25); local1++) { Function3();
if(global1) { Global2[local2] = local1; local2++; } Global3 = xx; Function4(); } If (Local2) { Global4 +=1;
for(data2=0;data2<local2;data2++) { Rentrantfuncion (global2 [data2],global4); } Global4 -=1; } }
this is how my startup file stack initialization looks like..
IBPSTACK EQU 0 IBPSTACKTOP EQU 0FFH+1
XBPSTACK EQU 0 XBPSTACKTOP EQU 0FFFFH+1
PBPSTACK EQU 1 PBPSTACKTOP EQU 02FFH+1
i am having problems with this function, the speed for now is not a concern but the functionality itself goes wrong somewhere.. does the code ring bells to anyone ??
1. Did you religiously follow all the instructions on reentrant functions in the manual (including such details as proper prototyping and including the reentrant and memory model keyword in the prototype) ?
I guess I have, the code is for you to see.
2. Did you make sure that you are using pdata correctly (there are more settings than just the stack setting, and some in the linker configuration, too).
I am not sure of the linker configuration, could you help me on that ??
3. Is there enough space on the pdata stack so that stack overflows do not occur ?
yes, there is enought space on the stack, because i havent used a lot of local variables.
4. What exactly have you done to debug the function ? How exactly does it "go wrong" ?
I simulate to debug, which is not much of a help. "the going wrong" part is related to the cards i have mentioned before, not all cards are being read even 'almost all' is not hapenning.
The code shows the body of the function. It does not show any function declarations.
The linker configuration only needs to be modified if your device supports several pages of pdata, instead of just one (the default for a '51).
http://www.keil.com/support/docs/1848.htm
Where did the 02FFH + 1 for the top of the stack come from - was that a default value or did you intentionally set it to 0x300 ? pdata is usually the first 256 bytes of xdata memory, and trying to set the top of the stack of 0300h might mess things up a bit.
Is there also enough room for the stack to grow ? Judging from value for PBPSTACKTOP, the stack may not be located in memory where you think it is, and overwrite other variables in xdata.
Then again, Andys suggestion is probably worth investigating. Why not turn the recursive algorithm into an iterative one and skip all the messy reentrant stuff ?
and, in pseudocode it looks like this
while collision if state 1 rightshift mask, set state 2 else (state 2) to change LSB ih match, set state 1 read. masb by mask, check match
nothing recursive
Erik
while collision if state 1 rightshift maskfield, set state 2 else (state 2) change LSB in matchfield, set state 1 read. mask by maskfield, check match to matchfield