天天看點

[轉]QNX驅動開發-Resource manger framework

聲明:本文隻用于個人學習交流,若不慎造成侵權,請及時聯系我,立即予以改正

如果你認為本系列文章對你有所幫助,請大家有錢的捧個錢場,點選此處贊助,贊助額0.1元起步,多少随意

鋒影

email:[email protected]

在QNX下開發驅動程式,最主要的工作除了了解底層硬體具體工作流程外,就是建立一個能與作業系統相容且支援POSIX的Resource manger架構了。在任何一段程式的執行過程中一段都是從main函數開始的,然而在作業系統中的main函數還傳遞了兩個參數:int argc, char **argv,這兩個參數是用來傳遞從shell指令行或者buildfile中傳來對Resource manger具體參數的,使用options (int argc, char **argv);函數實作,是以這個函數在main函數中最開始的位置,可以開發的driver具有不同可選的特性,提供使用的便利性。

        第一步:書寫options (int argc, char **argv);的具體實作;

        第二步:建立一個上下文切換句柄dpp = dispatch_create ();這個東東主要用在mainloop中産生一個block特性,可以讓我們等待接受消息;

        第三步:iofunc初始化。這一步是将自己實作的函數與POSIX層函數進行接口,解析從read、write、devctl等函數傳來的消息進行解析,以實作底層與應用層函數之間的互動,通過io_funcs.read = io_read,io_funcs.write = io_write,進行函數重載;

        第四步:注冊裝置名,使裝置在命名空間中産生相應的名稱,這一點是整個過程的關鍵了,形如  pathID = resmgr_attach (dpp, &rattr, "/dev/Null",_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &ioattr),這樣不僅注冊了一個裝置名,還讓系統知道了我們實習的IO函數對應關系;

        第五步:為之前建立的上下文句柄配置設定空間,例如ctp = dispatch_context_alloc (dpp);為了第六步使用;

        第六步:通過不斷循環等待dispatch_block()來調用MsgReceive()使Resource manger處于receive block狀态,以接收上層發送來的消息,通過dispatch_handler (ctp)去調用我們自己定義的IO函數。

        這樣一個single thread裝置驅動dev/Null就建立好了,是不是很簡單。

繼續閱讀