中斷中使用FreeRtos API注意事項
阿新 • • 發佈:2022-05-07
1.優先順序問題
圖一
圖二
圖三
在stm32cube中FreeRTOS有以上兩個配置,其代表了RTOS可以呼叫的最高和最低中斷優先順序,若在優先順序不屬於該定義的中斷中呼叫FreeRTOS相關函式,則有可能呼叫vPortValidateInterruptPriority安全函式,導致程式停止執行。
1void vPortValidateInterruptPriority( void ) 2 { 3 uint32_t ulCurrentInterrupt; 4 uint8_t ucCurrentPriority; 5 //參考核心指南,這個命令是獲取當前的中斷號 6 ulCurrentInterrupt = vPortGetIPSR(); 7 /*portFIRST_USER_INTERRUPT_NUMBER 是一個和晶片相關的使用者中斷號 8 在M3、M4的晶片上就是15以後是外部中斷的中斷號所以這裡配置成16 9 判斷是不是在外部中斷中呼叫的API函式,如果是執行if裡的內容*/ 10 if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) 11 { 12 /*根據中斷服務函式的中斷號獲取當前中斷的優先順序設定*/ 13 ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; 14 /*如果當前執行的中斷優先順序數字小於配置ucMaxSysCallPriority這個值實際上是 15 configMAX_SYSCALL_INTERRUPT_PRIORITY,也就是當前中斷優先順序高於配置最高優先順序16 斷言將會失敗,程式將停止在這裡*/ 17 configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); 18 } 19 /*當前中斷優先順序分組組大於配置分組(也就是表示搶佔優先順序的位數少於配置)則斷言失敗,程式停止*/ 20 configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); 21 }
2.掛起(xTaskResume())恢復(xTaskResumeFromISR())使用
帶FromISR的API才能在中斷中呼叫;
如果函式xTaskResumeFromISR()返回值為pdTRUE,那麼說明要恢復的這個任務的任務優先順序等於或者高於正在執行的任務(被中斷打斷的任務),所以在退出中斷前一定要進行上下文切換!
1 status = xTaskResumeFromISR(dataTaskHandle);//恢復任務 2 if(status==pdTRUE) 3 { 4 portYIELD_FROM_ISR(status); 5 }
xTaskResume(NULL)掛起自身,存在對耗時有要求的任務時,其它同優先順序任務可以掛起的儘量掛起。