關于開發(fā)中如何防止死等程序導致其它任務運行不了方法
在嵌入式軟件開發(fā)中,比如單片機的程序,我們一定會寫到一個大的死循環(huán)的程序,也就是輪詢IO口,通常用
while(1)
{
}
來實現(xiàn)大循環(huán),程序就會在while(1)中不斷的循環(huán)執(zhí)行一些任務,但是,任務與任務之間如果存在延時,就會大大的削弱整個架構的實時性,雖然現(xiàn)在的高級單片機ARM已經具有了多線程的機制,但是避免不了的依然是要寫死循環(huán),也就是說,表面上看到程序是一起在跑的,其實是把時間切成若干份,然后進行調度,在linux內核中,fork一條進程需要調度,do_thread也需要進行調度。
最近在工作上遇到一個這樣的問題,串口協(xié)議要求比如等到IO口為低電平,數(shù)據(jù)才能發(fā)送。關于這個問題,沒別的方法,按照那個架構來說只能死等while(等到IO口低電平輸出),但是這樣就會遇到一個問題,如果一直死等,萬一IO沒有低電平輸出,那么就會發(fā)生丟包的可能以及其他任務會被直接影響到運行,畢竟單片機一般采用的架構都是順序執(zhí)行的,但是看到有工程師做這樣的處理,我也就學過來了,讓while做超時處理,一旦在一定的時間內等待不到低電平輸出,那么就讓這個循環(huán)退出,這樣就不會影響到其它任務的執(zhí)行了,也降低了丟包了,但還是會有丟包,只能慢慢調試了,要是有高手看到麻煩教我一下,最近我們公司也是因為這個問題卡了很久,表示傷不起,我們來看一下是怎么實現(xiàn)的。
編輯:admin 最后修改時間:2018-05-18