国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于VxWorks的消息控制軟件設(shè)計方法

2022-04-29 16:02:41楊帆
計算機應(yīng)用文摘 2022年13期
關(guān)鍵詞:句柄信號量調(diào)用

楊帆

關(guān)鍵詞 消息控制軟件 軟件架構(gòu)設(shè)計

VxWorks 操作系統(tǒng)以其高實時性和友好的用戶開發(fā)環(huán)境被廣泛應(yīng)用于各種消息控制軟件中[1] 。但是,在設(shè)計消息控制軟件時,經(jīng)常會出現(xiàn)各模塊之間互相調(diào)用復(fù)雜、軟件結(jié)構(gòu)設(shè)計過于隨意的情況。這會使軟件的可讀性、可靠性較差,并且造成了軟件在維護階段成本太大、無法快速復(fù)用、復(fù)用時具有隱患的問題。本文針對這類軟件,結(jié)合VxWorks 操作系統(tǒng)的互斥資源訪問和實時性的特點,分析了軟件設(shè)計中遇到的種種缺點和不足,提出了鏈路信息控制軟件的新的設(shè)計方法。

1設(shè)計消息控制軟件存在的問題

對于消息控制軟件來說,基本都應(yīng)該包含以下模塊:RS422 串口、RS232 串口、以太網(wǎng)口等硬件接口的收發(fā)模塊,以及消息編碼解碼模塊、鏈路消息監(jiān)控過濾模塊、鏈路消息分析的算法模塊、硬件自檢和配置文件讀取模塊等。這些模塊可以支撐一個比較基礎(chǔ)的消息控制功能的軟件。

在設(shè)計消息控制軟件時需要考慮模塊之間的通信和相互調(diào)用的問題[2] 。在傳統(tǒng)C 語言程序中,如果一個模塊的功能函數(shù)要使用其他模塊的函數(shù),最簡單的方式是直接調(diào)用。但是,這會使得模塊之間過分相互依賴,導(dǎo)致緊耦合,不利于軟件的模塊化設(shè)計。由于模塊間的相互調(diào)用,使得這些模塊無法復(fù)用到新的程序中,造成有新需求時需要對這些模塊進行重新開發(fā),無法做到在原來基礎(chǔ)上進行擴展。

在消息控制軟件中經(jīng)常會處理一些任務(wù),如在固定周期時間內(nèi)重復(fù)處理多次業(yè)務(wù);延遲n 秒后,若未收到回執(zhí)應(yīng)答,則周期時間內(nèi)處理重復(fù)n 次的業(yè)務(wù)模型。一方面,在VxWorks 操作系統(tǒng)中,我們可以使用看門狗或者全局信號量的方式來處理定時觸發(fā)的任務(wù)。但是,在看門狗中執(zhí)行的函數(shù)本質(zhì)是在中斷上進行執(zhí)行的,存在無法嵌套等約束條件,并且在部分硬件系統(tǒng)中無法完整支持。另一方面,利用全局信號量的方式則存在代碼不統(tǒng)一和可讀性差的問題,無法滿足高內(nèi)聚低耦合的設(shè)計需求。通常在一些成熟的面向?qū)ο笳Z言的框架中,會提供setTimer()、onTimer()相關(guān)接口,使用接口回調(diào)函數(shù)的方式去重復(fù)處理業(yè)務(wù)。VxWorks 操作系統(tǒng)一般使用C 語言進行開發(fā),支持延遲若干秒后周期處理業(yè)務(wù)的模塊[3] 。另外,還需要考慮線程之間通信使用全局變量的問題。盡管VxWorks 操作系統(tǒng)推薦了一些通信手段,但在一些C語言程序中經(jīng)常會出現(xiàn)沒有保護的全局變量直接進行線程通信的情況,十分不利于線程的安全,造成大量的隱患,本文設(shè)計了一個軟件模塊來定制全局變量的訪問改變。

2消息控制軟件設(shè)計

2.1消息控制軟件的模塊架構(gòu)

在以往的消息控制軟件中雖然也有鏈路監(jiān)控、消息編解碼、消息過濾等模塊,但是模塊和模塊之間是相互調(diào)用的。我們需要設(shè)計一個中介模塊來統(tǒng)一調(diào)度各個模塊的對外接口。此外,我們還需要在每個模塊中增加一個接口層,在分析每一個模塊對外有哪些接口后,將這些接口以句柄的方式統(tǒng)一起來,作為對外的接口層。

以消息過濾模塊為例,過濾模塊的接口層聲明的示意代碼如下:

消息過濾接口是在原來消息過濾的代碼中添加一個新的接口層。在消息過濾接口模塊的聲明中,首先需要聲明消息過濾模塊中函數(shù)的id———可以以宏定義的形式聲明,也可以用枚舉量的形式聲明。此外,還需要聲明一個send_msg_to_filter_function 的句柄,其作用是接收所有從中介模塊發(fā)過來的消息,并根據(jù)function_id 選擇過濾模塊中正確的執(zhí)行函數(shù)。將原有對外傳送消息的函數(shù)統(tǒng)一在send_msg_to_filter_function 句柄中,好處是可以不用過多暴露本模塊的接口,做到統(tǒng)一管理。另外,還需要將send_msg_to_filter_function 句柄放在中介模塊存儲中,具體存儲在中介模塊的句柄集合中,據(jù)此中介模塊的句柄集合包含了所有模塊的對外句柄,使得其他模塊調(diào)用消息過濾模塊時,都需要通過中介模塊。

在中介模塊中,需要聲明一個mediator _recv _handler_list 的數(shù)組。這是一個存放其他所有模塊接口句柄的集合。中介模塊還需要聲明一個關(guān)于包含相關(guān)模塊的枚舉量,其可以定義每一個模塊值。send_msg_to_function 是中介模塊對外的接口。當(dāng)一個模塊需要調(diào)用過濾模塊中的函數(shù)時,只需要調(diào)用中介模塊的send_msg_to_function 并填寫好Msg 結(jié)構(gòu)體。send_msg_to_function 函數(shù)檢查mediator_recv_handler_list是否存在過濾接口模塊接口層的句柄,如果存在,則調(diào)用消息過濾模塊接口層的句柄,否則返回調(diào)用失敗的錯誤值?;诖?,在其他模塊調(diào)用消息過濾模塊中的函數(shù)時,都需要通過中介模塊。調(diào)用模塊可以不關(guān)心過濾模塊是否有相關(guān)函數(shù)(如果沒有也不會編譯報錯),消息過濾模塊不需要關(guān)注是哪個模塊調(diào)用了自己。做到了模塊之間的松耦合,使得模塊之間獨立存在、自由組合。通過在消息過濾模塊中分出接口層,做到模塊內(nèi)部的高內(nèi)聚。

2.2定時器的封裝

封裝的定時器主要是由節(jié)拍器、訂閱器、訂閱者三個部分組成。節(jié)拍器根據(jù)CPU 指令周期,每秒鐘向訂閱器發(fā)送信號量。訂閱器收到信號量后,每秒循環(huán)遍歷訂閱器中定義的結(jié)構(gòu)體鏈表,檢查鏈表中注冊的訂閱者是否符合觸發(fā)條件。如果符合觸發(fā)條件,則開啟線程執(zhí)行訂閱者所注冊的update 事件,并在訂閱器結(jié)構(gòu)體鏈表中注銷訂閱者。訂閱者需要定義具體的update 事件,其指的是滿足具體條件后需要執(zhí)行的函數(shù)。訂閱者需要在訂閱器中注冊,注冊在訂閱器的鏈表內(nèi)。

訂閱者的結(jié)構(gòu)體中聲明了需要延遲多少秒觸發(fā),觸發(fā)幾次,周期為多少秒,并且包含一個函數(shù)指針update,指向需要觸發(fā)的事件函數(shù)。

2.3全局變量的使用

重構(gòu)老代碼時通常會遇到全局變量的使用問題。在無保護的情況下,頻繁在多線程任務(wù)下讀寫全局變量是存在隱患的。此時可以將全局變量的讀寫單獨放在一個.c 文件中,其中的每一個全局變量的讀取都要在保護之中。方法是在讀取全局變量時使用get(),讀取全局變量時使用set(),使用set 和get 函數(shù)時加互斥信號量。

VxWorks 操作系統(tǒng)提供了互斥信號量來解決任務(wù)之間存在的同步問題。使用互斥信號量可以在訪問修改全局變量時具有排他性,在初始化互斥信號量時,將屬性設(shè)置為SEM_Q_FIFO,據(jù)此訪問全局變量的請求就可以符合先來先得的順序。這可以避免線程之間調(diào)用時可能發(fā)生的問題。

3結(jié)束語

好的軟件是可維護的、可擴展的、可復(fù)用的,且靈活性強??删S護是指當(dāng)遇到新需求時,只需要更改需要更改的部分,改動量越小越好;可擴展性是指新增功能時,事先預(yù)留了接口,之前設(shè)計的接口是通用的;可復(fù)用是指一個新的模塊是可以一直使用的,不需要重新編制;靈活性是指模塊間可以任意調(diào)配使用,不需要打破原有軟件架構(gòu)去實現(xiàn)新的功能。但是,我們編制代碼時不一定完全符合以上特性,往往在開發(fā)階段為了快速開發(fā)新功能,不注意這些開發(fā)原則,為代碼的二次開發(fā)埋下了隱患。本文針對消息控制軟件,參考以前的代碼的一些編寫弊端,提出了一種軟件設(shè)計方法,以便重構(gòu)代碼和設(shè)計新代碼,充分滿足高內(nèi)聚低耦合的特性。

猜你喜歡
句柄信號量調(diào)用
基于STM32的mbedOS信號量調(diào)度機制剖析
核電項目物項調(diào)用管理的應(yīng)用研究
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
Nucleus PLUS操作系統(tǒng)信號量機制的研究與測試
高校圖書館持久標(biāo)識符應(yīng)用研究
編譯程序語法分析句柄問題分析與探討
基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
MFC應(yīng)用程序多線程混合顯示界面方法研究
μC/OS- -III對信號量的改進
Linux操作系統(tǒng)信號量機制的實時化改造
高邑县| 新河县| 滨州市| 涿鹿县| 清原| 长阳| 兴城市| 凉山| 郯城县| 河间市| 高安市| 炎陵县| 新津县| 镇坪县| 德令哈市| 新绛县| 宁安市| 东辽县| 中方县| 随州市| 南岸区| 济宁市| 汨罗市| 九江市| 诸暨市| 黄大仙区| 桃江县| 鸡东县| 修文县| 鄂托克前旗| 河北区| 诸城市| 太白县| 鸡东县| 凤山县| 西和县| 屯留县| 南皮县| 乌苏市| 岚皋县| 阳朔县|