Files
yhf c820aad809 feat: 完成项目多模块功能迭代与配置更新
1. 新增sqlite文件、协议文档、调试截图、配置ini等各类辅助文件
2. 更新Keil开发包版本与工程配置,调整编译优化等级
3. 重构继电器控制逻辑、串口收发逻辑与线程优先级
4. 新增Modbus寄存器映射、校准结构体与Ymodem升级相关代码
5. 完善南北向协议解析、快充挡位配置与调试日志
6. 修复注释格式、数组越界与线程邮箱溢出问题
7. 新增屏幕控制、功率板调试与协议格式说明文档
2026-07-18 15:32:54 +08:00
..
2025-09-03 20:50:03 +08:00
2025-09-03 20:50:03 +08:00
2025-08-16 22:58:22 +08:00
2025-08-16 22:58:22 +08:00
2025-08-16 22:58:22 +08:00
2025-08-16 22:58:22 +08:00

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 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 register for independent interrupt management, note that interrupts with a priority value lower than RT_MAX_SYSCALL_INTERRUPT_PRIORITY cannot call any system API.