• Home
  • Annotate
  • current directory
Name Date Size #Lines LOC

..21-Aug-2025-

README.md A D21-Aug-20252.8 KiB5442

SConscript A D21-Aug-2025586 2717

context_gcc.S A D21-Aug-20257.9 KiB274170

context_iar.S A D21-Aug-20257.8 KiB279200

context_rvds.S A D21-Aug-20257.6 KiB272189

cpuport.c A D21-Aug-202512.9 KiB500364

cpuport.h A D21-Aug-2025442 2412

README.md

1## Independent Interrupts Management
2
3### Introduction
4Calling `rt_hw_interrupt_disable` in multiple places on `rt-thread` may cause interruption delays when the application requires accurate interrupt responses. This is because the system cannot generate any interrupts except abnormal interrupts after disabling interrupts. This is a common problem in the interrupt management of the operating system. The independent interrupt management module is designed to solve this problem.
5
6The independent interrupt management module is designed to solve the problem of interrupt delays caused by calling `rt_hw_interrupt_disable` in multiple places on `rt-thread`. The module is implemented by rewrite the `rt_hw_interrupt_disable` and `rt_hw_interrupt_enable` functions in the `libcpu` library.
7
8
9### Usage
10- Add the following code to the project's `board.c` file.
11```
12#ifdef RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT
13#define RT_NVIC_PRO_BITS    __NVIC_PRIO_BITS
14
15rt_base_t rt_hw_interrupt_disable(void)
16{
17    rt_base_t level = __get_BASEPRI();
18    __set_BASEPRI(RT_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - RT_NVIC_PRO_BITS));
19
20    __ISB();
21    __DSB();
22
23    return level;
24}
25
26void rt_hw_interrupt_enable(rt_base_t level)
27{
28    __set_BASEPRI(level);
29}
30
31#endif /* RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT */
32```
33- Add the following configuration to the `Kconfig` file in the `board` directory.
34```
35    menuconfig RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT
36        bool "Enable independent interrupt management"
37        default n
38
39        if RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT
40            config RT_MAX_SYSCALL_INTERRUPT_PRIORITY
41                int "Set max syscall interrupt priority"
42                range 0 7
43                default 2
44        endif
45```
46- Select `RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT` to enable this feature.
47- Select `RT_MAX_SYSCALL_INTERRUPT_PRIORITY` to set the maximum priority of the interrupt that can be called by the system call. The default value is 2.
48
49### Description
50- The [basepri](https://developer.arm.com/documentation/107706/0100/Exceptions-and-interrupts-overview/Special-registers-for-exception-masking/BASEPRI) register is used in the functions to complete the interrupt management.
51- For example, if `RT_MAX_SYSCALL_INTERRUPT_PRIORITY` is set to 0x01, the system masking only interrupts with a priority of `0x01-0xFF`.
52- Interrupts with a priority of 0 are not managed by the system and can continue to respond to interrupts after `rt_hw_interrupt_disable` is called.
53- When using the [basepri](https://developer.arm.com/documentation/107706/0100/Exceptions-and-interrupts-overview/Special-registers-for-exception-masking/BASEPRI) register for independent interrupt management, note that interrupts with a priority value lower than `RT_MAX_SYSCALL_INTERRUPT_PRIORITY` cannot call any `system API`.
54