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