Context switch

The following example performs a context switch on the User mode process. The code is based around a list of pointers to Process Control Blocks (PCBs) of processes that are ready to run.

This figure shows the layout of the PCBs that the example expects.

Figure 11. PCB layout

To view this graphic, your browser must support the SVG format. Either install a browser with native support, or install an appropriate plugin such as Adobe SVG Viewer.

The pointer to the PCB of the next process to run is pointed to by R12, and the end of the list has a zero pointer. Register R13 is a pointer to the PCB, and is preserved between time slices, so that on entry it points to the PCB of the currently running process.

Example 42. Context switch on the User mode process

    STM     sp,{R0-lr}^             ; Dump user registers above R13.
    MRS     R0, SPSR                ; Pick up the user status
    STMDB   sp, {R0, lr}            ; and dump with return address below.
    LDR     sp, [R12], #4           ; Load next process info pointer.
    CMP     sp, #0                  ; If it is zero, it is invalid
    LDMDBNE sp, {R0, lr}            ; Pick up status and return address.
    MSRNE   SPSR_cxsf, R0           ; Restore the status.
    LDMNE   sp, {R0 - lr}^          ; Get the rest of the registers
    SUBSNE pc, lr, #4               ; and return and restore CPSR.
                                    ; Insert "no next process code" here.

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0471G