支持关中断时增加优先级限制吗?

发布于 2021-05-07 11:19:29
;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable    PROC
    EXPORT  rt_hw_interrupt_disable
    MRS     r0, PRIMASK
    CPSID   I
    BX      LR
    ENDP

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC
    EXPORT  rt_hw_interrupt_enable
    MSR     PRIMASK, r0
    BX      LR
    ENDP

以上的中断操作都是对全局中断进行开和关,但我现在需要增加对中断优先级的限制,RTT有对应的接口吗?

比如只允许关闭优先级大于等于2的中断,freeRTOS的实现

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 2

#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()

#define vPortRaiseBASEPRI( ) vPortSetBASEPRI(configMAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))

查看更多

关注者
0
被浏览
100
4 个回答
flashman2002
flashman2002 2021-05-07

需底层代码才能实现,但你确定有必要吗?

cxhxy12345
cxhxy12345 2021-05-07

这个好像没有,上面的关闭和打开中断是多所有用户的,不包括异常和NMI如果你想打开关闭中断等级对应的中断,可以增加一段汇编判断你的中断来源。但这样做可能系统会出错啊!不知道你这样用的母的在那里?

UTOPIA0421
UTOPIA0421 2021-05-08

对原本的全局中断关闭与打开使用[WEAK]描述,允许用户自定义:

;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable    PROC
    EXPORT  rt_hw_interrupt_disable [WEAK]
    MRS     r0, PRIMASK
    CPSID   I
    BX      LR
    ENDP

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC
    EXPORT  rt_hw_interrupt_enable [WEAK]
    MSR     PRIMASK, r0
    BX      LR
    ENDP

在源文件中自行实现:

#define RT_MAX_SYSCALL_INTERRUPT_PRIORITY _PRIO_APP_HIGH
#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));
    return level;
}

void rt_hw_interrupt_enable(rt_base_t level)
{
    __set_BASEPRI(level);
}

以上是我的修改方法。

Glen_Young
Glen_Young 2021-05-08

目前没有,需要自己底层来实现

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览