任務(wù)堆棧不是系統(tǒng)堆棧 搞混了就會完蛋
萬物蟄伏,一片肅殺之意籠罩著寒冷的大地,高昂提拔的白楊樹卻帶著高深莫測的微笑,獨獨地褪去了所有的衣裳,高舉著光禿禿的枝杈,鐵劍似地直直伸向天空。
本文引用地址:http://www.ex-cimer.com/article/201904/399825.htm清冷的天空既高且遠,露出冷冷的笑容,透過濃濃的霧霾,將慘淡的日光灑落下來,把高高的白楊樹打成一片雜亂且孤寂的影子,散落在路旁的野草上。
坐在電腦面前的我,一邊指著屏幕上的幾行代碼,一邊義憤填膺地看著齊工臉上高深莫測的微笑,帶著冷冷、慘淡的口吻,機關(guān)槍似的幾句話就把他那種孤傲的作態(tài)打得凌亂不堪了。
“齊工,你給我的代碼自己到底有沒有測試過?在我這邊一跑就飛了,跑飛了曉得吧!早在干這個活的時候我就跟你們?nèi)宕蔚卣f過,你們寫模塊、我做系統(tǒng)咱們一定要配合好。你們一定要把自己做的那個小模塊反復確認了,多測試幾遍再交給我。給我的應(yīng)該是一個直接拿來就能用的模塊,我不負責檢查你們的工作,我整合出來的系統(tǒng)不是你們檢驗自己代碼正確性的地方。曉得吧!”
我和齊工是好哥們,平日里相處甚歡,但是此刻,我就和“臉盲”得分不清身邊的美女是不是自己老婆、臉盲得不知道被裁掉的正是往日口中的“兄弟”的東哥一樣,不再認齊工這個“兄弟”了。
“不可能的呀,我自己測得好好的呢。”幾分惶恐幾分疑惑的齊工把我引到他的電腦上,三下五除二接上板子給我運行了一下,咦,這個“加密認證”模塊在他那里居然運行地好好的。
前情介紹
照例先給大家介紹一點背景。
在一個山寨橫行的國度里,“拿來主義”向來是成功的捷徑之一。對于一家從事電子產(chǎn)品的公司來說,最大的苦痛莫過于:曾經(jīng)有一個加密認證的要求擺在我面前,但是我沒有珍惜,等到別人把產(chǎn)品抄走,以更低的價格銷售一個完全一樣的產(chǎn)品之時,我才追悔莫及。如果上天能再給我一次機會,我一定會在產(chǎn)品中設(shè)計上“加密認證”功能,如果非要在這個功能上加一個期限的話,我希望它永遠不會被破解。
在這個產(chǎn)品知識產(chǎn)權(quán)被屢見不鮮地破解的大環(huán)境中,我司因為技術(shù)水平一般、產(chǎn)品沒有被盜的價值,一直沒有“與有榮焉”地被盜。但是,領(lǐng)導好似腦袋進了水一般,突然覺得自己公司的產(chǎn)品足夠優(yōu)秀,以至于存在被逆向工程的可能,所以就要求在設(shè)計的所有產(chǎn)品中加上一顆Atmel的加密認證芯片,當時我們選擇的是ATSHA204A這顆芯片。
在Atmel加密認證芯片中放些系統(tǒng)運行的關(guān)鍵數(shù)據(jù),或者把少量的關(guān)鍵代碼放入其中,即便模仿者把板子抄去,把MCU中的代碼抄走,但是Atmel加密認證芯片中的數(shù)據(jù)他們破解不了,就是焊上了裸片,不把這些關(guān)鍵數(shù)據(jù)或代碼寫到ATSHA204A里面去,最終的系統(tǒng)還是無法正常運行。
這么一顆芯片要用起來,自然是需要驅(qū)動的,這項光榮而艱巨的任務(wù)都落在我好哥們-齊工-的頭上。
在我看來,這顆芯片的驅(qū)動很簡單,底層采用I2C通信,收發(fā)字節(jié)形式的數(shù)據(jù),上層完成喚醒、發(fā)送挑戰(zhàn)數(shù)、接收響應(yīng)、判斷結(jié)果的任務(wù),這些當然是在底層封裝出來的字節(jié)的基礎(chǔ)上進行的。
那么驅(qū)動分成兩部分實現(xiàn),對于底層驅(qū)動,需要用IO口模擬出I2C通信出來。一個IO口模擬時鐘線,一個可切換輸入輸出方向的IO口模擬數(shù)據(jù)線,通過延時產(chǎn)生時鐘,數(shù)據(jù)線發(fā)完命令后切換回收入方向,接收來自ATSHA204A的數(shù)據(jù)。對于上層驅(qū)動,要執(zhí)行的是喚醒芯片、發(fā)送challenge、接收和驗證response,這部分Atmel都給了相應(yīng)的例程,照葫蘆畫瓢即可。
齊工花了兩個月的時間把Atmel的例程消化吸收了之后,只是把模擬I2C通信的IO口改了改,其它地方幾乎原封不動地轉(zhuǎn)發(fā)給了我,看著這些明顯帶著原廠例程氣息的代碼,看著里面依然殘留的大量只是起到示例作用卻明顯在這里用不到的冗余程序,我有些不明所以。整整兩個月的時間吶,中國的股市上午九點半開盤,下午三點鐘結(jié)束,除掉這個時間段,一天下來還是有不少工作時間的嘛,怎么就花了兩個月的時間,就給了我“這個”?
當然齊工也不是全然沒有貢獻,他把例程中的函數(shù)寫了個說明文檔,告訴我一開始怎么初始化,初始化完之后調(diào)用哪一個函數(shù)。看著這位好兄弟討好的樣子,我忍了忍已經(jīng)到了嗓子眼的話,算了,能用就行了,先用起來,自己再慢慢裁剪掉那些明顯冗余用不到的示例代碼吧。
例程代碼
關(guān)于“例程代碼”,我始終認為,如果沒有把它吃透是很容易出問題的??粗@些充滿了注釋、明顯不符合自己的編碼習慣的例程,最初,我也是不大愿意下心去研究的,正如各位看官所見,在齊工那里運行得好好的程序,到了我的主系統(tǒng)里面卻直接跑飛了,不看代碼是不行的了!
評論