RT-Thread论坛
直播中

倪山骋

7年用户 1016经验值
私信 关注

rt-thread如何实现与freertos相同的功能?

我在一个项目中采用了 cortex m4 的内核,用于 pwm 控制电机,对定时器的实时性要求比较高,希望 rt-thread 在进行原子操作时不关闭 pwm 的定时器。
当前 rt-thread 的原子操作时开关总中断(如下代码),开关总中断影响 pwm 定时器中断响应
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
在 freertos 中除开关总中断外,还有一个可关闭低于指定优先级的中断。这样可以保障指定优先级的性能,其实现如下,当然代价是指定优先级的中断不能调用 rtos 相关的接口。
portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void )
{
uint32_t ulOriginalBASEPRI, ulNewBASEPRI;
    __asm volatile
    (
        "    mrs %0, basepri                                            \n" \
        "    mov %1, %2                                                \n"    \
        "    msr basepri, %1                                            \n" \
        "    isb                                                        \n" \
        "    dsb                                                        \n" \
        :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
    );
    /* This return will not be reached but is necessary to prevent compiler
    warnings. */
    return ulOriginalBASEPRI;
}
/*-----------------------------------------------------------*/
portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue )
{
    __asm volatile
    (
        "    msr basepri, %0    " :: "r" ( ulNewMaskValue ) : "memory"
    );
}
问题
rt-thread 如何实现与 freertos 相同的功能(只关闭低于指定优先级的中断),除了修改rt_hw_interrupt_disable、rt_hw_interrupt_enable,还有什么要注意的吗?

回帖(1)

向芹

2024-2-22 15:35:03
1、可以参考FreeRTOS的开关中断方式,通过向basepri寄存器写入要屏蔽的中断号数值(大于这个数值的将会被屏蔽)
2、RTT 的开关中断方式就是简单粗暴,因为一般我们临界段的处理时间是比较短的,关了再开其实并没有太大的影响。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分