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