I have had a rather ugly problem caused due to the optimization. I am reading data from a fifo. The read port is at address 0x8200 (read only access). It also has a read reset port. Its address is also 0x8200 (both xdata) (write onle access). When I declare the varables for accessing the fifo like this:
xdata uchar fifo_data _at_ 0x8200; xdata uchar fifo_rres _at_ 0x8200;
xdata uchar fifo_data _at_ 0x8200; #define fifo_rres fifo_data
fifo_rres = 0xff; // reset fifo read jpg_adr = 1; // set jpg file address to the next address to be read fbuf_start = 0; // set buffer start pointer to zero fbuf_in = 1; // set buffer input pointer to next free byte in buffer fbuf_pos = 0; // set buffer read pointer to zero fbuf_startadr = 0; // set buffer startadress to zero fbuf[0] = fifo_data; // read first byte from jpg file
Hi there, thanks for the quick help. I had heard something about "volatile" before, but I couldn't find anything about it in my Keil books. After I got the reply, I have found it as a footnote in the Kernighan&Ritchie. So what I have done is:
#define FIFO_READ_ADR 0x8200 [...] xdata volatile uchar fifo_data _at_ FIFO_READ_ADR; // fifo data register (read only) #define fifo_rres fifo_data