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

How to jump to assigned place after interrupt occurs ?

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

Parents
  • "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.

Reply
  • "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.

Children