當(dāng)前位置:
首頁 >
前后台系统的精髓
發(fā)布時間:2024/4/18
49
豆豆
有個產(chǎn)品負(fù)責(zé)把RS485上的通訊轉(zhuǎn)到電力線(PLC)上。這樣這個產(chǎn)品主要由兩個任務(wù)組成:PLC通訊及485通訊。
第一個工程師在裸機(jī)上實現(xiàn)了功能!因為當(dāng)時項目忙,沒空檢查其程序。(唉,現(xiàn)在想起來,公司對軟件項目沒有一套成熟的管理制度,導(dǎo)致那時項目管理非常吃力!)
因為公司待遇低,第一個工程師走了。項目轉(zhuǎn)給第二個工程師時,工程師報告說兩個通訊老有沖突:忙485時,忙不了PLC。 一檢查:原來程序里幾乎都是在main函數(shù)里用分時實現(xiàn)了兩個通訊,還有一大堆的delay調(diào)用。于是給第二個工程師指示:這樣不行的,通訊應(yīng)該盡量使用中斷來收發(fā)最低層的數(shù)據(jù)!
于是第二個工程師開始改程序。完了報告說:不錯,有進(jìn)步了!
因為公司待遇不理想,第二個工程師很快也走了 (公司把開發(fā)工程師的薪水跟生產(chǎn)線工程師來比--你們研發(fā)部工程師的薪水是我們公司所有工程師里最高的!)。項目轉(zhuǎn)給了第三個工程師時,工程師報告說有時485發(fā)送的數(shù)據(jù)PLC還是不理會!一檢查:原來第二個工程師優(yōu)化程序時竟然把所有的PLC的接收代碼放進(jìn)了PLC的接收中斷程序,把所有的485接收代碼放進(jìn)了RXD中斷程序。于是給第三個工程師指示:緊急的事務(wù)一定要用中斷處理;中斷只處理緊急事務(wù)!
其實,這是前后臺系統(tǒng)最典型的應(yīng)用(也是任何一個系統(tǒng)必需要注意的):緊急的事務(wù)一定要放到前臺(前后臺系統(tǒng)里稱中斷程序是前臺:可實時處理的),讓所有不緊急的事務(wù)放到后臺處理(前后臺系統(tǒng)里稱主程序里的死循環(huán)為后臺:在后面處理不緊急事務(wù)的)。這樣,上面的程序就是這樣了:
主程序:系統(tǒng)初始化-》使能485發(fā)送及接收中斷-》使能PLC發(fā)送及接收中斷-》主程序的死循環(huán)。
死循環(huán)內(nèi)容:
1.如果485接收完成一個數(shù)據(jù)包:處理它,處理完后可能會開啟一個數(shù)據(jù)包的發(fā)送,開啟發(fā)送中斷,讓發(fā)送在前臺進(jìn)行;
2.如果PLC接收完成一個數(shù)據(jù)包:處理它,處理完后可能會開啟一個數(shù)據(jù)的包的發(fā)送,開啟發(fā)送中斷,讓發(fā)送在前臺進(jìn)行;
485接收中斷:把串口接收里的一個字節(jié)讀入到內(nèi)存(也可能是幾個字節(jié),這要看MCU的支持); 如果這是一個包的最后一個字節(jié),用全局變量/信號量的方法通知后臺主程序去處理;
485發(fā)送中斷:把下一個字節(jié)裝入串口發(fā)送寄存器里(也可能是幾個字節(jié),這要看MCU的支持);如果這是一個包的最后一個字節(jié),關(guān)掉自己的(中斷),以免下次再進(jìn)入。
PLC接收中斷:把IO里一個bit的數(shù)據(jù)讀入到內(nèi)存;如果這是一個包的最后一個位,用全局變量/信號量的方法通知后臺主程序去處理;
PLC發(fā)送中斷:把下一個位從IO口送出;如果這是一個包的最后一個字節(jié),關(guān)掉自己的(中斷),以免下次再進(jìn)入。
這樣,最緊急的收發(fā)位/字節(jié)都是在前臺中斷完成;對整個包的處理都在后臺主程序完成。沒有delay,沒有干擾,兩個通訊完美地融合在一起!
緊急的事務(wù)一定要用中斷處理!中斷只處理緊急事務(wù)!
第一個工程師在裸機(jī)上實現(xiàn)了功能!因為當(dāng)時項目忙,沒空檢查其程序。(唉,現(xiàn)在想起來,公司對軟件項目沒有一套成熟的管理制度,導(dǎo)致那時項目管理非常吃力!)
因為公司待遇低,第一個工程師走了。項目轉(zhuǎn)給第二個工程師時,工程師報告說兩個通訊老有沖突:忙485時,忙不了PLC。 一檢查:原來程序里幾乎都是在main函數(shù)里用分時實現(xiàn)了兩個通訊,還有一大堆的delay調(diào)用。于是給第二個工程師指示:這樣不行的,通訊應(yīng)該盡量使用中斷來收發(fā)最低層的數(shù)據(jù)!
于是第二個工程師開始改程序。完了報告說:不錯,有進(jìn)步了!
因為公司待遇不理想,第二個工程師很快也走了 (公司把開發(fā)工程師的薪水跟生產(chǎn)線工程師來比--你們研發(fā)部工程師的薪水是我們公司所有工程師里最高的!)。項目轉(zhuǎn)給了第三個工程師時,工程師報告說有時485發(fā)送的數(shù)據(jù)PLC還是不理會!一檢查:原來第二個工程師優(yōu)化程序時竟然把所有的PLC的接收代碼放進(jìn)了PLC的接收中斷程序,把所有的485接收代碼放進(jìn)了RXD中斷程序。于是給第三個工程師指示:緊急的事務(wù)一定要用中斷處理;中斷只處理緊急事務(wù)!
其實,這是前后臺系統(tǒng)最典型的應(yīng)用(也是任何一個系統(tǒng)必需要注意的):緊急的事務(wù)一定要放到前臺(前后臺系統(tǒng)里稱中斷程序是前臺:可實時處理的),讓所有不緊急的事務(wù)放到后臺處理(前后臺系統(tǒng)里稱主程序里的死循環(huán)為后臺:在后面處理不緊急事務(wù)的)。這樣,上面的程序就是這樣了:
主程序:系統(tǒng)初始化-》使能485發(fā)送及接收中斷-》使能PLC發(fā)送及接收中斷-》主程序的死循環(huán)。
死循環(huán)內(nèi)容:
1.如果485接收完成一個數(shù)據(jù)包:處理它,處理完后可能會開啟一個數(shù)據(jù)包的發(fā)送,開啟發(fā)送中斷,讓發(fā)送在前臺進(jìn)行;
2.如果PLC接收完成一個數(shù)據(jù)包:處理它,處理完后可能會開啟一個數(shù)據(jù)的包的發(fā)送,開啟發(fā)送中斷,讓發(fā)送在前臺進(jìn)行;
485接收中斷:把串口接收里的一個字節(jié)讀入到內(nèi)存(也可能是幾個字節(jié),這要看MCU的支持); 如果這是一個包的最后一個字節(jié),用全局變量/信號量的方法通知后臺主程序去處理;
485發(fā)送中斷:把下一個字節(jié)裝入串口發(fā)送寄存器里(也可能是幾個字節(jié),這要看MCU的支持);如果這是一個包的最后一個字節(jié),關(guān)掉自己的(中斷),以免下次再進(jìn)入。
PLC接收中斷:把IO里一個bit的數(shù)據(jù)讀入到內(nèi)存;如果這是一個包的最后一個位,用全局變量/信號量的方法通知后臺主程序去處理;
PLC發(fā)送中斷:把下一個位從IO口送出;如果這是一個包的最后一個字節(jié),關(guān)掉自己的(中斷),以免下次再進(jìn)入。
這樣,最緊急的收發(fā)位/字節(jié)都是在前臺中斷完成;對整個包的處理都在后臺主程序完成。沒有delay,沒有干擾,兩個通訊完美地融合在一起!
緊急的事務(wù)一定要用中斷處理!中斷只處理緊急事務(wù)!
總結(jié)
- 上一篇: 如何成为一个Linux内核开发者
- 下一篇: DOS系统功能调用表(INT 21H)