天天看點

項目問題總結

1. read函數讀序列槽的過程中,如果有線程切換而且恰好是發生在read的過程中,read讀的動作暫停。當線程切換回來後,造成讀逾時。

答:在一次資料發,收之前将線程優先級用nice(-20)升高,禁止線程切換。 請求,接受完成之後再用nice(20)将優先級還原。

在Linux中,程序運作的優先級分為-20~19等40個級别,其中,數值越小運作優先級越高,數值越大運作優先級越低。

2.丢包率非常高,發現是write函數還沒有寫完,就将io拉低。 解決方法

答:write後加上如下代碼。

do {

ioctl(fd, TIOCSERGETLSR, &status);

} while( !status & TIOCSER_TEMT );

等待發送緩沖區為空時再往下執行。

3.全雙工改為單工後收到的資料總是有自己的資料

答:将讀到的資料跳過第一個資料包。第二個即為自己的資料。

4.機率性挂機後又來一個未接電話

答:程式中用strcmp函數比較兩個數組中的電話号碼,數組長度為8個位元組,電話号碼占兩個位元組,其他都用0xff填充,是以比較長度超出了數組之外。

出現機率性又來未接來電。

5.debugstation下發一串基站的重新開機指令,結果隻有傳輸接口重新開機了。其他基站沒有重新開機。

答:重新開機指令的機制是,傳輸接口收到指令後轉發給其他基站,然後sleep(1) 一秒保證指令已經被發出去, 然後自己再重新開機。

但sleep(1) 導緻了整個線程的挂起。指令反而沒有發出去。 解決辦法是置一個重新開機标志,在polltask中輪詢這個标志,如果檢測到則在polltask線程中sleep,然後重新開機。

繼續閱讀