FreeRTOS中斷簡介
任何調用中斷安全FreeRTOS API函數的中斷服務例程都可以使用的最高中斷優先級。不要從任何優先級高于此的中斷調用中斷安全FREERTOS API函數(優先級越高,數值越低)。
代碼如下(版本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 高于此優先級的中斷,不能被禁止。
測試過程
開啟定時器TIM6和TIM7,兩個定時器每隔一定時間串口打印一次,設置定時器TIM6中斷優先級為4,定時器TIM7中斷優先級為5, 高于 5 的優先級(即優先級數小于5)不歸操作系統管理。
簡而言之,定時器TIM6不歸FreeRTOS管理,在關閉中斷時,低于優先級5的都會被關閉,高于或者等于優先級5的都會被關閉。
1、創建中斷測試任務
xTaskCreate((TaskFunction_t)interrupt_task,//任務函數 (const char*)"interrupt_task",//任務名稱 (uint16_t)INTERRUPT_STK_SIZE,//任務堆棧大小 (void*)NULL,//傳遞給任務函數的參數 (UBaseType_t)INTERRUPT_TASK_PRIO,//任務優先級 (TaskHandle_t*)&INTERRUPTTask_Handler);//任務句柄
2、中斷測試任務函數
void interrupt_task(void*pvParameters) { static u32 count_num=0; while(1) { count_num++; if(count_num==5) { printf("關閉中斷............. "); portDISABLE_INTERRUPTS();//關閉中斷 delay_xms(5000);//延時5s printf("打開中斷............. "); portENABLE_INTERRUPTS();//打開中斷 } vTaskDelay(1000);//延時1000個時鐘節拍,就是1sconfigTICK_RATE_HZ } }
3、定時器中斷服務函數
void TIM6_IRQHandler(void) { if(TIM_GetITStatus(TIM6,TIM_IT_Update))//是否產生中斷 { printf("TIM6中斷 "); TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除中斷標志位 } } void TIM7_IRQHandler(void) { if(TIM_GetITStatus(TIM7,TIM_IT_Update))//是否產生中斷 { printf("TIM7中斷 "); TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除中斷標志位 } }
4、測試結果
5、注意事項
臨界區、中斷服務函數、開關中斷中不能使用vTaskDelay()函數,此函數就是要交出CPU一段時間,如果任務一直不延時或者掛起,那么低優先級的任務會無法獲得CPU。
審核編輯:劉清
-
cpu
+關注
關注
68文章
11029瀏覽量
215867 -
定時器
+關注
關注
23文章
3285瀏覽量
117117 -
FreeRTOS
+關注
關注
12文章
486瀏覽量
63708 -
中斷優先級
+關注
關注
0文章
22瀏覽量
9527
原文標題:FreeRTOS避坑指南之中斷測試
文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
嵌入式開發避坑指南|FreeRTOS的5個\"反直覺\"小技巧
分享一些嵌入式系統編程中內存操作相關的避坑指南
FreeRTOS實時內核使用指南-中文
基于STM32應用的FreeRTOS中斷設置

STM32之FreeRTOS:(一) 中斷配置和臨界段的使用

評論