freeRTOS之中斷管理學(xué)習(xí)心得
移植了FREERTOS后就創(chuàng)建了幾個(gè)TASK,內(nèi)核中斷和TASK之間一直用共享內(nèi)存和全局變量進(jìn)行通訊。這樣做對(duì)于一個(gè)簡(jiǎn)單的工程來說雖然也沒什么,但是隨著內(nèi)容的增加,代碼結(jié)構(gòu)會(huì)越來越臃腫丑陋,且缺少結(jié)構(gòu)性。而沒用到隊(duì)列通信,信號(hào)量同步這些,也實(shí)在不能說了解和會(huì)用FREERTOS,整個(gè)工程也缺少了靈魂。
之所以不用,是因?yàn)橛袔讉€(gè)問題一直沒搞明白,不會(huì)用也不敢用。
1、如何使用FREERTOS提供的ISR的函數(shù)?
2、想要使用FREERTOS提供的ISR的函數(shù), 內(nèi)核中斷的優(yōu)先級(jí)就要小于configMAX_SYSCALL_INTERRUPT_PRIORITY,這樣freeRTOS會(huì)不會(huì)影響內(nèi)核中斷?
網(wǎng)上也查看了一段時(shí)間了,但是一直還是不能搞明白。在看了韋老師講解的終于搞清楚了心中的幾個(gè)疑惑
全網(wǎng)找到的講的最清晰的文章 第十一章 中斷管理(Interrupt Management) — 韋東山百問網(wǎng)freeRTOS教程 文檔 (100ask.net)
(本來放的是CSDN的連接,但是我討厭CSDN,不想給它做引流,于是把韋老師官網(wǎng)的連接掛上)
1、如何使用FREERTOS提供的ISR的函數(shù)?
這個(gè)很簡(jiǎn)單,答案就是問題2。
比如說configMAX_SYSCALL_INTERRUPT_PRIORITY = 5,那么UART的nvic_irq_pre_priority = 6,這樣就可以在UART的中斷服務(wù)程序里調(diào)用帶有ISR的freeRTOS函數(shù)了。
void Usart_init()
{
...
/* USART interrupt configuration */
nvic_irq_enable(UART4_IRQn, 6, 0);
...
}
void UART4_IRQHandler(void)
{
if(usart_flag_get(UART4,USART_INT_RBNEIE)!= RESET)
{
usart_flag_clear(UART4,USART_INT_RBNEIE);
}
xQueueSendToBackFromISR(...);
}
2、想要使用FREERTOS提供的ISR的函數(shù), 內(nèi)核中斷的優(yōu)先級(jí)就要小于configMAX_SYSCALL_INTERRUPT_PRIORITY,這樣freeRTOS會(huì)不會(huì)影響內(nèi)核中斷?
這里貼上韋老師文章里的這段話就能理解了:

所以我們即使按照1設(shè)置了串口的中斷等級(jí)=6,當(dāng)來中斷時(shí),還是會(huì)打斷TASK去執(zhí)行UART中斷的。所要注意的只是中斷里調(diào)用的系統(tǒng)函數(shù)都要是xxFromISR()這種的,這種函數(shù)不會(huì)阻塞。這樣就可以用FREERTOS系統(tǒng)函數(shù)實(shí)現(xiàn)中斷與TASK之間的通信和同步了
本文來自博客園,作者:xjxcxjx,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/xjxcxjx/p/16896612.html,謝絕CSDN轉(zhuǎn)載!
浙公網(wǎng)安備 33010602011771號(hào)