CN / EN
CN / EN

freertos的中断优先级配置疑问? GR551x

已解决

180***569

2024-05-16 09:55

1. 关于freertos中中断相关的配置如下:

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0xFF

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    0x30

2. 关于外设的优先级默认配置参考: https://developers.goodix.com/zh/bbs/detail/5dd40703f2374feaa407b758e98a26fd

#define PRIORITY_GROUP_NUMBER      (3)
void system_priority_init(void)
{
    NVIC_SetPriorityGrouping(PRIORITY_GROUP_NUMBER);
    for(uint32_t i = 0; i < MAX_NUMS_IRQn; i++)
    {
        NVIC_SetPriority((IRQn_Type)i, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 8, 0));
    }

    NVIC_SetPriority(SVCall_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 0, 0));
    NVIC_SetPriority(BLE_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 2, 0));
    NVIC_SetPriority(BLESLP_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 2, 0));
    NVIC_SetPriority(DMA_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 6, 0));
    NVIC_SetPriority(UART0_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 10, 0));
    NVIC_SetPriority(UART1_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 10, 0));
    NVIC_SetPriority(TIMER0_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 12, 0));
    NVIC_SetPriority(TIMER1_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 12, 0));
    NVIC_SetPriority(DUAL_TIMER_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 12, 0));
    NVIC_SetPriority(SLPTIMER_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 12, 0));
    NVIC_SetPriority(PendSV_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 15, 15));
    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 15, 15));
    NVIC_SetPriority(BLE_SDK_IRQn, NVIC_EncodePriority(PRIORITY_GROUP_NUMBER, 15, 15));
}

3.结合上面两个配置,比如上面的串口的中断优先级配置为10,而configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY是0x30,问题1:是不是串口的中断不受freertos管理,依然可以响应?问题2:同时串口中断也不能使用freertos API函数,但是我在SDK代码中看到了串口中断回调函数有使用freertos API函数。麻烦解答一下我的疑问,谢谢!!!

0收藏

0赞成

最佳答案

zhongchengzhi

汇顶员工
2024-05-16 11:31

您好,配置的优先级Group值PRIORITY_GROUP_NUMBER为3(NVIC_SetPriorityGrouping),因此是Group_4

#define NVIC_PRIORITYGROUP_4         (0x00000003U) /**< 4 bits for pre-emption priority,
                                                                 4 bits for subpriority */

因此高4位是抢占优先级

 ==========================================================================================================================
         NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  |       Description
       ==========================================================================================================================
        NVIC_PRIORITYGROUP_0  |                0                  |            0U-255           | 0 bits for pre-emption priority
                              |                                   |                             | 8 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_1  |                0U-1               |            0U-127           | 1 bits for pre-emption priority
                              |                                   |                             | 7 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_2  |                0U-3               |            0U-63            | 2 bits for pre-emption priority
                              |                                   |                             | 6 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_3  |                0U-7               |            0U-31            | 3 bits for pre-emption priority
                              |                                   |                             | 5 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_4  |                0U-15              |            0U-15            | 4 bits for pre-emption priority
                              |                                   |                             | 4 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_5  |                0U-31              |            0U-7             | 5 bits for pre-emption priority
                              |                                   |                             | 3 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_6  |                0U-63              |            0U-3             | 6 bits for pre-emption priority
                              |                                   |                             | 2 bits for subpriority
       --------------------------------------------------------------------------------------------------------------------------
        NVIC_PRIORITYGROUP_7  |                0U-127             |            0U-1             | 7 bits for pre-emption priority
                              |                                   |                             | 1 bits for subpriority
       ==========================================================================================================================

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY配置的是0x30,取高4位是3,因此优先级0,1,2的中断是不受FreeRTOS安全函数(如临界区配置__set_BASEPRI等)管理,依然可以响应。但是优先级为3-15的中断,是受FreeRTOS安全函数所控制的;

0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注