I would like to to use the bit addressable memory range (bdata) with an index variable as in the following example:
#define SETBIT(I) WAIT_4_MUTEX; flags^I=1; FREE_MUTEX; unsigned char bdata flags; func () { unsigned char i; for (i=0; i < MAX_CELL; i++) { // do interesting stuff SETBIT(i); } }
This construction of coarse gives a lval error on the use of the SETBIT macro.
My current fall back are the macro's:
#define SETBIT(I) base |= ((unsigned char) (1 << I)) #define CLEARBIT(I) base &= ~((unsigned char) (1 << I))
But still have the feeling that I am wasting cycles on the shift operators in these two macro's and because this is within a mutex region the timing might become an issue.
Is there a better way to set/reset the i-th bit of a bit addressable variable ?
Unfortunately, Bits are not indirectly addressable in the 8051 architecture.
"Unfortunately, Bits are not indirectly addressable in the 8051 architecture."
Map CODE and XDATA space together and I guess you could consider using good old self modifying code :)
dunno that it'd save any cycles, though...?
;-)
set_bit (SFR, mask) clr_bit (SFR, mask)
Erik
How does that in any way satisfy his request?
The request is impossible to safisfy - the architecture just doesn't support it.