-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
53 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
## Independent Interrupts Management | ||
|
||
### Introduction | ||
Calling `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. | ||
|
||
The 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. | ||
|
||
|
||
### Usage | ||
- Add the following code to the project's `board.c` file. | ||
``` | ||
#ifdef RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT | ||
#define RT_NVIC_PRO_BITS __NVIC_PRIO_BITS | ||
rt_base_t rt_hw_interrupt_disable(void) | ||
{ | ||
rt_base_t level = __get_BASEPRI(); | ||
__set_BASEPRI(RT_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - RT_NVIC_PRO_BITS)); | ||
__ISB(); | ||
__DSB(); | ||
return level; | ||
} | ||
void rt_hw_interrupt_enable(rt_base_t level) | ||
{ | ||
__set_BASEPRI(level); | ||
} | ||
#endif /* RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT */ | ||
``` | ||
- Add the following configuration to the `Kconfig` file in the `board` directory. | ||
``` | ||
menuconfig RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT | ||
bool "Enable independent interrupt management" | ||
default n | ||
if RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT | ||
config RT_MAX_SYSCALL_INTERRUPT_PRIORITY | ||
int "Set max syscall interrupt priority" | ||
range 0 7 | ||
default 2 | ||
endif | ||
``` | ||
- Select `RT_USING_INDEPENDENT_INTERRUPT_MANAGEMENT` to enable this feature. | ||
- 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. | ||
|
||
### Description | ||
- 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. | ||
- For example, if `RT_MAX_SYSCALL_INTERRUPT_PRIORITY` is set to 0x01, the system masking only interrupts with a priority of `0x01-0xFF`. | ||
- 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. | ||
- 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`. |