UCOSII硬件抽象層驅(qū)動(dòng)框架設(shè)計(jì)_第1頁
UCOSII硬件抽象層驅(qū)動(dòng)框架設(shè)計(jì)_第2頁
UCOSII硬件抽象層驅(qū)動(dòng)框架設(shè)計(jì)_第3頁
UCOSII硬件抽象層驅(qū)動(dòng)框架設(shè)計(jì)_第4頁
UCOSII硬件抽象層驅(qū)動(dòng)框架設(shè)計(jì)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、這是我?guī)臀彝瑢W(xué)整理的畢業(yè)論文的材料。內(nèi)容就是我所寫的UC/OS-II的硬件抽象層。大家可以當(dāng)做代碼導(dǎo)讀來使用。因?yàn)檎疹櫟轿彝瑢W(xué)對(duì)底層硬件不感興趣和時(shí)間的關(guān)系所以只介始上層的實(shí)現(xiàn)思想。墨魚2008.06.15二.uC/0S-II下通用驅(qū)動(dòng)框架的基本模型為了給上層應(yīng)用提供統(tǒng)一、一致的系統(tǒng)設(shè)備調(diào)用接口,需耍對(duì)上層應(yīng)用程序?qū)ο到y(tǒng)設(shè)備的訪問操作進(jìn)行抽象,任這方面,Unix系統(tǒng)和Linux系統(tǒng)做得比較成功。本文借鑒了Unix及Linux系統(tǒng)的成功經(jīng)驗(yàn),同時(shí)考慮到朕入式操作系統(tǒng)的特殊性,為UC/0S-II建立了如圖1所示的通用驅(qū)動(dòng)框架模型。在圖1所示的通用驅(qū)動(dòng)框架模型中,共包括三個(gè)層次:層訪問抽象接口層:一

2、般的抽象層設(shè)計(jì)會(huì)宜接在這一層提供5個(gè)訪問接口API:DeviceOpenDevGetchDevPutchDevControLDeviceClose,分別用丁打開設(shè)備、讀設(shè)備、寫設(shè)備、設(shè)備控制和關(guān)閉設(shè)備。而在這個(gè)設(shè)計(jì)里而更改了這種定義模式提供兩個(gè)公用的接口DeviceOpen和DeviceClose,同時(shí)為不同的外設(shè)分別提供特定的抽象接口,在移植的時(shí)候利用這些抽象接口的不變性保證應(yīng)用程序的可移植能力。這樣做的優(yōu)點(diǎn)更適合于有單片機(jī)開發(fā)經(jīng)驗(yàn)的工程人員直接調(diào)用。例如UART提供的抽象接口有:v_MiniPrintf最小格式化字符串函數(shù);UARTSet串口參數(shù)設(shè)置。暫時(shí)沒實(shí)再忘式化字符輸入。IIC提供的

3、抽象接口有:I2CMasterSendIIC主模式發(fā)送;I2CMasterReceiveIIC主模式接收;I2CSlaverReceiveIIC從模式接收。其它的還有SPI,外部中斷管理。在里只簡單介紹下UART和IIC。上層應(yīng)用程序通用驅(qū)動(dòng)框架uC/0S-II硬件設(shè)備1驅(qū)動(dòng)模塊硬件設(shè)備2驅(qū)動(dòng)模塊硬件設(shè)備N驅(qū)動(dòng)模塊硬件設(shè)備N(圖1通用驅(qū)動(dòng)框架模型)(2)設(shè)備管理核心數(shù)據(jù)結(jié)構(gòu)層:這是通用驅(qū)動(dòng)框架的核心,主耍用每個(gè)設(shè)備分配一個(gè)設(shè)備控制塊,通過鏈表形式進(jìn)行管理,該鏈表定義為設(shè)備控制塊鏈表DEV_CONTROL_BLOCK*HvlConList。在這一層,為系統(tǒng)中的每個(gè)硬件設(shè)備分配唯一的設(shè)備ID,上層

4、應(yīng)用程序通過將設(shè)備ID作為參數(shù)傳遞給DeviceOpen函數(shù)實(shí)現(xiàn)對(duì)相應(yīng)設(shè)備的核心管理數(shù)據(jù)結(jié)構(gòu)的定位搜索,通過搜索,DeviceOpen函數(shù)找到相應(yīng)設(shè)備控制塊,申請(qǐng)?jiān)O(shè)備的使用權(quán)限,獲得相應(yīng)硬件設(shè)備的操作句柄,該句柄指向具體的外設(shè)底層操作函數(shù)列表,返回該設(shè)備句柄;再通過上層抽象接口層提供的接口函數(shù)對(duì)設(shè)備進(jìn)行訪問。(3)硬件設(shè)備驅(qū)動(dòng)模塊層:這一層是硬件設(shè)備驅(qū)動(dòng)模塊功能的實(shí)現(xiàn)層,對(duì)各個(gè)硬件設(shè)備的驅(qū)動(dòng)在相應(yīng)的硬件設(shè)備驅(qū)動(dòng)模塊中完成。各個(gè)硬件設(shè)備驅(qū)動(dòng)模塊,原則上需耍實(shí)現(xiàn)如下兒個(gè)函數(shù):DevGetch、DevPutch、DevControl,分別完成相應(yīng)設(shè)備的讀、寫、控制,當(dāng)然,可以根據(jù)具體設(shè)備的特性,只實(shí)

5、現(xiàn)3個(gè)驅(qū)動(dòng)函數(shù)的其中一部分,例如,如果某設(shè)備不支持寫操作,那么就不用實(shí)現(xiàn)DevPutch函數(shù)。下而,對(duì)該模型的工作原理進(jìn)行簡單描述:首先,在上層應(yīng)用程序可以訪問硬件設(shè)備之前,需耍首先打開欲操作的設(shè)備,這可以通過調(diào)用“上層抽象接口層”的DeviceOpen函數(shù)實(shí)現(xiàn)。上層應(yīng)用程序?qū)⒂蜷_的設(shè)備的設(shè)備ID傳遞給DeviceOpen函數(shù),DeviceOpen函數(shù)通過該設(shè)備ID從設(shè)備控制塊鏈表中得具體的設(shè)備控制塊,進(jìn)而得到相應(yīng)設(shè)備的操作句柄,并返該句柄。得到該句柄后就可以調(diào)用上層提供的抽象接口(設(shè)備句柄為所有抽象接口的參數(shù)之一)完成特定的設(shè)備操作。完成設(shè)備的操作后仍然使用該句柄關(guān)閉設(shè)備,從而釋放設(shè)備資源

6、,交由其它任務(wù)操作?,F(xiàn)在以UART的v_MiniPrintf為例實(shí)現(xiàn)代碼如下:DEV_FUN*DeviceO=NULL:定義一個(gè)設(shè)備句柄uintSData=100;打開串口設(shè)備,設(shè)備打開后串口默認(rèn)設(shè)置為9600,8位模式,1位停止位,無奇偶較驗(yàn)DeviceO=DeviceOpen(UARTO_ID,&err);調(diào)用格式化字符輸出,向UARTO輸出經(jīng)格式化后的字符串v_MiniPrintf(DeviceO,uartOoutput:%sn,Data);如上所示調(diào)用設(shè)備成功打)FUARTO后打傳遞給v_MiniPrintf函數(shù)的第一個(gè)參數(shù)為調(diào)用DeviceOpen返回的句柄,該句柄I勺定義形式如下:

7、typedefstruetdevice_functionDEV_FUN;structdevice_function從設(shè)備操作列表中繼承三個(gè)設(shè)備函數(shù)INT8U(*DevPutch)(INT8U*str,INT16Ulength);設(shè)備字節(jié)寫函數(shù)INT8U(*DevGetch)(INT8U*str,INT16Ulength);設(shè)備字節(jié)讀函數(shù)INT8U(*DevControl)(void*param);設(shè)備控制函數(shù)v_MiniPrintf函數(shù)對(duì)字符串進(jìn)行格式化處理后使用該句柄成員函DevPutch輸出字符串到具體的外設(shè)接口上。v_MiniPrintf代碼如下:函數(shù)名稱:v_MiniPrintf函數(shù)功

8、能:最小格式化輸出函數(shù)輸入:Dev由調(diào)用FDevOpen函數(shù)時(shí)返回來的設(shè)備文件其于參數(shù)列表和printif函數(shù)一樣,只支持10,16進(jìn)制,字符,字符串這四種格式化輸出輸出:void作者:中中中孕中孕中孕中中中中孕中孕中空中中中中中中中中孕中孕中中中中中中空中孕中中中中中中中中孕中孕中中中來中中中/voidv_MmiPrintf(DEV_FUN*Dev,char*fint,.)vaistap,int8strval,int8nval,char*p,char*PointChar,staticint8i,if(Dev=NULL)return,va_start(ap,frnt),for(p=frnt,*

9、p,p+)if(*p!=%*)Dev-DevPutch(uint8*)p,1),continue,PPswitch(*p)cased1:nval=va_aig(ap,int),1=0,dostivali=nval%10,nval/=10,1+,vzhile(nval0),break,casex1:nval=va_arg(ap,int),1=0,dostivali=nval%16,nval/=16,1+;vzhile(nval0),break,casec1:i=-l,nval=vaargCapjnt),Dev-DevPutch(uint8*)&nval,1),break,case,s,:i=-l

10、;PointChar=(char*)va_arg(ap,int),nval=*PointChar,while(nval)nval=*PointChar,if(nval!=O)Dev-DevPutch(PointChar,1),PointChaiH-4-,break,default:break,for(,1=0,i-)nval=stivali+4&Dev-DevPutch(uintS*)&nva1,1),va_end(ap),3.2設(shè)備管理核心數(shù)據(jù)結(jié)構(gòu),設(shè)備控制塊的設(shè)計(jì)實(shí)現(xiàn)如上文所述:通用驅(qū)動(dòng)框架以“設(shè)備控制塊數(shù)據(jù)鏈表”為核心,它在模型中起著承上啟下的作用。設(shè)備管理核心數(shù)據(jù)結(jié)構(gòu)包括兩個(gè)結(jié)構(gòu):設(shè)備

11、控制塊和設(shè)備操作函函數(shù)列表。1、定義設(shè)備控制塊屬性:詳細(xì)定義請(qǐng)查看源碼HALh、HAL.c:HALh中定義如下:#ifhdef_HAL_H_#define_HAL_H_#includeconfig.h11/編譯參數(shù)是否允許卸載設(shè)備,目前還沒測試過該功能所以不編譯#defineEN_DEV_UNINSTALL0用定義所有設(shè)備的設(shè)備ID,typedefenumEMPTYJD=0,UARTOJD,UART1JD,I2C0_ID,I2C1_ID,SPI0_ID,SPI1_ID,MAX_DEV_MUN編譯參數(shù)允許創(chuàng)建設(shè)備數(shù)DEV_ID.typedefenumBASIC_SEM,MUTEX_SEM,ERR

12、_SEMSEM_TYPE;typedefstructdevice_contiol_blockDEV_CONTROL_BLOCK,typedefstructdevice_operations_listDEVOPERATIONS,structdevice_operations_list設(shè)備控制列表INT8U(*DevPutch)(INT8U*strJNT16Ulength),設(shè)備字節(jié)寫函數(shù)INT8U(*DevGetch)(INT8U*sti;INT16Ulength),設(shè)備字節(jié)讀函數(shù)INT8U(*DevContiol)(void*param),/設(shè)備控制函數(shù)/設(shè)備安裝與設(shè)備控制函數(shù)的差別在r設(shè)備安

13、裝要傳遞向最相關(guān)信息OS_EVENT*(*DevInstall)(void*param,INT8U*err),INT8U(*DevUnmstall)(void);設(shè)備拆除DEV_CONTROL_BLOCK*parent,typedefstmctdevice_functionDEV_FUN,stnictdevice_function從設(shè)備操作列表中繼承三個(gè)設(shè)備函數(shù)_INT8U(*DevPutch)(INT8U*str,INT16Ulength),設(shè)備字節(jié)寫函數(shù)INT8U(*DevGetch)(INT8U*sti;INT16Ulength);設(shè)備字節(jié)讀函數(shù)INT8U(*DevContiol)(vo

14、id*param),設(shè)備控制函數(shù),typedefstmctdevice_intemjpt_regDEV_INTERRUPT_REG,stiuctdevice_inteiTupt_reg設(shè)備向鼠中斷寄存器地址列表volatileunsignedlong*VicVectCnt,volatileunsignedlong*VicVectAddr,stmctdevice_contiol_blockDEVIDdeviceid,INT8Udevice_type,SEM_TYPEsem_type,INT8Uwait_out_time,設(shè)備控制塊設(shè)備ID設(shè)備類型保留用丁設(shè)備互斥的信號(hào)類型打開設(shè)備等待超時(shí)時(shí)間設(shè)備

15、共享卜一個(gè)設(shè)備控制塊指針設(shè)備操作句柄#if(EN_DEV_UNINSTALL=1)VIC_REGISTER_GROUPvic_param,#endifOS_EVENT*devjile,DEV_CONTROL_BLOCK*next_block,DEV_OPERATIONS*dev_op_handle,;uintSTargeDeviceInit(void),typedefenumHVLNOERR=0,HVLNOCONTROLBLOCK=1,HVLINSTALLFAIL=2,HVL_CONTROL_LIST_FULL=3,設(shè)備一一一HVLNOFINDDEV=4,HVLWMTDEVTIMEOUT=5,

16、HVLCLOSEDEVFAIL=6,HVLUNINSTALLFAIL=7,HVL_PARAM_ERR=8HVL_ERR_CODE,硬件抽彖層錯(cuò)謀類型沒有錯(cuò)誤/沒有設(shè)備控制塊可用設(shè)備安裝失敗有效控制塊鏈表空,即找不到任何已安裝的沒有找有指定設(shè)設(shè)備打開設(shè)備超時(shí)關(guān)閉設(shè)備失敗uint8DeviceClose(DEV_FUN*dev),DEVFUN*DeviceOpen(DEV_IDdev_id,HVL_ERR_CODE*err),uint8CreatDevic(DEV_IDdev_id,void*creatparam,DEV_OPERATIONS*creatjist),uintSDeviceUnins

17、Ull(pEV_HJN*dev),#endif其中設(shè)備控制塊屬性包括:設(shè)備識(shí)別ID(標(biāo)志人設(shè)備類型、設(shè)備是否可用(所有設(shè)備假定唯一性即所有設(shè)備都不允許在同一時(shí)刻被多個(gè)任務(wù)使用)使用一個(gè)信號(hào)鼠做為設(shè)備互斥管理、信號(hào)量類型(使用一個(gè)uint8類型表示所使用信號(hào)量類型、目前有數(shù)字信號(hào)斎和互斥型信號(hào)鼠兩種),中斷向量控制寄存器參數(shù)列表,卜一個(gè)設(shè)備控制塊指針(利用該指針每創(chuàng)建一個(gè)設(shè)備的時(shí)候?qū)?chuàng)建的設(shè)備放入設(shè)備管理隊(duì)列中)、設(shè)備操作句柄;2、操作設(shè)備的方法包括:(該部分的代碼實(shí)現(xiàn)在HAL.c中)A、設(shè)備控制塊空閑列表初始化函數(shù):利用靜態(tài)數(shù)組創(chuàng)建一個(gè)空閑的設(shè)備控制塊鏈表。其實(shí)現(xiàn)如卜所示:DEV_CONTRO

18、L_BLOCK*HvlFreeList=NULL,/定義一個(gè)設(shè)備控制塊空閑鏈表指針一一使用數(shù)組預(yù)審請(qǐng)?jiān)O(shè)備控制塊空間uint8DevControlsizeof(DEV_CONTROL_BLOCK)MAX_DEV_MUN=0,/*設(shè)備控制塊空閑鏈表初始化*/DEV_COOTROL_BLOCK*HvlFreeListInti(void)DEV_CONTROL_BLOCK*FreeList=(DEV_CONTROL_BLOCK*)DevControl,DEV_CONTROL_BLOCK*pTemp=(DEV_CONTROL_BLOCK*)DevContiol;uintS*pMemSet=(uint8水

19、)DevContiol,uint32for(i=0,isizeof(DEV_CONTROL_BLOCK)*MAX_DEV_MUN,i+)pMemSeti=0,for(i=0,1next_block=NULL,returnFreeList,在uint8TargeDevicelnit(void)初始化硬件外設(shè)函數(shù)中調(diào)用如卜語彳J完成設(shè)備空閑控制塊鏈表的初始化:/*初始化換件外設(shè)*/uintSTargeDevicelnit(void)初始化設(shè)備控制塊空閑鏈表HvlFreeList=HvlFreeListlntiO,B、創(chuàng)建設(shè)備:該函數(shù)的接口形式如下:uint8CreatDevic(DEV_IDdev

20、jd.voidcreatparam,DEV_OPERATIONS*creatist)過程是從中取得一個(gè)控制塊,同時(shí)調(diào)用設(shè)備安裝函數(shù)OS_EVENT*(*DevInstell)(void*param,INT8U*err),返回一個(gè)設(shè)備信號(hào)貼而該設(shè)備安裝函數(shù)由具體的底層驅(qū)動(dòng)開發(fā)者提供,是參數(shù)DEV_OPERATIONS*creatjist的成員么一,目的是為了方便設(shè)備驅(qū)動(dòng)開發(fā)者可以自由的選擇信號(hào)鼠類型;進(jìn)一步初始化設(shè)備ID,最后將該控制塊璉接到具體的函數(shù)實(shí)現(xiàn)如下:DEV_CONTROL_BLOCK*HvlConList=NULL,/定義設(shè)備控制塊鏈表指針,/*創(chuàng)建一個(gè)設(shè)備*/uint8CreatD

21、evic(DEV_IDdev_id,void*creatparamEVOPERATIONS*creat_list)DEV_CONTROLBLOCK*GetHCB=NULL,uint8OSeir=TRUE,OS_ENTER_CRmCAL0,GetHCB=HvIFreeList,創(chuàng)建設(shè)備時(shí)從設(shè)備控制空閑鏈表中取得一個(gè)設(shè)備控制塊if(GetHCB=NULL)OS_EXIT_CRmCAL0,returnHVL_NO_CONTROL_BLOCK獲取控制塊失敗,返回?zé)o空閑設(shè)備控制HvlFreeList=HvlFreeListnext_block;GetHCB-deviceid=devid,GetHCB-d

22、ev_opjiandle=cieatjist,GetHCB-dev_opjiandle-parent=GetHCB,0S_EXIT_CRmCAL。;調(diào)用設(shè)備安裝函數(shù),該函數(shù)返回一個(gè)互斥信號(hào)量指針和錯(cuò)誤類型一GetHCBdev_file=GetHCB-dev_opJiandle-DevInstall(cieatparam,&OSerr),if(OSeir!=HVL_NO_ERR)/判斷是否安裝設(shè)備成功,不成功則返還設(shè)備控制塊GetHCBdevice_id=0,GetHCB-dev_opJiandle-parent=NULL,GetHCB-dev_op_handle=NULL,GetHCB-nex

23、t_block=HvlFreeList,HvlFreeList=GetHCB,returnHVLINSTALLFAIL,if(GetHCB-devJile-OSEventType=OS_EVENT_TYPE_MUTEX)GetHCB-sem_type=MUTEX_SEM,elseif(GetHCB-dev_file-OSEventType=OS_EVENT_TYPE_SEM)GetHCB-sem_type=BASIC_SEM,GetHCB-waitouttime=0,/無限時(shí)的等待打開一個(gè)設(shè)備.#if(EN_DEV_UNINSTALL=1)GetHCBVicVectCnt=(DEV_INTER

24、RUPT_REG*)cieatparam)-VicVectCnt,GetHCB-VicVectAddr=(DEV_INTERRUPT_REG*)creatparam)-VicVectAddr,#endifGetHCB-next_block=HvlConList,HvlConList=GetHCB,returnHVLNOERR,在uint8TargeDeviceInit(void)初始化硬件外設(shè)函數(shù)中調(diào)用如下語句完成創(chuàng)建一個(gè)設(shè)備,例如創(chuàng)建UART0/*初始化哽件外設(shè)*/uint8TargeDevicelnit(v01d)#if(EN_UARTO_DRIVE=1)初始外亞-UARTOInitO,#

25、endifUARTOInitO,函數(shù)實(shí)現(xiàn)如卜所示:/*uaitO初始化函*/voidUART0Init(void)UART_CREAT_PARAMuaitOparam,VIC_REGISTER_GROUPvic_uart_pawm,uaitO_paramBaudRate=9600,uaitO_paramSetsize=_8bitLIode”uaitO_paramSetstopb=_lbitSTOP,uaitO_param.Setpanty=AddBitCheck,uaitO_paramSetenpanty=DisparityCheck,uaitO_paramISRPORT=&UART0_Han

26、dler,vic_uart_param.VicVectCnt=&UART0_VICVectCnt,vic_uait_param.VicVectAddr=&UARTO_VICVectAddr,uaitO_paramext_creat_param=&vic3iart_param,uaitO_fun.DevPutch=&v_UARTOSendNByte,uaitO_fun.DevGetch=&u_UARTOGetNByte,uaitOfun.DevContiol=&uUARTOContiol,uaitOfun.DevInstall=&UARTOInstall,#if(EN_DEV_UNINSTALL

27、=1)uaitO_funDevUninstall=&UARTOUninstall,#elseuaitO_fun.DevUninsUll=NULL,#endifCreatDevic(UARTO_ID,&uartO_param,&uartO_Fun);如上所示,在UARTOInit函數(shù)中調(diào)用了CreatDeviCo第一個(gè)參數(shù)是該設(shè)備的ID,第二個(gè)參數(shù)是創(chuàng)建參數(shù),主要記錄了初始設(shè)置例如串門波特率等,第二個(gè)參數(shù)主要用于傳遞底層的設(shè)備驅(qū)動(dòng)函數(shù)指針如:v_UARTOSendNByte(uaitO發(fā)送N字節(jié)的數(shù)據(jù),即設(shè)備寫操作的具體實(shí)現(xiàn))。u_UARTOGetNByte(uaitO接收N字節(jié)數(shù)據(jù),即設(shè)備讀的

28、具體實(shí)現(xiàn))。u_UARTOContiol(uartO控制函數(shù),即設(shè)備控制的貝體實(shí)現(xiàn))0UARTOInstall(uaitO設(shè)備安裝函數(shù)的實(shí)現(xiàn))。C、設(shè)備打開:過程是從有效的設(shè)備控制塊徒表中找到指定ID的設(shè)備控制塊,審請(qǐng)信號(hào)量,如果審請(qǐng)通過則返回該設(shè)備的操作句柄。函數(shù)原型如卜:DEV_FUN*DeviceOpen(DEV_IDdev_id,HVL_ERR_CODE*eir)DEVCONTROLBLOCK*GetHCB=HvlConList,uintSOSeir,if(GetHCB=NULL)*eiT=HVLCONTROLLISTFULL,returnNULL,while(GetHCB!=NULL

29、)if(GetHCB-devicejd=devjd)找到指定ID的設(shè)備if(GetHCBsem_type=MUTEX_SEM)向操作系蔬審請(qǐng)打開設(shè)備操張OSMutexPend(GetHCB-dev_file,GetHCB-vzait_out_tinie,&OSerr),elseif(GetHCBsem_type=BASIC_SEM)OSSemPend(GetHCB-dev_file,GetHCB-V7ait_out_tirne,&OSerr)”else水err=HVLNOFINDDEV,returnNULL,if(OSeiTi=OS_NO_ERR)水err=HVLWAITDEVTIMEOUT,

30、returnNULL,*eir=HVLNOERR,利用強(qiáng)制轉(zhuǎn)換繼承函數(shù)接11并返回設(shè)備接11return(pEV_FUN*)GetHCB-dev_opJiandle,GetHCB=GetHCB-nextblock,*eir=HVL_NO_FIND_DEV,returnNULL,D、設(shè)備關(guān)閉:過程則是將傳入的設(shè)備句柄強(qiáng)制轉(zhuǎn)換成DEV_OPERATIONS*指針類形,然后用其成員DEV_CONTROL_BLOCK*parent,所指向的該設(shè)備的控制塊。Z后釋放信號(hào)鼠,最后將設(shè)備句柄賦值NULL。在這里傳給DeviceClose的參數(shù)是指向指針的指針,目的就是為了這一步的賦值。uint8Device

31、Close(DEV_FUN*dev)DEV_OPERATIONS*GetDev=(DEVOPERATIONS*)(*dev);uint8OSeir=1,if(GetDev-parent=NULL)returnHrLCLOSEDEVFAIL,if(GetDev-parent-sem_type=MUTEX_SEM)OSeiT=OSMutexPost(GetDev-parent-dev_file),elseif(GetDevparentsem_type=BASIC_SEM)OSeiT=OSSemPost(GetDevparent-dev_file),if(OSeir=OS_NO_ERR)*dev=N

32、ULL,returnHVLNOERR,elsereturnHrLCLOSEDEVFAIL,E:設(shè)備的操作句柄函數(shù)列表包括:讀出、控制、寫入、設(shè)備安裝函數(shù)、設(shè)備控制塊指目的是為了加快設(shè)備關(guān)閉操作;寫入和讀出其實(shí)質(zhì)是寫和讀各個(gè)設(shè)備的緩沖區(qū)。而控制應(yīng)包括設(shè)備參數(shù)的設(shè)置,起動(dòng)和停止三部分。設(shè)備打開和關(guān)閉主要解決設(shè)備的共享和分配。Structdevice_operations_listINT8U(*DevPutch)(INT8U*str,INT16Ulength),設(shè)備字節(jié)寫函數(shù)INT8U(*DevGetch)(INT8U*sb;INT16Ulength),設(shè)備字節(jié)讀函數(shù)INT8U(*DevContio

33、l)(void*param),設(shè)備控制函數(shù)OS_EVENT*(*DevInstall)(void*param,INT8U*err),設(shè)備安裝與設(shè)備控制函數(shù)的差別一在于設(shè)備安裝要傳遞向量相關(guān)信息DEV_CONTROL_BLOCK*parent;指向包含該設(shè)備操作列表的設(shè)備控制塊相當(dāng)于,用于加快設(shè)備關(guān)閉F:其中對(duì)于上層抽像接口只開放三個(gè)函數(shù)指針:分別是讀,寫,控制函數(shù)。typedefshuctdevice_functionDEV_FUN,structdevice_function從設(shè)備操作列表中繼承三個(gè)設(shè)備函數(shù)INT8U(*DevPutch)(INT8U*str,INT16Ulength),設(shè)備字

34、節(jié)寫函數(shù)INT8U(*DevGetch)0NT8U*sti.INT16Ulength),設(shè)備字節(jié)讀函數(shù)INT8U(*DevConhol)(void*param);設(shè)備控制函數(shù),3、上層抽像接口:為了方便應(yīng)用程序的開發(fā)所以為每個(gè)設(shè)備提供特定的抽像接II,設(shè)置上層抽像接II的原則是碾件無關(guān)性。利用這一特性將來所有的應(yīng)用程序,GUI,TCP/IP都可以很輕松的在不同的碘件體系上運(yùn)行。為了實(shí)現(xiàn)這一特性,該類所有接II的實(shí)現(xiàn)過程如卜:A、通過設(shè)備打開操作得到設(shè)備的操作句柄。B、利用該句柄實(shí)現(xiàn)接口的底層操作。以UART和I2C為例子:為了實(shí)現(xiàn)UART格式化字符輸出可利用設(shè)備操作句柄所包含的字符寫入函數(shù),實(shí)

35、現(xiàn)對(duì)外輸出字符。OS_UART.c,OS_UART.h為UART的上層抽彖接II,提供了三個(gè)函數(shù):v_MmiPi*intf最小格式化字符串輸出,詳細(xì)定義看源代碼UARTSet串I參數(shù)設(shè)置為了實(shí)現(xiàn)I2C的主模式發(fā)送則首先利用I2C設(shè)備句柄的設(shè)備控制函數(shù)設(shè)置I2C模式、所操作I2C設(shè)備地址、數(shù)據(jù)地址;然后利用字符寫入函數(shù)對(duì)外輸出將要發(fā)送的數(shù)據(jù)。OSHC.h.OSIICc為I2C模塊的上層抽彖接II,實(shí)現(xiàn)了3個(gè)抽彖接I1:IZCMasteiSend主模式發(fā)送,詳細(xì)定義看源代碼IZCMasterReceive主模式接收IZCSlaverReceive從模式接收4、底層驅(qū)動(dòng)函數(shù)的實(shí)現(xiàn):UART.c,UART.h為UART底層驅(qū)動(dòng)函數(shù)源碼。nc.c.nc.h為I2C底層驅(qū)動(dòng)函數(shù)源碼。5、驅(qū)動(dòng)開放的框架,模式:以UART為例。上層抽象接口文件0S_UART.H文件中提供了UART抽像接口,應(yīng)用程序利用這些己定義好的接口實(shí)現(xiàn)對(duì)硬件的訪問,可以很方便的在不同硬件平臺(tái)上實(shí)現(xiàn)移植.移植時(shí)所要做的工作就是根據(jù)這些抽象接口的定義形式重新編寫B(tài)SP中的代碼.例如UART0要求根據(jù)硬件平臺(tái)實(shí)現(xiàn)的函數(shù)有:uintSv_UARTOSendNByte(uint8*str,u

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論