Keil Logo

C51: Redirecting Interrupt Vectors


Information in this article applies to:

  • C51 All Versions

QUESTION

How do I redirect my interrupts for an application that includes EPROM (starting at 0x0000) and FLASH (starting at 0x2000)?

ANSWER

You must have a program in the EPROM and another program in the FLASH memory to accomplish this. The EPROM presumably contains a loader that contains a simple assembly program that has its reset vector at 0 and its interrupts located in memory with the standard offsets; 3H, 0BH, etc. Here is a code snippet to demonstrate the program:

OFFSET EQU              2000H


    CSEG AT 0003H
    LJMP OFFSET + 0003h

    CSEG AT 000BH
    LJMP OFFSET + 000BH
;       .
;       .
;       .

;For each interrupt that is contained in both the Flash
;program and the loader, such as the serial
;interrupt you must have code to test which interrupt is
;currently being used.  In the following
;snipet we will use the user defined bit in the
;PSW for the flag which must be set by the loader
;and reset by the flash program.  If you have more
;than one interrupt that is shared then you will
;need a different messaging system.

    CSEG AT 0023H             ;The reset vectors are located
                              ;in the loader in ROM
    LJMP    SIO_ISR           ;The serial interrupt is being
                              ;used as an example

    INTR_HNDLR SEGMENT CODE

    RSEG    INTR_HNDLR        ;The following segment is
                              ;relocatable

SIO_ISR:
    PUSH    PSW               ;Save the world
    JNB     PSW.1, PROG_JMP   ;Loader serial interrupt or
                              ;flash program interrupt
    POP     PSW               ;Set the world right for the
                              ;loader interrupt handler
    LJMP    LOADER_SIO_ISR    ;Go handle the interrupt for
                              ;the loader

PROG_JMP:                     ;
    POP    PSW                ;Set the world right from the
                              ;flash program interrupt handler
    LJMP   OFFSET + 0023H     ;Go handle the interrupt for the
                              ;flash program

The flash located program has the same reset and interrupt vectors but the offset has been changed from 0 to 2000H using the IV(2000H) directive in the compiler.

SEE ALSO


Last Reviewed: Friday, July 16, 2021


Did this article provide the answer you needed?
 
Yes
No
Not Sure
 
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.