Keil Logo Arm Logo

RL-ARM User's Guide

SVC Functions

Software Interrupt (SVC) functions are functions that run in Privileged Handler Mode of Cortex™-M core. SVC functions can accept arguments and can return values. They are used in the same way as other functions.

The difference is hidden to the user and is handled by the RealView C-compiler. It generates different code instructions to call SVC functions. SVC functions are called by executing the SVC instruction. When executing the SVC instruction, the controller changes the running mode to a Privileged Handler Mode.

Interrupts are not disabled in this mode. In order to protect SVC function from interrupts, you need to include the disable/enable intrinsic functions __disable_irq() and __enable_irq() in your code.

You may use SVC functions to access protected peripherals, for example to configure NVIC and interrupts. This is required if you run tasks in unprivileged (protected) mode and you need to change interrupts from the task.

If you want to use SVC functions in your RTX kernel project, you need to:

  1. Copy the SVC_Table.s file to your project folder and include it into your project.
    This file is located in the \Keil\ARM\RL\RTX\SRC\CM folder.
  2. Declare a function with a __svc(x) attribute. Use the first SVC number, starting from 1, that is free.
    void __svc(1)  inc_5bit (U32 *cp);
    
  3. Write a function implementation and convert the function name into a __SVC_x function name. This name is referenced later by the linker from SVC_Table.s module. You need also to disable/enable interrupts.
    void __SVC_1            (U32 *cp) {
      /* A protected function to increment a 5-bit counter. */
      __disable_irq();
      *cp = (*cp + 1) & 0x1F;
      __enable_irq();
    }
    
  4. Add the function __SVC_x to the SVC function table in the SVC_Table.s module.

    First import it from other modules:
    ; Import user SVC functions here.
                    IMPORT  __SVC_1
    
    then add a reference to it into the table:
    ; Insert user SVC functions here. SVC 0 used by RTL Kernel.
                    DCD     __SVC_1                 ; user SVC function
    
  5. Your SVC function should now look like this:
    void __svc(1)  inc_5bit (U32 *cp);
    void __SVC_1            (U32 *cp) {
      /* A protected function to increment a 5-bit counter. */
      __disable_irq();
      *cp = (*cp + 1) & 0x1F;
      __enable_irq();
    }
    

 

  • SVC function 0 is reserved for the RTX kernel.
  • Do not leave gaps when numbering SVC functions. They must occupy a continuous range of numbers starting from 1.
  • SVC functions can still be interrupted.
  • RTX must be initialized before SVC functions are called.

Keil logo

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.