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