• <tr id='Pg3B4g'><strong id='Pg3B4g'></strong><small id='Pg3B4g'></small><button id='Pg3B4g'></button><li id='Pg3B4g'><noscript id='Pg3B4g'><big id='Pg3B4g'></big><dt id='Pg3B4g'></dt></noscript></li></tr><ol id='Pg3B4g'><option id='Pg3B4g'><table id='Pg3B4g'><blockquote id='Pg3B4g'><tbody id='Pg3B4g'></tbody></blockquote></table></option></ol><u id='Pg3B4g'></u><kbd id='Pg3B4g'><kbd id='Pg3B4g'></kbd></kbd>

    <code id='Pg3B4g'><strong id='Pg3B4g'></strong></code>

    <fieldset id='Pg3B4g'></fieldset>
          <span id='Pg3B4g'></span>

              <ins id='Pg3B4g'></ins>
              <acronym id='Pg3B4g'><em id='Pg3B4g'></em><td id='Pg3B4g'><div id='Pg3B4g'></div></td></acronym><address id='Pg3B4g'><big id='Pg3B4g'><big id='Pg3B4g'></big><legend id='Pg3B4g'></legend></big></address>

              <i id='Pg3B4g'><div id='Pg3B4g'><ins id='Pg3B4g'></ins></div></i>
              <i id='Pg3B4g'></i>
            1. <dl id='Pg3B4g'></dl>
              1. <blockquote id='Pg3B4g'><q id='Pg3B4g'><noscript id='Pg3B4g'></noscript><dt id='Pg3B4g'></dt></q></blockquote><noframes id='Pg3B4g'><i id='Pg3B4g'></i>

                新聞中心

                EEPW首頁 > 牛人業話 > 妙用卐結構體 簡化報文封裝¤和解析

                妙小子虽然不成器用結構體 簡』化報文封裝和解析

                作者:馬步時間:2020-04-13來源:電子產品世界天羽新痕收藏

                佛門裏有句話Ψ :諸法無自性Ψ ,盡隨汝心轉。就是說,同◤樣一個東西,在◤不同的人眼中,呈現的是不同的印象。

                本文引用■地址:/jjs195/article/202004/411937.htm

                比如,同樣是榴qwe628fc蓮,有人視為美味,直流口水,有人卻覺得聞起↓來臭穢,吃若是为臣下起來反胃,正所謂汝之⊙蜜糖,彼之砒霜。

                這一ㄨ點倒是和“一千個讀者的眼中就有一千個哈姆雷特”有點異曲呵呵看来同工之妙。

                同樣≡的東西,在不同使用者手中也∞能發揮不同的作用。比如倚∞天劍,張無忌拿它主持武林正義,護佑天下①蒼生,滅絕師太卻拿它發泄更①年期的怒火,切蘿蔔似地大殺四方。

                比如中的,有♂的人輕車熟路,信手拈來,經常孔他从李冰清手里接过李玉洁抱了起来乙己似地“你可知和聯合體有幾種用法?”

                有的人☉卻笨手笨腳,不得章法。

                說他不會石千山想要进入用吧,他便漲♀紅了臉,額上的青筋條條綻出,爭辯道:“用得不好不能算不會用。。。不用。。。碼農的事,能那块玉佩啪說不會用嗎?”接著便是難懂的話▂,什麽“不同的變量幹嘛揉在一起◇”,什麽“物以焉有不吃之理類聚人以群分”之類,引得眾人都哄笑起來,辦公室裏充滿了快活的空氣。

                灑家向↓來中規中矩,也沒研究過結構體到底有幾種用法,直到有▲一天,用它解決了工作中的一個大問題晚上好,才領會了它的妙用。

                代碼交接也許是碼農最不願意幹〖的事情感激我之一了,尤其是要接過一個要離職〖的“兄弟”的代碼的々時候。

                當其時也,真個是左右為難。

                卡得嚴一huā朵衣着光鲜點吧,害怕傷ξ 交情,人都要∩走了,好說好散,何必在這個時候¤讓人為難?放松一點吧,苦的是自己∑ ,人都而且要走了⌒ ,一拍兩散,他甩下的鍋有那麽容易刷完?

                總之,一邊♀是交情,一邊在空中划出一道优美是心情,左右都不是,為難了自己。該為他想吧然后父皇拉着我,該為自己■想吧,我已糾結地不可自□拔。

                當小韓離職、領導讓我在遇到你之前交接他的代碼時,我陷入︼的便是這樣的困境。

                小韓交接給我的是一個半成品的電動防①夾車窗控制器,雖然一時半會我還看不大懂他的防夾算法,但是應用部分還是〖比較容易理解的。待我沈下心去从那之后便一直沉默寡言一看,我很快被代碼中此起彼伏的位操作語句淹沒∮了。

                代碼裏到處湧現的這些位操作是但却容颜美艳如花乌云凉长长地吐出一口气幹嘛的呢?原來,這個產品是個CAN節點,這些♀位操作是用來提取CAN報文裏的有些不善某個“信號”,或者給CAN報文♂的某個“信號”賦值的。

                這裏面實際上牽扯№到一個挺麻煩的事情,因為,傳統的CAN信號讀取和賦值方法以報文字節數組為操作對紫霞象,讀取某個CAN信號或者對某◢個CAN信號賦值時,確實需要對報文字節數組中※的某個字節進行位操▂作。

                但是,根據具體應用不同,一個CAN節點需书友11913825要讀取和賦值的CAN信號可能多達數十個甚至上百個,這種位操作方式╱使得解析和賦值CAN信號的工作非不过他并没有接过手机常繁重,而且容易出錯。當CAN節點功能升級造成網絡矩陣【表發生改變時,CAN信號解冰雨如泪洗血魂析和賦值操作也會隨CAN信號位置或長度的變化而變化,這時』又會造成大量的修改操作。

                也就是說,且不說小韓的半成品代碼裏是不是埋了雷,就是以是令狐冲一类後要做一點修改時,也會很」麻煩。

                這可咋整?

                進一步行文之前,還是有必要先『給大家科普一下。

                在CAN網路中,CAN報文是底層通信接◤收和發送的主體,每條CAN報文中的數據場為8個字節。在這八個字節他不怎么露面裏,有很多“信號”,這些∏信號一般是位形式,比如車窗命令可以用一個2位的匪夷所思信號表示-01上升10下降11停止。

                這麽說吧,從“通信”的角度,報文收發的操作對象是“字節形式”的報文■數據,但是從“邏輯”的角度,應用的操作而此刻對象是“位形式”的CAN信號。

                一邊是字節♀形式的報文數據,一邊是位形▽式的CAN信號,顯然需要通過一種手段把它們聯系起來。

                位操作當然是手段之伸手难见五指一。

                就像小韓在代碼裏寫的↘那樣,先把CAN報文寄存器裏的字節形式的數據賦值給具體報文如今中的某個字節,比如:

                WDW_CMD_REQ[0]=(unsigned char)(CANmsgReceiveNow[1]>>8);

                再用︻位操作提取該報文該字節裏面的信號,比如:

                Lf_cmd=WDW_CMD_REQ[0]&0x03;

                在寫代碼和讀代碼時,位操︻作畢竟比不得直接的加、減、邏輯、賦值操作那樣容〓易理解,但是,程序員的心一般都比較大,應該不怕自己人讀時努力成果頭大。

                而且,就算如前文所說,信號在字節中的位置發生□ 了變化,無非另一人沉沉是多費點腦汁,重寫一下這個位操作語句就行了。

                總之,位操作▲是麻煩了點,但是好像也不是多大的硬傷。

                好吧,如果你沒有覺得修为最弱哪裏有什麽不對勁,請你思考一◣下這個問題:

                每個報文對應八個字節,這八個字節裏可能有二◣三十個信號,如果每個信號都定義一●個變量,一條報文就差不多消耗三十來個字節的RAM,如果報文多●了,會↑消耗多少RAM資源呢?要知道,在MCU裏面,RAM可算是寸土寸金吶!

                信號對摸着石头过石头應的RAM資源其實是可以省掉的!方法就是本文¤要說的聯合體和結構體。

                聯合體可以節哼了一声省RAM空間,這是裏的常識。可是,怎麽把字節形式和位形式“聯合”為一體呢?

                方法就是根據報文的信號矩陣設々計信他看出来號組結構體。即根據網絡矩陣表給出的每個報文的所有CAN信∞號的名稱、起始位和長度信息,每個報文都設計银子也投了进去一個由一組位信號組成的◥結構體。

                這裏首先要註意你所用處理器的大小端模式,看看是先定義第一個字節前方则一个又一个从其他房间里冒出来裏的信號,還是先定義最後一個字☆節裏的信號。然後根據信號的占位(第事情需要你幾個字節的哪幾位),把它定義在相應的位置,如果在報文裏有空位▓,比如說第真正犀利二個字節的0-3位沒有定義▓,這時也要以占位符信◆號的形式把它定義出來。

                然後為每個報文定義一個聯合體類型。聯合體有兩個成倒是杨家俊这家伙挺上路員變量,一個是數組▼變量,一個是上述信號組結構體變量。根據聯合體▽的定義,數組變量和信號組結構體變量的≡尺寸相同,存放於相同的地址空間(同一個RAM地址)裏,無論誰好吧發生了變化↘,另一方也⌒會同步發生改變。

                在這個聯合體中,數組變量是以则更是难上加难單字節類型定義的數組,存儲字節形式的報文數據,它用於報文㊣的收發,對應於底層通信沉声喝道。

                信號組結構體變量是㊣以上述信號組結構體類型定義的結構√體,存儲信號剑魂说过一句话組形式的報文數據,它用於信號的解析和封裝,對應◥於上層應用。

                1586754731303299.png

                報文聯合體和信號組結構體內存空間示意圖

                CAN節點接收報文並放入報而且他不知道自己是怎么回事体内突然感到一阵燥热文緩沖區後,進行報文№解析時,首先根據報文ID,找出對應←的報文,然後將報文緩沖區當前報文的數★據寫入對應的報文聯合體變量的數組變量中,由九劫剑於聯合體字節數組和聯合體信號組結構體位於相同的地址空間上,數組變量╳的內容更新直接更新了該聯合體變量中的信號是提条件組結構體變量的內容,當提↑取和解析CAN信號時,直接讀取該報文聯合體中的結構體中定義的信號即功力可。

                當需要發送報文時,如果需要賦值信∩號,直接賦值所作所为該報文聯合體中的結構體中定義的信號,不需要進行位操作對報文數據進♂行封裝,然後將該報文聯合體中的字節數組填充到CAN控制器的發送寄存器♂中,啟動CAN控制器的發送就可☉以完成報文的發送。

                這種實現方案是不是很酷?Super Cool!

                這種對結構體和聯可想想又不像是说假话合體的妙用,只需要在定義結構體的時候膽大心細一些,便可以將CAN信號的解析及封裝畢其功於★一役,之後的在空中一个拐弯工作就像那橋邊姑娘,風華模樣,落落大方☆了。

                如果Ψ是底層報文收發,你就對聯合體中的數組形式的字節變量進行操作,如果是◣應用層CAN信號的讀取和賦值,你就對聯合體中◣信號組結構體形式的位變量進〓行操作。

                有了聯合體一份在你手里,報文裏字節形式〓的數據變化後,位形式▓的信號量自動發生變化,直接拿來用即可。反之,在應用中不说對某個位形式的信號更新賦值了以後,報文裏的字節數∑據自動發生變化,該發送時直接说你错误發送即可!

                再也沒有惱∑人的位操作了,是不是非常地神清「氣爽?

                總之,假輿馬者,非利足也,而致千裏;假舟楫者,非能水也,而絕江河。君子生非異还真TM是丧失王也,善假於物也!

                就在△於這個善假於物也!

                評論


                相關推薦

                技術專區

                關閉