Keil Logo

RTX51 TINY: SAVING AND RESTORING XDATA BANKING INFORMATION


Information in this article applies to:

  • RTX51 Tiny Version 2.00

QUESTION

I am using the Keil PK51, RTX51 Tiny Version 2, and far memory to access 4 banks of SRAM. The XDATA Banking is configured in the XBANKING.A51 file. I need to save and restore the XDATA banking information when RTX51 Tiny performs a task switch.

I'm using code banking (configured via L51_BANK.A51) and that works just fine with RTX51 Tiny. The XDATA Banking information should be just as easily saved. Can you point me in the right direction so that I can modify CONF_TNY.A51 myself?

ANSWER

Yes. It is easy to add code to save and restore the XDATA banking details. You must modify the CONF_TNY.A51 and OS_CREATE.A51 files.

You should add the XDATA banking save/restore code at the same location where the CODE_BANKING support is introduced via the IF (CODE_BANKING <> 0) directives.

CONF_TNY.A51

There are 2 occurrances of the code sequence that saves the bank information in CONF_TNY.A51. You should add the XDATA banking save/restore code to both. For example:

IF (CODE_BANKING <> 0)
                PUSH    ?B_CURRENTBANK
ENDIF

; *** Add code here to save the
; *** XDATA banking port value to the stack

The code to restore the XDATA banking port must be inserted in the following code sequence:

NoEvent:        CLR     ACC.B_RUN       ; Clear RUN bit
                XCH     A,@R0
                SETB    EA

                ANL     A,#K_RUN
                ORL     AR7,A

; *** Add code here to restore the
; *** XDATA banking port value from the stack

IF (TIMESHARING <> 0)
  IF (CODE_BANKING)
            POP ACC
                CALL    ?B_RESTORE_BANK
  ENDIF
                CLR     ?RTX_TS_DELAY
                RET
OS_CREATE.A51

You must modify the OS_CREATE.A51 source file to adjust the stack layout. There are several places where the stack is adjusted as shown below:

$IF (CODE_BANKING)
                DEC     R1

; *** Add a DEC R1 for each byte
; *** you save on the stack
$ENDIF

and

$IF (CODE_BANKING)
                INC     @R0

; *** Add an INC R1 for each byte
; *** you save on the stack
$ENDIF

You must add code to the following to select the default XDATA bank that is selected when the task starts.

$IF (CODE_BANKING)
EXTRN   DATA    (?B_CURRENTBANK)
                INC     R0
                MOV     A,?B_CURRENTBANK     ; Set the initial code bank
                MOV     @R0,A

; *** Add code for each byte restored
; *** that selects the XDATA banking port
;           INC   R0
;           MOV   A,#0  ; default XDATA banking port
;           MOV @R0,A

Last Reviewed: Tuesday, November 5, 2002


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.