<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 汽車(chē)電子 > 牛人業(yè)話(huà) > 頻繁中斷的ISR,執行時(shí)間需要優(yōu)化

頻繁中斷的ISR,執行時(shí)間需要優(yōu)化

作者:山坡羊 時(shí)間:2019-07-19 來(lái)源:電子產(chǎn)品世界 收藏

花兒開(kāi),鳥(niǎo)兒叫,早起上班的路迢迢。風(fēng)兒吹,陽(yáng)光照,為國工作的豪情萬(wàn)丈高。

本文引用地址:http://dyxdggzs.com/article/201907/402884.htm

1563518811969560.jpg

那日,灑家虎虎生風(fēng)地走在上班的路上,正好碰上一位父親領(lǐng)著(zhù)女兒去上幼兒園??吹贸鰜?lái),小家伙兒的起床氣還沒(méi)有完全消散,耷拉著(zhù)腦袋,慢騰騰地踢踏著(zhù)。爸爸一邊急火火地拽著(zhù)女兒的小胳膊往前趕,一邊跟她說(shuō)著(zhù)什么。

灑家正待從這對父女倆身邊走過(guò)時(shí),正聽(tīng)得爸爸彎著(zhù)腰對女兒說(shuō):“不上幼兒園怎么上小學(xué)呀?”小丫頭片子奶聲奶氣地說(shuō)不想上小學(xué)。爸爸不以為然地繼續說(shuō)教著(zhù):“不上小學(xué)怎么上大學(xué)呀?”

‘恩?小學(xué)之后不該是初中嗎,還有高中吶!’我正在心里犯著(zhù)嘀咕,一聲嘹亮的哭腔便劃破空氣,直沖耳膜而來(lái)?;仡^一看,小家伙正一邊甩著(zhù)胳膊打爸爸的屁股,一邊咧著(zhù)大大的嘴巴哭著(zhù)說(shuō):“我什么學(xué)都不想上??!”

我初覺(jué)好笑,繼而感到有些悲哀??粗?zhù)她那梨花帶雨的樣子,一股惆悵在我心底潮起:你以為我愿意上班的嗎?

1563518883797504.jpg

1

順利出差回來(lái)后第一天的上班生活悠閑而自在,可以東轉轉西逛逛,和這個(gè)同事打個(gè)閑茬,和那個(gè)同仁熱切但放松地討論技術(shù)。

但是如果出差不順利,回來(lái)第一天的上班生活就沒(méi)有那么輕松美好了。在邂逅不愿上幼兒園的女娃娃那天,我正是這樣的狀態(tài)。

這次出差的工作任務(wù)是到汽車(chē)廠(chǎng)進(jìn)行總線(xiàn)測試,筆者出發(fā)時(shí)懷著(zhù)脹得鼓鼓的信心,帶著(zhù)游山玩水的閑情逸致,回來(lái)時(shí)揣著(zhù)灰溜溜的挫敗感,和不知如何是好的沮喪。

幾個(gè)月前去測試時(shí),明明測得好好的,這一次,居然測試失敗了!

測試報告中那幾個(gè)夾在綠色OK項目中間的NOK項,發(fā)著(zhù)悠悠的紅光,帶著(zhù)冷冷的笑意,讓我的寒意從頭頂直接涼到了大地。

1563518906588774.jpg

點(diǎn)開(kāi)這幾個(gè)NOK項的測試數據,一行行標記著(zhù)報文收發(fā)時(shí)間、收發(fā)方向、ID、數據場(chǎng)的數據眼花繚亂地撲面而來(lái)。根據錯誤提示,筆者產(chǎn)品發(fā)送報文的周期性沒(méi)有滿(mǎn)足要求。我拖著(zhù)鼠標從左拖到西,又從上拖到下,終于發(fā)現,有一條以50ms為周期固定發(fā)送的報文,有那么一次,沒(méi)有及時(shí)地發(fā)出來(lái)。

各種思路向我的腦海涌來(lái),灑家穩了穩心神,首先把懷疑的目光放到了代碼的一致性上面。如果兩個(gè)版本的代碼不一致,把代碼改回去就還有測試通過(guò)的希望??!

許是這幾個(gè)月來(lái)不小心改了代碼中的哪個(gè)模塊或哪個(gè)函數呢?

我迫不及待地調出了幾個(gè)月前來(lái)做第一次測試時(shí)的代碼,用Beyond Compare對比工具和這次的測試代碼進(jìn)行了比對。

除了這幾個(gè)月中添加的許多其它模塊的代碼,CAN通信代碼竟然是一致的。剛剛升起的一絲希望被無(wú)情地澆滅了。通信代碼一致意味著(zhù),是這幾個(gè)月來(lái)添加的不知道哪段代碼改變了這次的測試結果。

麻煩大了!這幾個(gè)月來(lái)添了那么多代碼,鬼才知道到底是哪塊影響了倒霉的CAN通信。

在汽車(chē)廠(chǎng)搞了一天,仍然不得要領(lǐng),測試MM也開(kāi)始置我的美色于不顧,露出不耐煩的神色來(lái),于是我只好灰溜溜地回了公司。

2

據說(shuō)籃球和足球比賽有主場(chǎng)、客場(chǎng)之分,在自己的主場(chǎng)上,在一眾球迷的吶喊助威下,在家鄉父老的氣氛烘托下,球隊容易比出好的成績(jì)來(lái)。

回到公司的我,雖然聽(tīng)不到同事們的鼓掌聲,但是,回到自己熟悉的地盤(pán),戰斗力也直線(xiàn)上升。

我戴上耳機,耳旁響起舒緩的輕音樂(lè ),在仿佛與世隔絕的靜謐中,我小心地觀(guān)察著(zhù)那幾個(gè)測試NOK項的測試數據。

很快,這些數據的特征浮現在灑家的面前。

在這幾項測試中,測試軟件發(fā)送了大量?jì)?yōu)先級或高或低的無(wú)關(guān)報文,相比之下,之前的測試中也發(fā)送了大量報文,但是都是產(chǎn)品用得到的報文。

不同之處找到了,問(wèn)題的原因自然也就很容易找到了。為了幫助讀者理解,筆者先簡(jiǎn)單介紹一下CAN報文接收的處理程序:

總線(xiàn)上接收到報文時(shí),被觸發(fā)報文接收中斷。

進(jìn)入ISR程序后,會(huì )拿接收到的報文ID和產(chǎn)品規范所定義的需要解析的ID依次進(jìn)行比較。

經(jīng)過(guò)若干次比較后,如果接收報文ID和需要解析的ID一致,把報文存入接收緩沖區,發(fā)送“接收到新報文”信號。如果不一致,表明接收到的是無(wú)關(guān)報文,直接丟棄報文。

在灑家這個(gè)產(chǎn)品中,需要解析大約20條報文。為了簡(jiǎn)單,筆者按照ID從小到大的順序進(jìn)行比較。顯然,無(wú)關(guān)報文需要進(jìn)行20次比較,最終被MCU丟棄掉,相關(guān)報文進(jìn)行比較的平均次數則為10次。實(shí)際上,測試軟件給出的那幾個(gè)OK項測試中,最多的比較次數也沒(méi)有超過(guò)10次。

寫(xiě)到這里,問(wèn)題的原因呼之欲出了!在大量高頻次報文的沖擊下,MCU一直忙于進(jìn)行ID的比較匹配。無(wú)關(guān)報文的沖擊力量尤甚,因為MCU進(jìn)入報文接收ISR后,每次都要進(jìn)行多達20次比較??!

1563518972148102.jpg

深諳摩爾定律的看官也許笑了,現在MCU性能這么高,20次比較算逑?!

3

筆者喜歡拿數據說(shuō)話(huà),這回咱就用初中數學(xué)知識掰扯掰扯。

CAN報文的數據幀由7個(gè)不同的位場(chǎng)組成:幀起始、仲裁場(chǎng)、控制場(chǎng)、數據場(chǎng)、CRC場(chǎng)、應答場(chǎng)、幀結尾。

其中,幀起始標志數據幀和遠程幀的起始,由一個(gè)單獨的“顯性”位組成。仲裁場(chǎng)包括識別符和遠程發(fā)送請求位(RTR)。識別符的長(cháng)度為11位??刂茍?chǎng)由6個(gè)位組成,包括數據長(cháng)度代碼和兩個(gè)將來(lái)作為擴展用的保留位。數據場(chǎng)由數據幀中的發(fā)送數據組成。它可以為0~8 個(gè)字節。CRC場(chǎng)包括CRC序列(CRC SEQUENCE),其后是CRC界定符(CRC DELIMITER)。CRC序列為15位,CRC界定符包含一個(gè)單獨的“隱性”位 。應答場(chǎng)長(cháng)度為2個(gè)位,包含應答間隙(ACK SLOT)和應答界定符(ACK DELIMITER)。幀結尾由一標志序列界定。這個(gè)標志序列由7 個(gè)“隱性”位組成。

所以一個(gè)8字節的數據幀的位數為1(幀起始)+ 12(仲裁場(chǎng))+ 6(控制場(chǎng))+ 64(數據場(chǎng))+ 16(CRC場(chǎng))+ 2(應答場(chǎng))+ 7(幀結尾)= 108位。

報文之間存在幀間空間INTERFRAME SPACE。幀間包括間歇場(chǎng)、總線(xiàn)空閑的位場(chǎng)。間歇場(chǎng)包括3 個(gè)“隱性”的位。

所以,一個(gè)8字節的數據幀至少需要(108+3+1)* bitrate的時(shí)長(cháng),對于125kbps,需要0.896ms。對于500kbps,需要0.224ms。

不巧的是,筆者的產(chǎn)品需要面臨的就是500kbps通訊速率的總線(xiàn)通信。

那么問(wèn)題來(lái)了,0.224ms來(lái)一次中斷,每次中斷執行20次數據比較,你說(shuō)MCU累不累?

累,MCU累得都快冒煙了!

0001.jpg

劍客的最高境界是人劍合一,人就是劍,劍就是人。灑家遠沒(méi)有到碼農的最高境界,但也高山仰止,知道要善待MCU,才能最終達到人機合一。

看著(zhù)累得偶爾愣了神忘了發(fā)送報文的MCU,筆者在心疼又無(wú)奈的淚眼朦朧中苦苦思索著(zhù),怎么給MCU減減負呢?

4

這里要做的工作一言以蔽之,就是針對頻繁中斷的ISR,優(yōu)化它的執行時(shí)間,卸掉MCU的負擔。

看著(zhù)那20個(gè)需要進(jìn)行比較的報文ID,灑家眉頭一皺,計上心來(lái)。

CAN報文ID是11位,頭三位的取值為0-7,相當于將CAN報文ID的取值區間劃分成了八段,分別是0-0xff、0x100-0x1ff、0x200-0x2ff。。。0x700-0x7ff。

如果將CAN報文ID右移八位,得到頭三位取值,就可以知道這個(gè)報文ID處于這八段取值區間的哪一段,然后再到這個(gè)段內進(jìn)行比較,比較次數不就下降很多了嗎?

比如說(shuō),產(chǎn)品需要解析的0x700-0x7ff段的ID有0x701、0x7df兩個(gè)報文,接收到一個(gè)0x745的無(wú)關(guān)報文時(shí),之前的比較次數是20次,現在是執行一次8位移位,然后進(jìn)行2次比較。

只需要執行一次移位運算,比較次數從20次陡然下降到了2次??!

我被這種效率的提升幅度驚呆了。只是一個(gè)非常簡(jiǎn)單的方法,就得到了這么好的效果!

帶著(zhù)修改后的代碼,懷著(zhù)一絲忐忑九分坦蕩,灑家又直奔汽車(chē)廠(chǎng)測試去了。

測試通過(guò)后,測試MM向我投來(lái)贊許的目光,我回之以笑意,心中實(shí)則感慨萬(wàn)千。

時(shí)間是世界上最為倔強的東西,它一往無(wú)前,絕不回頭。但是魯迅先生說(shuō):時(shí)間就像海綿里的水,擠一擠總會(huì )有的。

MCU的能力也是如此,只要你懷著(zhù)一顆精益求精的心,好好地設計代碼,比如對于頻繁中斷的ISR,執行時(shí)間仔細優(yōu)化,就能很好地駕馭它,發(fā)揮它的潛力。

套用魯迅先生的話(huà),就是:

MCU的性能就是海綿里的水,擠一擠總會(huì )有的!



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>