注冊機制與消息機制-嵌入式微系統連載之七
注冊機制在嵌入式編程中很少提到,但回調函數大家經(jīng)常接觸,以軟件定時(shí)器為例:
本文引用地址:http://dyxdggzs.com/article/262928.htm

軟件定時(shí)器設備通過(guò)函數Start把FunctionCallback作為參數傳入定時(shí)器設備中保存,之后開(kāi)啟定時(shí)器,延時(shí)1000ms之后,定時(shí)器就會(huì )直接調用FunctionCallback,所以這個(gè)FunctionCallback就叫做回調函數。類(lèi)似處理器的中斷一樣。
注冊機制類(lèi)似回調函數性質(zhì),只是把概念擴展到變量,上層應用通過(guò)注冊函數地址或者變量地址到設備中保存,當設備中這個(gè)地址對應的函數被激活或者變量值有改變,就調用這個(gè)函數或者更改這個(gè)變量值,以此達到底層對上層的信息傳遞。
以ADC設備為例,我們看一下注冊機制的應用。首先在ADC設備device_adc.c中定義一個(gè)用于注冊變量地址的指針數組RegisterPointerBlock,初始值必須要指向一個(gè)空變量,否則若指向了一些有用的地址而導致這個(gè)地址對應的數據改變,會(huì )引起不可預測問(wèn)題。

在設備中引入注冊機制,應用層只需要把變量的地址注冊到設備中,設備自己可以通過(guò)這個(gè)地址修改數據,這樣解放了應用層,讓?xiě)脤硬恍枰P(guān)心如何獲取數據。但是,注冊機制也存在一些缺陷,那就是操作的數據,必須要原子操作,否則會(huì )導致兩個(gè)應用層與設備同時(shí)修改一個(gè)數據的異常存在,出現數據錯誤,這個(gè)是需要避免的。
相對注冊機制,消息機制是大家所熟悉的一種底層向上層傳遞的方式,msOS采用uC/OS-II,標配為業(yè)務(wù)邏輯與菜單界面兩個(gè)任務(wù),業(yè)務(wù)邏輯為高優(yōu)先級,支持消息隊列,設備發(fā)送的消息,都在業(yè)務(wù)邏輯中處理。

需要注意的是,msOS是采用的是uC/OS-II,它屬于RTOS,業(yè)務(wù)邏輯與菜單界面雖然是兩個(gè)獨立的任務(wù),但并不是同時(shí)運行的,一個(gè)時(shí)刻只能運行一個(gè)任務(wù),業(yè)務(wù)邏輯的任務(wù)優(yōu)先級高于菜單界面,所以在沒(méi)有消息的時(shí)候,業(yè)務(wù)邏輯任務(wù)(LogicTask)在PendMessageQueue函數中掛起等待消息到來(lái),這個(gè)時(shí)候退到菜單界面任務(wù)(MenuTask)執行,一旦按鍵設備檢測到按鍵并通過(guò)PostMessageToLogicTask發(fā)送消息,就會(huì )激活業(yè)務(wù)邏輯任務(wù),讓業(yè)務(wù)邏輯任務(wù)搶占菜單界面任務(wù)運行。按鍵設備的運行是基于系統節拍的,它是在中斷中運行,優(yōu)先級比任務(wù)高,不會(huì )被任務(wù)搶占。
評論