又是被優先順序問題折騰了三天

2021-05-21 14:05:17 字數 1130 閱讀 4835

因為換用了一顆第三方前面板晶元,需要把第三方提供的驅動合到我們的系統裡。上週整合好驅動,前面板的四個8段顯示正常,按鍵有問題。

前面板排插5根pin分別是:data,clock,3.3v電壓,接地,ir。

驅動是這樣讀取鍵值的(somepanel_read()):先寫乙個命令字,然後讀乙個byte,判斷讀回byte的第6位,如果是1,認為是有按鍵按下,送出鍵值;如果是0,認為不是有效鍵值,返回0。

task的while(1)迴圈裡,呼叫somepanel_read()

讀取鍵值,如果是0,稍微sleep一會,再呼叫somepanel_read()

讀鍵值;如果不是0,處理處理,填好按鍵key結構,放到快取隊尾,再繼續讀。

很簡單的流程,出問題了。

前面板排插和jtag復用,無法單步除錯,只能用串列埠列印除錯。在while(1)裡

讀回鍵值後如果不是0,列印輸出該鍵值。

開電後,沒有按鍵按下,卻一直送出鍵值。

送出的鍵值第6位並不是1。是乙個無效鍵值。

按下某個按鍵後,能讀出乙個有效鍵值,然後又不停地送出另乙個無效鍵值。每乙個按鍵按下後都會送出乙個不一樣的無效鍵值。這些無效鍵值被放到的快取中,於是亂套。

諮詢第三方工程師,先建議我們調整somepanel_rdbyte()中拉高拉底data pin和clock pin中間的delay。增加和減少延時都沒有效果。

再諮詢,又建議我們把3.3v電壓改為5v。也是沒有效果。

量波形也沒有幫助,data pin上一直有波形,沒錯,迴圈裡一直很在讀。只不過第6位是0的無效鍵值應該不會被送出啊。但它們確實送出來了。我們都覺得很奇怪。

被這個問題困擾了兩天,無解。

終於,今天,在又一次又一次閱讀相關的驅動**後,找到問題所在,修改somepanel_read()

函式後,正常。

又是依賴運算子優先順序出了錯。

不知道為什麼正式發布的驅動程式裡居然會有這樣的問題。

其他方案裡用這顆晶元也會出問題,現象可能會是丟鍵值,按很多下按鍵都沒有反應,不按了突然又噌噌噌連續響應。

寫程式時還是不要太相信自己對優先順序的記憶,靠括號很靠譜。

優先順序問題

若有 int i 10,j 2 則執行完 i j 8 後 i 的值為28。請問這句話的說法是正確的嗎?正確 均為賦值運算子,賦值運算子的優先順序只比逗號運算子高,所以會先 之後再 一共有十五個優先順序 1 2 負號 取變數位址 type 強制型別 sizeof 3 4 5 6 7 8 9 10 11...

被C語言操作符優先順序坑了

今天有乙個列舉的題目的 是這樣的 重點在於maxxor這個函式的實現,列舉兩個數字,其中maxr儲存了最大值的 i 異或 j 可是這個程式執行結果大大出乎意外 然後就把 i 異或 j 的結果臨時儲存在int,進行比較,程式正確的執行了。原來是被操作符優先順序坑到了。位操作的優先順序比比較操作符的優先...

CSS優先順序問題

css 優先順序法則 a 選擇器都有乙個權值,權值越大越優先 b 當權值相等時,後出現的樣式表設定要優於先出現的樣式表設定 c 創作者的規則高於瀏覽者 即網頁編寫者設定的css 樣式的優先權高於瀏覽器所設定的樣式 d 繼承的css 樣式不如後來指定的css 樣式 e 在同一組屬性設定中標有 impo...