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.
I have this code:
typedef struct _DLL_struct { unsigned char DLL_type; unsigned char DLL_lenght; unsigned char DLL_data_begin; } DLL_struct; unsigned char xdata FskRxBuf[MAX_SIZE_BUFFER]; void main(void) { DLL_struct *DLL_ptr; // pointer to cast on the buffer unsigned char xdata chacksum_rx; DLL_ptr = (DLL_struct *)FskRxBuf; // cast the struct to the buffer checksum_rx = *(&DLL_ptr->DLL_data_begin + DLL_ptr->DLL_lenght); // read the received checksum }
I tried to define a struct pointer and cast it on a plain char buffer to obtain access to the buffer using the fields of the structure. I run the code on a debugger and get a problem with the address of the structure fields. Say that FskRxBuf begins at 0x0292, the debugger tells me that the expression &DLL_ptr->DLL_data_begin is 0x92 and not 0x0292 like I thought. Where is my mistake?
Two reasons for the memory layout: - Minimal transistor count. - Small instructions.
For an 8-bit processor without real 16-bit registers, a full 16-bit address is no fun at all. Intel wanted as large part of the application as possible to use 8-bit addresses. Remember that the original C51 did not have any processor cache to handle the extra ticks required to access one or more extra bytes of instruction data from a very, very slow memory.