無(wú)名創(chuàng)新售后群?jiǎn)栴}節(jié)選:飛控四個(gè)串口同時(shí)采集傳感器數(shù)據(jù),應(yīng)該如何設(shè)計(jì)中斷優(yōu)先級(jí)
請(qǐng)問(wèn)小哥,飛控如果需要通過(guò)三四個(gè)串口同時(shí)采集多個(gè)傳感器數(shù)據(jù),應(yīng)該如何設(shè)計(jì)中斷優(yōu)先級(jí),會(huì)不會(huì)出現(xiàn)當(dāng)某一傳感器發(fā)送頻率過(guò)快時(shí),一直占用改串口中斷函數(shù)而進(jìn)不了其他串口中斷呢?這種該如何解決?謝謝小哥
首先這里需要明白一點(diǎn),串口通訊波特率與數(shù)據(jù)傳輸時(shí)間的關(guān)系,以無(wú)名飛控GPS解析為例,正常工作時(shí),GPS工作以波特率921600,8個(gè)數(shù)據(jù)位,一個(gè)起始位,一個(gè)停止位。921600bps/(8+1+1)bit=傳輸92160字節(jié)/s,故串口傳輸一個(gè)字節(jié)用時(shí)1000000us/92160≈10.85us,這里可以簡(jiǎn)單計(jì)算一下,飛控接受pvt語(yǔ)句開(kāi)銷92數(shù)據(jù)位+2檢驗(yàn)位=94,94*10.85約等于1.02ms,與飛控實(shí)際測(cè)試時(shí)間基本一致,實(shí)際也可以測(cè)試115200、38400通訊時(shí)開(kāi)銷分別為8.53ms、25.6ms,接受單個(gè)字節(jié)耗時(shí)分別為86.8us、264.4us。 以GPS解析為說(shuō)明串口傳輸時(shí)間后,再來(lái)考慮中斷問(wèn)題,首先為保障數(shù)據(jù)不丟幀,當(dāng)只存在一個(gè)串口中斷時(shí),該串口中斷內(nèi)部函數(shù)執(zhí)行時(shí)間,務(wù)必要小于該串口的傳輸一個(gè)直接所需的時(shí)間,以波特率115200的串口1為例,串口1的中斷函數(shù)執(zhí)行時(shí)間務(wù)必小于86.8us,即串口1的下一個(gè)字節(jié)傳輸來(lái)之前,上一個(gè)字節(jié)的串口中斷處理函數(shù)務(wù)必運(yùn)行完成,否則數(shù)據(jù)就會(huì)丟幀。 所以一般來(lái)講,串口中斷函數(shù)里面都不會(huì)去執(zhí)行大段時(shí)間開(kāi)銷的任務(wù),目的就是確保不丟幀,常用的辦法是在串口中斷里面采用環(huán)形隊(duì)列緩沖區(qū)存儲(chǔ)數(shù)據(jù),數(shù)據(jù)解析用低優(yōu)先級(jí)的任務(wù)去處理。 環(huán)形隊(duì)列緩沖區(qū)存儲(chǔ)函數(shù)的執(zhí)行時(shí)間在STM32F1里面大概2us不到,在STM32F4里面不足1us,所以當(dāng)串口中斷函數(shù)里面只運(yùn)行環(huán)形對(duì)接緩沖區(qū)存儲(chǔ)函數(shù)時(shí),即使以波特圖921600(傳輸一個(gè)字節(jié)10.85us)通訊,數(shù)據(jù)也不會(huì)丟幀。 當(dāng)存在多個(gè)串口接受函數(shù)時(shí),此時(shí)以STM32F1為例,假設(shè)環(huán)形隊(duì)列緩沖區(qū)存儲(chǔ)函數(shù)的執(zhí)行時(shí)間在STM32F1里面為2us,此時(shí)存在6個(gè)串口中斷以波特率921600同時(shí)運(yùn)行,各中斷彼此之間不能打斷,但是存在子優(yōu)先順序,同一時(shí)刻6個(gè)中斷全部掛起,這個(gè)時(shí)候系統(tǒng)首先響應(yīng)子優(yōu)先級(jí)第一的串口中斷接受函數(shù)耗時(shí)2us,接著依次響應(yīng)子優(yōu)先級(jí)23456,當(dāng)?shù)?個(gè)串口中斷函數(shù)剛開(kāi)始執(zhí)行時(shí)是第10us,在10—12us時(shí)系統(tǒng)正在執(zhí)行第6個(gè)串口中斷函數(shù),在10.85us時(shí)刻,下一次串口中斷又來(lái)了,此時(shí)便發(fā)生了數(shù)據(jù)丟幀。可以可以想一下,此時(shí)在不丟幀情況下,系統(tǒng)能設(shè)計(jì)的最大串口中斷數(shù)為5個(gè)。 上面是以很極端的例子說(shuō)明了丟幀在實(shí)際系統(tǒng)中是怎么發(fā)生的,一般串口通訊波特率不會(huì)到921600這么大,并且不是每個(gè)串口都必須工作在同一波特率,當(dāng)工作波特率為115200時(shí),串口接收單個(gè)字節(jié)為86.8us,此情況下系統(tǒng)能夠執(zhí)行足夠多的串口中斷函數(shù),仍然能確保不丟幀。所以當(dāng)系統(tǒng)所需串口中斷很多時(shí),可以通訊把波特率降下來(lái),來(lái)確保不數(shù)據(jù)丟幀。 以上只考慮了串口中斷彼此之間開(kāi)銷,當(dāng)系統(tǒng)存在比串口中斷接收優(yōu)先級(jí)更好的中斷任務(wù)時(shí),比如利用外部中斷的ppm接收、超聲波測(cè)距等,為了確保串口不丟幀,需要優(yōu)先級(jí)高于串口中斷的任務(wù)最大執(zhí)行時(shí)間+串口中斷函數(shù)執(zhí)行時(shí)間,務(wù)必小于串口接收單個(gè)字節(jié)所需的時(shí)間,才能確保不丟幀。?
總結(jié):?
1、多個(gè)串口通訊時(shí),串口通訊波特率可以降低一點(diǎn)。?
2、合計(jì)設(shè)計(jì)優(yōu)先級(jí),當(dāng)存在不同波特率通訊時(shí),通訊波特率高的串口中斷優(yōu)先級(jí)要高于波特率低的。?
3、存在優(yōu)先級(jí)高于串口中斷的其它中斷任務(wù)時(shí),其它中斷任務(wù)的總的最大時(shí)間開(kāi)銷也要考慮。
祝好?
無(wú)名小哥:余義
