Please consider the following code.
//--- module main.c --- ... void main() { ... set_status_word(...); ... } //--- module can.c --- ... void CAN_int_handler(void) interrupt 7 { ... set_status_word(...); ... } //--- module utils.c --- ... void set_status_word(...) { ... }
things can go awry things cannot go awry. Sorry about the typo.
Christoph, Thanks for your response. Yes, set_status_word() just modifies status_word:
unsigned char xdata status_word; void set_status_word(unsigned char err, bit yes) { if (yes) status_word &= err; else status_word |= (~err & 0xF); }
0014 900000 R MOV DPTR,#err 0017 E0 MOVX A,@DPTR 0018 FF MOV R7,A ...
Obviously, this can lead to unpredictable behaviour, can't it? ... ohh yes. ;) All right, but what are the exact criteria the linker uses for deciding whether to issue or not to issue that message? Maybe the linker assumes that function arguments are passed in registers when they really aren't ? This could be a bug in the linker. Did you file a bug report ?