We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi I am unclear as to how I can pass 2 generic pointer arguments into a function. As stated in the user guide, the generic ptr will be stored in R1-R3. But however, what happens when there is more than 1 argument? Please advice. Any explaination is appreciated. Thank you in advance. Regards Wtwh
I'm not sure from your response if you tried "?function?byte" literally. You need to substitute the name of the actual function for function. (Each function could potentially have its own parameter area; when the functions are not declared reentrant, the linker will overlay these areas according to the call tree.) Check carefully the size and number of your parameters so that you can figure out the right offset in the ?_MyFunction?byte area to find your parameter. Note that you can pass up to three two-byte pointers in registers. If you're willing to restrict the function to work only on xdata (for example), you might be able to avoid parameters spilling into memory.
Thank you for the reply. Yes. I did substitute the name of the function. 1) The first parameter passed in is actually an address &array[10] while the variable array is declared in xdata. However, the values are still found in R1-R3 instead of R6-R7. How can I make it a 2-byte pointer? 2)The second parameter is a function pointer. In this case how can work on xdata with this parameter? The actual value passed in is the name of the function. Thank you for your advice. Although seemingly straight-forward, I'm having problems access the values passed in from the allocated memory location.
How can I make it a 2-byte pointer? I do not know, try typecastion it a short. Unfortunately Keil has given in to the PC types that believe that the '51 is just another processor. Anyone coding for the '51 that want to be unaware of which codespace a variable is located in should go back to his/her beloved PC. Erik
How can I make it a 2-byte pointer Your type declarations must include one of the memory type qualifers, e.g. void MyFunction (U8 xdata* p1, U8 xdata* p2) instead of void MyFunction (U8* p1, U8* p2) The first has a two-byte pointers passed in R6/R7 and R4/R5, the second is a three-byte generic pointer passed in R1-R3 and some memory space. The advantage of the second format is that one routine will work on data in any location (data or xdata). The first produces smaller and faster code.