Hi, I want to implement following job in C code with Keil C51. (1) jump to a place (function entry) after an interrupt occurs. I know how to implement it in assemble, but I don't know how to implement it in C ? Following is the implementation in assemble, JUMP_HERE: CLR A ... ... Int1: MOV DPTR,#JUMP_HERE PUSH DPL PUSH DPH RETI Does following C code works ? void main() { while(1) { JUMP_HERE: func1(); ... } } void Int0_ISR (void) interrupt 0 using 1 { // C code here .... #pragma asm MOV DPTR,#JUMP_HERE PUSH DPL PUSH DPH #pragma endasm } I know you can only use the goto statement within same function in C. Any idea ? Thanks. Daniel
"I am not sure whether this can be achieveable by mixing C and assembler" Your basic problem is that labels in the 'C' programming language cannot have global scope; ie, they are never accessible from outside the function in which they are declared. This is defined by the language; nothing specifically to do with Keil - see a 'C' textbook. Therefore, you will have to implement both the ISR and the "target" of the jump in assembler. You might possibly be able to use setjmp and longjmp, but I think these are implemented as functions - so that'd be no good here. :-( http://www.keil.com/support/man/docs/c51/c51_lib_misc.htm Again, this is fundamentally contrary to the principles of 'C' so, if your really must do it, you need to do it in assembler.
SCRAP THE TASK SWITCHER my mathod: Put the time critical "main" portion in an unused ISR Set all "real" ISRs to high priority When the time critical "main" portion is to run set the bit that trigger the "unused" ISR. Erik