FreeRTOS中斷簡(jiǎn)介
任何調(diào)用中斷安全FreeRTOS API函數(shù)的中斷服務(wù)例程都可以使用的最高中斷優(yōu)先級(jí)。不要從任何優(yōu)先級(jí)高于此的中斷調(diào)用中斷安全FREERTOS API函數(shù)(優(yōu)先級(jí)越高,數(shù)值越低)。
代碼如下(版本FreeRTOS V202107.00):
/*Cortex-M specific definitions.*/ #ifdef __NVIC_PRIO_BITS /*__BVIC_PRIO_BITS will be specified when CMSIS is being used.*/ #define configPRIO_BITS__NVIC_PRIO_BITS #else #define configPRIO_BITS4/*15 priority levels*/ #endif /*The lowest interrupt priority that can be usedina call to a"set priority" function.*/ #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY0xf /*The highest interrupt priority that can be used by any interrupt service routine that makes calls to interrupt safe FreeRTOS APIfunctions.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 5 /*Interrupt priorities used by the kernel port layer itself.These are generic to all Cortex-M ports,anddonot rely on any particular libraryfunctions.*/ #define configKERNEL_INTERRUPT_PRIORITY(configLIBRARY_LOWEST_INTERRUPT_PRIORITY<(8?-?configPRIO_BITS)?) /*?!!!!?configMAX_SYSCALL_INTERRUPT_PRIORITY must not be?set?to zero?!!!! See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html.?*/ #define configMAX_SYSCALL_INTERRUPT_PRIORITY??(?configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY?<(8?-?configPRIO_BITS)?)
configMAX_SYSCALL_INTERRUPT_PRIORITY 高于此優(yōu)先級(jí)的中斷,不能被禁止。
測(cè)試過(guò)程
開(kāi)啟定時(shí)器TIM6和TIM7,兩個(gè)定時(shí)器每隔一定時(shí)間串口打印一次,設(shè)置定時(shí)器TIM6中斷優(yōu)先級(jí)為4,定時(shí)器TIM7中斷優(yōu)先級(jí)為5, 高于 5 的優(yōu)先級(jí)(即優(yōu)先級(jí)數(shù)小于5)不歸操作系統(tǒng)管理。
簡(jiǎn)而言之,定時(shí)器TIM6不歸FreeRTOS管理,在關(guān)閉中斷時(shí),低于優(yōu)先級(jí)5的都會(huì)被關(guān)閉,高于或者等于優(yōu)先級(jí)5的都會(huì)被關(guān)閉。
1、創(chuàng)建中斷測(cè)試任務(wù)
xTaskCreate((TaskFunction_t)interrupt_task,//任務(wù)函數(shù) (const char*)"interrupt_task",//任務(wù)名稱 (uint16_t)INTERRUPT_STK_SIZE,//任務(wù)堆棧大小 (void*)NULL,//傳遞給任務(wù)函數(shù)的參數(shù) (UBaseType_t)INTERRUPT_TASK_PRIO,//任務(wù)優(yōu)先級(jí) (TaskHandle_t*)&INTERRUPTTask_Handler);//任務(wù)句柄
2、中斷測(cè)試任務(wù)函數(shù)
void interrupt_task(void*pvParameters) { static u32 count_num=0; while(1) { count_num++; if(count_num==5) { printf("關(guān)閉中斷............. "); portDISABLE_INTERRUPTS();//關(guān)閉中斷 delay_xms(5000);//延時(shí)5s printf("打開(kāi)中斷............. "); portENABLE_INTERRUPTS();//打開(kāi)中斷 } vTaskDelay(1000);//延時(shí)1000個(gè)時(shí)鐘節(jié)拍,就是1sconfigTICK_RATE_HZ } }
3、定時(shí)器中斷服務(wù)函數(shù)
void TIM6_IRQHandler(void) { if(TIM_GetITStatus(TIM6,TIM_IT_Update))//是否產(chǎn)生中斷 { printf("TIM6中斷 "); TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除中斷標(biāo)志位 } } void TIM7_IRQHandler(void) { if(TIM_GetITStatus(TIM7,TIM_IT_Update))//是否產(chǎn)生中斷 { printf("TIM7中斷 "); TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除中斷標(biāo)志位 } }
4、測(cè)試結(jié)果
5、注意事項(xiàng)
臨界區(qū)、中斷服務(wù)函數(shù)、開(kāi)關(guān)中斷中不能使用vTaskDelay()函數(shù),此函數(shù)就是要交出CPU一段時(shí)間,如果任務(wù)一直不延時(shí)或者掛起,那么低優(yōu)先級(jí)的任務(wù)會(huì)無(wú)法獲得CPU。
審核編輯:劉清
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211574 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114715 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62139 -
中斷優(yōu)先級(jí)
+關(guān)注
關(guān)注
0文章
22瀏覽量
9368
原文標(biāo)題:FreeRTOS避坑指南之中斷測(cè)試
文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論