Hi all, I'm new to C and need a hint on an optimization problem. I have a 16 bit counter, divided into two 8bit SFRs, let's say TH0 and TL0, and I want to transfer them to a short. I could: mshort = (short)TH0 * 256 + TL0 but this takes 16bytes, similar to something like: mshort = (short)TH0 << 8 + TL0 I would like to do it more simple, like: MSB of mshort = TH0 LSB of mshort = TL0 I tried it that way: unsigned short *pINT; pINT = &TH0; but this is not possible with SFRs. Something else I tried: unsigned short mINT; unsigned char *pChar; pChar = & mINT; *pChar = TH0; *(pChar + 1) = TL0; results in even more code (31 bytes) So I think it would be the easiest, if I could place 2 char variables at the same address, covered by my short, like: unsigned short mINT; unsigned char mChar[2] (at the same address like mINT) mChar[0] = TH0; mchar[1] = TL0; but I don't know, how to place the mChar array at the same address of mINT. I tried it with: unsigned char mChar[2] _at_ mINT; but this is not possible (compiler error). So anyone here, who could give me a hint how to place both variables at the same address? Thanks in advance Marco Della Rocca
Assuming you're trying to get the 16 bits of a timer into a UINT16 and the timer is free running, beware the LSB to MSB rollover demon. This foul vermin of the firmware realm strikes predominantly after software release.
This foul vermin of the firmware realm wrong address This foul vermin of programmer incompetence
erik
wrong address This foul vermin of programmer incompetence
Well...yes, but I was giving him a break as he's admittedly a newb.
Well...yes, but I was giving him a break as he's admittedly a newb. That's nice, but please do not provide the excuse that such crap is due to a shortcoming of anything but the programmer. Your orignial post can be read as such.
Anyhow, this problem is not just with timers, atomicity has a much wider scope.
Erik