軟件工程師換一顆芯片后,會發(fā)生什么?
前言
由于不可抗拒因素,原定性產(chǎn)品替換一顆器件,該器件的目的是防止外界EMI干擾, 位置處于處理器和SD卡之間,器件是為每個SD卡信號線連接100Ω電阻。更換后,SD卡探測正常,從SD卡讀寫幾十KB文件功能正常, 從SD卡數(shù)據(jù)500KB以上的文件永遠(yuǎn)無法讀完,系統(tǒng)其他功能依舊正常,再次插拔SD卡不可識別,只能關(guān)機(jī)重啟。
問題原因:新舊器件的寄生電容有差異,SD卡時鐘信號畸形,處理器SD控制器下面看看整個曲折排查過程
方向錯誤
前天,報告故障時同事沒有把事情給我描述清除,僅說“更換EMI器件后,從SD卡里執(zhí)行系統(tǒng)更新時被卡住了,進(jìn)度條走不完”。我到產(chǎn)線的確每次都能復(fù)現(xiàn)改描述問題。慶幸,容易復(fù)現(xiàn)以前都好辦,可我的排查方向錯了,被問題描述誤導(dǎo)而去檢查設(shè)備驅(qū)動是否存在問題,比如mmc驅(qū)動里某個核心死鎖、等待信號量、while循環(huán)、狀態(tài)機(jī)混亂。納悶著產(chǎn)品都量產(chǎn)好幾年了,從SD卡執(zhí)行系統(tǒng)更新功能我還特別關(guān)注過可靠性。生怕好好一臺設(shè)備升級變磚。于是一下午在新、老器件上嘗試對比差異。生產(chǎn)部門的示波器很難用,只用它初略對比信號高、低電平范圍,沒能捕獲到實(shí)際頻率響應(yīng)特性,粗略觀測到兩設(shè)備插入SD卡后某幾個信號線邏輯電平不一致,一個高電平、一個低電平,至于原因未知。快下班時同事告知:“設(shè)備可以正常保存數(shù)據(jù)文件到SD卡。”。What?有這么神奇?設(shè)備業(yè)務(wù)數(shù)據(jù)每個文件只有200KB以內(nèi),我嘗試著用dd命令在SD卡根目錄創(chuàng)建若干不同大小文件,再telnet到設(shè)備上逐個 hexdump它們,發(fā)現(xiàn)500KB文件大小是個分水嶺。閱讀手冊
次日,對比新老器件的手冊說明,兩器件的差異僅僅在于寄生電容上,老器件寄生電容8.5pF,新器件36pF。其實(shí)這個時候動手算算時間響應(yīng)系數(shù)、SD卡工作頻率、在芯片手冊時序特性就能確認(rèn)故障點(diǎn)在這了,本產(chǎn)品的SDIO時鐘頻率48MHz。SDIO這部分我不是太熟悉,嘗試在群里請求幫助。抱幾臺設(shè)備去實(shí)驗(yàn)室做對比實(shí)驗(yàn),用著熟悉的示波器,操作起來游刃有余。老器件的波形勉強(qiáng)還行,至少算是個正弦波,新器件的波形已經(jīng)被寄生電容展寬成 斜三角波。初步懷疑布線質(zhì)量差勁,波形抖動,訪問大文件時時鐘抖動累加影響處理器時序,狀態(tài)機(jī)混亂。訪問小文件時任務(wù)小巧。數(shù)個時鐘偏差不足以引起單次讀寫任務(wù)執(zhí)行。眼圖
是德科技的這款示波器默認(rèn)沒開放眼圖功能,要使用眼圖也行,1萬RMB購買軟件擴(kuò)展功能lisence。我只能退而求其次使用它的 Mask(模板)功能 。這個功能原理和眼圖類似,下文我還是用眼圖來稱呼它。Mask功能缺少眼圖下移動標(biāo)桿測量的能力, 不能測量“眼鏡”開口大小,無法得知3dB位置,一拖動動屏幕任何參數(shù),Mask數(shù)據(jù)都會丟失。怎么讓處理器保持讀取數(shù)據(jù)內(nèi)容呢?讓處理器反復(fù)地在SD卡上拷貝1MB文件就行了,記得末尾清除文件系統(tǒng)緩存,防止linux在內(nèi)存里緩存SD卡文件。while [ 1 ]
do
cp /mnt/sd/1MB.img /mnt/sd/unuse.img
echo 3 > /proc/sys/vm/drop_caches # 清除緩存
done
每個眼圖都保持1min測試時長。老器件的波形實(shí)際上也是存在抖動的,好在抖動不劇烈,抖動位置規(guī)則的分布在5個密集區(qū)域。新器件的眼圖我需要說明一下,文章開頭描述“只要訪問SD卡500KB以上的數(shù)據(jù)無響應(yīng),不再有時鐘”。于是我對測試shell做了小修改,每次僅處理10KB的文件,接著讓總線休息一下,避免shell執(zhí)行太快SD控制器的來不及停止就繼續(xù)執(zhí)行。有了這個延時,所以新器件1min眼圖效果和老器件是不能直接對比的,初略看他的抖動會比老器件的強(qiáng)。- 老器件48MHz持續(xù)運(yùn)行1min,約產(chǎn)生2880M個時鐘。
- 新器件48MHz執(zhí)行10KB,停歇1秒循環(huán)1min,約產(chǎn)生600K個時鐘
- 所以1min里老器件工作量是新器件的4800倍=2880*10^6/600,約是老器件12.5ms=60s * 1000 / 4800的眼圖效果
while [ 1 ]
do
cp /mnt/sd/10KB.img /mnt/sd/unuse.img
sleep 1 # 等待,否則同樣會無響應(yīng)
echo 3 > /proc/sys/vm/drop_caches # 清除緩存
done