Hi,
I'm working on a project employing an XE164. In a ISR (CAN-RX-Interrupt) I want to fill a global variable with some values, then set a flag to signal the main program ok-to-read. The variable to fill is a structure, defined in the main program:
typedef struct {
unsigned char data[8];
unsigned char flags;
} t_data;
in main.c:
volatile t_data data;
The CAN-ISR is supposed to fill data[0..7] with the incoming bytes, then set flags to (e.g.) TRUE. The main program is supposed to look for the flag, handle the data, then reset the flag.
This works fine when I use a seperate variable. It does not always work, however, if "flags" is a member of a structure, like t_data.flags in the example above: It "mostly" works, but the main programm misses some new messages, about 10% of the time. Again, this does not occur if "flags" is a seperate variable.
Can anyone make sense of this? Could it be that read access by main to some other part of the structure also kills the ISR-write to the flags-part of the structure (or vv)?
Any help would be much apreciated.
Regs, Alto Speckhardt
before somebody bites my head off - yes, I know, there are processors out there that do allow unaligned accesses...!
"yes, I know, there are processors out there that do allow unaligned accesses...!"
8086, 80186, 80286, i386, i486, ... ;)
In this case, Intel designed logic into the bus controller to automatically take care of unaligned access.
For more modern x86 chips, it is normally way more important to not cross a cache-line boundary than to have unaligned access.
Do you have other code that touches other bits of this rxstatus variable?
Note that |= UPDATED will on most processors update all bits, since the processor has to do a read/modify/write.
If one part of the code do the read, while another part do a write, then you may loose changes to some bits.
No, I've also changed this to =TRUE and =FALSE, with the same results. The variable is only used between those two routines (ISR and one main routine). It was intended to signal different RX conditions (message lost etc.) but this hadn't been implemented yet.