高效使用單片機放棄程序中延時(shí)函數
比如有很多個(gè)鍵盤(pán)、LED點(diǎn)陣、數碼管等,它們都需要實(shí)時(shí)響應,很容造成編程困難、響應遲鈍,其實(shí)只要把延時(shí)的時(shí)間回收,處理這些就非常從容了。
可能還有人會(huì )說(shuō),有些項目用不了這么苛刻的時(shí)間,你回收的時(shí)間用不了,要那么多干嘛?
其實(shí)這時(shí),你就可以用死循環(huán)掃描事件,可以實(shí)時(shí)響應。你的系統跟原來(lái)空循環(huán)延時(shí)比,實(shí)時(shí)性要高了不知多少倍。2、變異的協(xié)作式內核
先說(shuō)說(shuō)嵌入式操作系統的內核,簡(jiǎn)單的說(shuō),它就是個(gè)任務(wù)調度器,讓多個(gè)任務(wù)在同一個(gè)CPU上同時(shí)執行,所謂同時(shí)也是相對的,無(wú)非就第一個(gè)任務(wù)執行幾毫秒、第二個(gè)任務(wù)在執行幾毫秒。。。外表看起來(lái)就是同時(shí)執行。
至于可剝奪式內核和協(xié)作式內核的區別,大家可以百度一下。
說(shuō)道能在單片機上用的嵌入式操作系統,大家會(huì )說(shuō)出一些如uCosII、FreeOS等操作系統。
還有很多人對這些操作系統十分抗拒、十分反對,他們的理由是什么?
1、這些操作系統占用大量RAM、ROM
2、這些實(shí)時(shí)操作系統所謂的實(shí)時(shí)是相對非實(shí)時(shí)操作系統的,跟裸機比實(shí)際上是慢了
這些理由不是沒(méi)道理,因為這些商用操作系統都是可剝奪式內核,它們的原則是保證最高優(yōu)先級任務(wù)在可確定的時(shí)間內響應。
它們的有優(yōu)點(diǎn)是任務(wù)切換時(shí)間是確定的,不會(huì )隨任務(wù)的多少而改變。
有了這些確定性,讓它們在商用產(chǎn)品大放光彩。因為其時(shí)間穩定性。
但它們的缺點(diǎn)也很明顯,中斷級節拍浪費很多時(shí)間。任務(wù)間同時(shí)調用時(shí)引發(fā)同步問(wèn)題而引入許多如信號量、郵箱等機制浪費大量RAM、ROM。
綜上,可剝奪式內核穩定可定量,在越高級的單片機上越有優(yōu)勢,在8位機上可用,但需要大量裁剪,并不一定合適。
而協(xié)作式內核的核心思想是什么?它不像剝奪式內核保證最高級任務(wù)速度最快,而是保證所有任務(wù)的平均速度最快!
正如我前面的說(shuō)法,我連續兩個(gè)延時(shí)函數之間的代碼很難超過(guò)1ms,甚至很難超過(guò)100us,我們可以將其忽略。這樣10個(gè)任務(wù),第一個(gè)執行完主動(dòng)放棄單片機控制權,交給第二個(gè)任務(wù),第二個(gè)任務(wù)執行完主動(dòng)放棄控制權,交給第三個(gè)任務(wù)。10個(gè)任務(wù)之間無(wú)間隙,每一個(gè)任務(wù)需要延時(shí)時(shí),就主動(dòng)放棄控制權。
基于這種思想,我們的就達到了回收空轉延時(shí)的目的,而且應為每個(gè)任務(wù)是執行完后主動(dòng)放棄,所以不存在剝奪式內核的同步問(wèn)題,基本不需要郵箱、信號量等機制,對RAM、ROM的要求就非常低了。
這樣來(lái)看,協(xié)作式內核非常適合8位機。但可能有太多嵌入式系統的書(shū)中對剝奪式內核不分場(chǎng)合的認可,造成很多人誤解。而且uCos等系統的權威,也讓很多RTOS作者爭相效仿,沒(méi)用對8位機的場(chǎng)合做合理分析。
商用系統中沒(méi)有協(xié)作式內核,而民用的,還少有優(yōu)秀的協(xié)作式內核,都是基于傳統節拍。
傳統協(xié)作式內核需要定時(shí)中斷為時(shí)鐘基準,也會(huì )間歇性打斷任務(wù),造成不必要的損失,這并不是我們想要的。
我們其實(shí)可以?xún)H僅是讓定時(shí)器以大分頻系數開(kāi)著(zhù), 而不給其產(chǎn)生中斷的機會(huì )。當任務(wù)將要放棄使用權時(shí),讀取定時(shí)器,作為時(shí)鐘基準,然后清零。
做法一句兩句說(shuō)不清,而效果是什么?可以做到任務(wù)是以不受干擾,與裸機相同的工作狀態(tài),這是傳統協(xié)作式內核做不到的,而僅當它需要延時(shí)了,才放棄使用權,將延時(shí)的時(shí)間給其它任務(wù)。這正符合我全文的目的 -- 回收空轉延時(shí)時(shí)間,這樣的內核體積會(huì )非常小,運行方式與裸機無(wú)異,僅僅是把空轉延時(shí)時(shí)間干些其它事。對使用者還沒(méi)什么要求,不想以往系統那么復雜。
可惜市面上并沒(méi)有基于這種方式的內核,我已經(jīng)寫(xiě)了一個(gè),非常精簡(jiǎn),運行穩定。但作為一個(gè)想應用實(shí)際的內核,還需要檢驗。
評論