-
Notifications
You must be signed in to change notification settings - Fork 5.1k
允许重写中断控制API以支持独立的中断管理 #9305
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
允许重写中断控制API以支持独立的中断管理 #9305
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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`. |
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我看已经实现了虚定义,原来的这块为什么还要改呢?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rtthread_startup
函数中调用了rt_hw_interrupt_disable
函数来屏蔽中断,但是之后没有再调用rt_hw_interrupt_enable
函数来禁用屏蔽中断,而是直接在rt_system_scheduler_start
函数中调用rt_hw_context_switch_to
来启用中断。rt_hw_context_switch_to
中使用CPSIE
指令来启用中断,所以需要在CPSIE
之后清除basepri
寄存器以禁用中断优先级的屏蔽。