This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

bug in strcpy

I have the following structure:

struct fence_struct	{
  unsigned char	mode;
  char		sitename[13];
  unsigned char	sector_nr;
  unsigned char	sector_tot;
  unsigned int	start;
  unsigned int	feeder_offset;
  unsigned int	len;
  unsigned int	line_len;
  unsigned char	begin_far;
  unsigned int	res_norm;
  unsigned int	res_min;
  unsigned int	res_max;
  unsigned char	wire_amount;
  unsigned char	wire_name[12];
};

xdata struct fence_struct  fence;

I then initialise fence.sitename like this in the function init_vars():
strcpy(fence.sitename, "SITENAME");

and it generates this assembly:
;strcpy(fence.sitename, "SITENAME");
;SOURCE LINE # 1535
MOV  	R0,#LOW (fence+01H)
MOV  	R4,#HIGH (fence+01H)
MOV  	R5,A
MOV  	R3,#0FFH
MOV  	R2,#HIGH (?SC_403)
MOV  	R1,#LOW (?SC_403)
LCALL	?C?STRCPY

WHICH DOESN'T WORK

However, when I call exactly the same line in the function misc_info() it generates the following assembly:
;strcpy(fence.sitename, "SITENAME");
;SOURCE LINE # 4306
MOV  	R0,#LOW (fence+01H)
MOV  	R4,#HIGH (fence+01H)
MOV  	R5,#01H
MOV  	R3,#0FFH
MOV  	R2,#HIGH (?SC_403)
MOV  	R1,#LOW (?SC_403)
LCALL	?C?STRCPY

WHICH WORKS FINE

Why does it generate different assembly for the same source line and how can I rectify it?

Parents
  • Is it possible that your program changes the MCON register in a way that affects the partition address. And, after you exit program mode, the first time the program runs, the partition address is changed. Then, after a cold start, since the partition address is set correctly, everything works OK?

    Since you are using a DS5000, your XDATA starts at the partition address. Have you specified it that way to the linker?

    Jon

Reply
  • Is it possible that your program changes the MCON register in a way that affects the partition address. And, after you exit program mode, the first time the program runs, the partition address is changed. Then, after a cold start, since the partition address is set correctly, everything works OK?

    Since you are using a DS5000, your XDATA starts at the partition address. Have you specified it that way to the linker?

    Jon

Children
  • I've checked that I don't write to the MCON register anywhere in my code. I only write to it after the hex file has been loaded into pgm mem while the MCU is still in Pgm mode.

    Yes, I specify in Keil that the Code mem is from 0x0000-0x6FFF and the Xdata mem is from 0x7000-0x7FFF.

    I've also noticed that a second reset (after the 1st which took it out of pgm mode) has the same effect as a cold start.