<var id="spdps"><u id="spdps"><rp id="spdps"></rp></u></var>
    <acronym id="spdps"><form id="spdps"><mark id="spdps"></mark></form></acronym>
    1. <acronym id="spdps"><form id="spdps"><mark id="spdps"></mark></form></acronym>
    2. 新聞中心

      EEPW首頁 > 汽車電子 > 牛人業話 > 頻繁中斷的ISR,執行時間需要優化

      頻繁中斷的ISR,執行時間需要優化

      作者:山坡羊時間:2019-07-19來源:電子產品世界收藏

      花兒開,鳥兒叫,早起上班的路迢迢。風兒吹,陽光照,為國工作的豪情萬丈高。

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

      1563518811969560.jpg

      那日,灑家虎虎生風地走在上班的路上,正好碰上一位父親領著女兒去上幼兒園。看得出來,小家伙兒的起床氣還沒有完全消散,耷拉著腦袋,慢騰騰地踢踏著。爸爸一邊急火火地拽著女兒的小胳膊往前趕,一邊跟她說著什么。

      灑家正待從這對父女倆身邊走過時,正聽得爸爸彎著腰對女兒說:“不上幼兒園怎么上小學呀?”小丫頭片子奶聲奶氣地說不想上小學。爸爸不以為然地繼續說教著:“不上小學怎么上大學呀?”

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

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

      1563518883797504.jpg

      1

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

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

      這次出差的工作任務是到汽車廠進行總線測試,筆者出發時懷著脹得鼓鼓的信心,帶著游山玩水的閑情逸致,回來時揣著灰溜溜的挫敗感,和不知如何是好的沮喪。

      幾個月前去測試時,明明測得好好的,這一次,居然測試失敗了!

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

      1563518906588774.jpg

      點開這幾個NOK項的測試數據,一行行標記著報文收發時間、收發方向、ID、數據場的數據眼花繚亂地撲面而來。根據錯誤提示,筆者產品發送報文的周期性沒有滿足要求。我拖著鼠標從左拖到西,又從上拖到下,終于發現,有一條以50ms為周期固定發送的報文,有那么一次,沒有及時地發出來。

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

      許是這幾個月來不小心改了代碼中的哪個模塊或哪個函數呢?

      我迫不及待地調出了幾個月前來做第一次測試時的代碼,用Beyond Compare對比工具和這次的測試代碼進行了比對。

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

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

      在汽車廠搞了一天,仍然不得要領,測試MM也開始置我的美色于不顧,露出不耐煩的神色來,于是我只好灰溜溜地回了公司。

      2

      據說籃球和足球比賽有主場、客場之分,在自己的主場上,在一眾球迷的吶喊助威下,在家鄉父老的氣氛烘托下,球隊容易比出好的成績來。

      回到公司的我,雖然聽不到同事們的鼓掌聲,但是,回到自己熟悉的地盤,戰斗力也直線上升。

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

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

      在這幾項測試中,測試軟件發送了大量優先級或高或低的無關報文,相比之下,之前的測試中也發送了大量報文,但是都是產品用得到的報文。

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

      總線上接收到報文時,被觸發報文接收中斷。

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

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

      在灑家這個產品中,需要解析大約20條報文。為了簡單,筆者按照ID從小到大的順序進行比較。顯然,無關報文需要進行20次比較,最終被MCU丟棄掉,相關報文進行比較的平均次數則為10次。實際上,測試軟件給出的那幾個OK項測試中,最多的比較次數也沒有超過10次。

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

      1563518972148102.jpg

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

      3

      筆者喜歡拿數據說話,這回咱就用初中數學知識掰扯掰扯。

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

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

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

      報文之間存在幀間空間INTERFRAME SPACE。幀間包括間歇場、總線空閑的位場。間歇場包括3 個“隱性”的位。

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

      不巧的是,筆者的產品需要面臨的就是500kbps通訊速率的總線通信。

      那么問題來了,0.224ms來一次中斷,每次中斷執行20次數據比較,你說MCU累不累?

      累,MCU累得都快冒煙了!

      0001.jpg

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

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

      4

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

      看著那20個需要進行比較的報文ID,灑家眉頭一皺,計上心來。

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

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

      比如說,產品需要解析的0x700-0x7ff段的ID有0x701、0x7df兩個報文,接收到一個0x745的無關報文時,之前的比較次數是20次,現在是執行一次8位移位,然后進行2次比較。

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

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

      帶著修改后的代碼,懷著一絲忐忑九分坦蕩,灑家又直奔汽車廠測試去了。

      測試通過后,測試MM向我投來贊許的目光,我回之以笑意,心中實則感慨萬千。

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

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

      套用魯迅先生的話,就是:

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



      評論


      相關推薦

      技術專區

      關閉
      成人影音先锋资源