Saturday, February 02, 2008

BUGS

曾經解過的bugs
==============
做東西 最好有理論背景在背後支持
不要想要嘗試碰運氣 運氣好糊理糊塗就做出來, 做不出來的時候, 加班加到天亮也不會做出來的
運氣在做計畫的時候, 是用不到的
做計畫或是解bug, 需要的是背後的理論支持
=======================================

freopen的陷井
fp=fopen(filename0, mode)
fp=freopen(filename, mode, fp)
通常freopen使用時機, 通常是fopen之後
但如果fopen失敗回傳NULL的話
丟到freopen, 就會出現 segmentation fault

Linux Message Queue problem
最近想要嘗試在板子上實現Message Queue, 想當然爾, 先在x86的PC上實現看看, 經過一天的coding跟testing後, 覺得一切都沒問題了, 再port到板子上
不過問題就在板子上發生了, Message可以送出來(ipcs可以看到有一筆message存在), 不過另外一端卻只能收一次, 之後的message就收不下來了
經過大約一個星期的明察暗訪, 終於在msgrcv的man找到解答, 原來我的參數下錯了, 導致第1次呼叫msgrcv之後, 蓋到之後的local variables
重點是, 為什麼在PC端, 可以work的這麼順?

mktime() problem
有個功能是要找出某個月份的帳號, solution就是利用struct tm, 找到該月份第0天, 及下個月份的第0天, 再透過mktime(struct tm *), 得到以秒為單位的時間
問題就在經過mktime之後, input會被修改, 以這個例子而言, 因為不會有某月0號, 所以mktime會自動詮譯為上個月最後一號, 例如6月0號, 會變成5月31號, 最後6/0~7/0, 會變成5/31到6/30

-bootloader for AG300E -> unresolved

ag300e加大buffer後, webui會進不去
Symptom,
printer的buffer加大之後, webui會找不到網頁, 用ice去看, 發現webd的資料結構蓋到, 一整個無言, 想不到這麼簡單的東西, 還會有蓋code的情形發生, 幾度以為是keilc在亂搞
Solution,
最後發現是定義buffer大小的宣告問題, 有其他變數參考這個設定, 初始化另外一塊buffer, 結果兩邊不一樣大, 造成清掉之後的記憶體內容.

ag300e monthly account會印不完
symptom,
connection的window size愈來愈小, 最後會有大的packet(1400 bytes)產生, 之後printer會一直印這大的packet, 整個系統就卡在printing, 最後造成tcp connection沒有維護, 而被dut強制斷線。
solution,
基本上, 有2個重點, network flow control, 與printing時, 也要能有空維護network connection. 第1個, network的速度很快, 遠快過printer的列印速度, 所以必須有機制叫對方慢點再送, 第2個, 之前列印時, 收到packet之後, 就一直印到完, 現在採用印一行就出來, serve其他task, 如webd或ag connection等。
綜合這2點, 所以有一個queue, 介於network connection與printing之間, 當有packet進來,會丟到這個queue, 之後知會printing來收, 順便清queue。如果queue滿了, connection hander就會直接回busy給dut, 一直等到queue有空間可以繼續塞packet。

ag300e ps/2 handler有問題
symptom:
1) ps/2 isr收到的內容有問題,似乎有掉bit或byte,造成收到的內容很奇怪
2) 但在cpu timing是150MHz的時候沒有問題, 但改成100MHz後, 會有問題
solution,
最後發現是ps/2 isr的depth buffer只有1個byte,上層ps/2 handler來不及取出內容,原來的內容就被新的bit蓋掉,
比如, ps/2的freq.是10~16KHz/1bit, 也就是一個byte,需要送10個bit,相當於1.0KHz/1byte,換句話說就是送1byte,需要1msec,如果上層 ps/2 handler來不及在1ms取出這個byte, 那就很有可能會被之後的interrupt蓋掉, 造成問題
在linux有2種做法, flip-flop跟circle-buffer
也就是在isr有一個比較大的depth buffer, 存放暫時的資料, 等上層來拿資料, 而這個depth buffer size如何定, 根據上面的解釋, 大致上可以知道要挖多大才足夠。

-ag on linux 在traffic重的時候, 會印不出來, 起初以為是kernel或底層busy導致, 最後發現是加解密的問題 -> resolved

Nucleus AG task enhancement造成資料重覆送的問題
Symptom,

-account 會定期備份, 為了確保資料正確性, 直覺的做法, 每一筆account, 固定時間(比如1min)就寫回flash, 但缺點就是會耗時, 甚至拖慢整個系統效能, 另一種做法, account只會改變狀態時才做備份, 同時為了保持資料正確性(比如時間), 改成備份系統存活時間, 也就是每隔一段時間(比如1min), 把系統存活時間寫回flash, 當下次開機時, 檢查最新一筆系統存活時間