AnsweredAssumed Answered

Complier issue on MC9S12Xdp512

Question asked by Richard lin on Sep 4, 2012
Latest reply on Sep 4, 2012 by kef

Dear All,

    This is Richard from sgcc, developing on mc9s12xdp512. I met the following issue: 
volatile unsigned long gCounter=0; //locate at 0x2cd4 

__interrupt timer_tick(){ //interrupt every 1ms 
gCounter++; 


unsigned long getCurrentTime() 

return gCounter; 


unsigned long readback=0; // locate at 0x398e 
void main() 

while(1) 

readback = getCurrentTime(); // Assembly: CALL 0xc793, 00 
LDX 0x2cd4 
LDD 0x2cd6 
RTC 
SEX D,X 
STX 0x398e 
STD 0x3985 
....delay; 



The problem is: 
as gCounter increase, for example gCounter = 0x18001; 
LDX 0x2cd4 
LDD 0x2cd6 
//Here, IX=1, D=0x8001 
RTC 
SEX D,X 
// Here, IX changes from 1 to 0xffff, cuz' the highest bit of D is "1". 
STX 0x398e 
STD 0x3985 
// Here, readback = 0xffff8001. 

I don't know why "SEX D,X" is inserted and leads to the strange result.---- only lower word of gCounter is assgined to feedback, and the higher word is wrong. how could i avoid the comiler to do such things which really take me much time to find the bug out. 
see attachment for sample code and snapshot. plz rename the file to .rar and extract first.
Debug suggest: 
See the communication.c for the bug. Don't worry about other modules. Just run the project, and set a breakpoint at gChargeManager.timeStamp=GetCurrentTime(); Then u can see from the assembly window that "SEX D,X" is inserted. Then add expressions "gTimerCount"(increased by interrupt every 1ms) and "gChargeManager.timeStamp"(assigned by GetCurrenttime(), gTimerCount), remove the breakpoint to run, u will see the issue

Outcomes