close

FreeRTOS中斷簡介

任何調用中斷安全FreeRTOS API函數的中斷服務例程都可以使用的最高中斷優先級。不要從任何優先級高於此的中斷調用中斷安全FREERTOS API函數(優先級越高,數值越低)。
代碼如下(版本FreeRTOS V202107.00):
/*Cortex-Mspecificdefinitions.*/#ifdef__NVIC_PRIO_BITS/*__BVIC_PRIO_BITSwillbespecifiedwhenCMSISisbeingused.*/#defineconfigPRIO_BITS__NVIC_PRIO_BITS#else#defineconfigPRIO_BITS4/*15prioritylevels*/#endif/*Thelowestinterruptprioritythatcanbeusedinacalltoa"setpriority"function.*/#defineconfigLIBRARY_LOWEST_INTERRUPT_PRIORITY0xf/*ThehighestinterruptprioritythatcanbeusedbyanyinterruptserviceroutinethatmakescallstointerruptsafeFreeRTOSAPIfunctions.DONOTCALLINTERRUPTSAFEFREERTOSAPIFUNCTIONSFROMANYINTERRUPTTHATHASAHIGHERPRIORITYTHANTHIS!(higherprioritiesarelowernumericvalues.*/#defineconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5/*Interruptprioritiesusedbythekernelportlayeritself.ThesearegenerictoallCortex-Mports,anddonotrelyonanyparticularlibraryfunctions.*/#defineconfigKERNEL_INTERRUPT_PRIORITY(configLIBRARY_LOWEST_INTERRUPT_PRIORITY<<(8-configPRIO_BITS))/*!!!!configMAX_SYSCALL_INTERRUPT_PRIORITYmustnotbesettozero!!!!Seehttp://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html.*/#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY<<(8-configPRIO_BITS))

configMAX_SYSCALL_INTERRUPT_PRIORITY 高於此優先級的中斷,不能被禁止。

測試過程

開啟定時器TIM6和TIM7,兩個定時器每隔一定時間串口打印一次,設置定時器TIM6中斷優先級為4,定時器TIM7中斷優先級為5, 高於 5 的優先級(即優先級數小於5)不歸操作系統管理。
簡而言之,定時器TIM6不歸FreeRTOS管理,在關閉中斷時,低於優先級5的都會被關閉,高於或者等於優先級5的都會被關閉。

1、創建中斷測試任務

xTaskCreate((TaskFunction_t)interrupt_task,//任務函數(constchar*)"interrupt_task",//任務名稱(uint16_t)INTERRUPT_STK_SIZE,//任務堆棧大小(void*)NULL,//傳遞給任務函數的參數(UBaseType_t)INTERRUPT_TASK_PRIO,//任務優先級(TaskHandle_t*)&INTERRUPTTask_Handler);//任務句柄2、中斷測試任務函數voidinterrupt_task(void*pvParameters){staticu32count_num=0;while(1){count_num++;if(count_num==5){printf("關閉中斷.............\r\n");portDISABLE_INTERRUPTS();//關閉中斷delay_xms(5000);//延時5sprintf("打開中斷.............\r\n");portENABLE_INTERRUPTS();//打開中斷}vTaskDelay(1000);//延時1000個時鐘節拍,就是1sconfigTICK_RATE_HZ}}3、定時器中斷服務函數voidTIM6_IRQHandler(void){if(TIM_GetITStatus(TIM6,TIM_IT_Update))//是否產生中斷{printf("TIM6中斷\r\n");TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除中斷標誌位}}voidTIM7_IRQHandler(void){if(TIM_GetITStatus(TIM7,TIM_IT_Update))//是否產生中斷{printf("TIM7中斷\r\n");TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除中斷標誌位}}4、測試結果5、注意事項

臨界區、中斷服務函數、開關中斷中不能使用vTaskDelay()函數,此函數就是要交出CPU一段時間,如果任務一直不延時或者掛起,那麼低優先級的任務會無法獲得CPU。

作者:李肖遙

來源:技術讓夢想更偉大


溫馨提示:

因最近微信公眾平台推送規則改變,很多讀者反饋沒有及時看到更新的文章。根據最新規則,建議多點擊「推薦閱讀、分享、收藏」等,成為常讀用戶。

推薦閱讀:

為什麼國產芯片也用英文寫「datasheet」?

老闆捨不得報廢服務器主板,逼我出具X光報告

耗時2個月拆解一輛特斯拉,沒想到扒出這些秘密!


請點下【在看】給小編加雞腿


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()