www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]VxBus是風(fēng)河公司新的設(shè)備驅(qū)動(dòng)程序架構(gòu),是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驅(qū)動(dòng)程序并沒有和工程配置集成到一起,如果

VxBus是風(fēng)河公司新的設(shè)備驅(qū)動(dòng)程序架構(gòu),是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驅(qū)動(dòng)程序并沒有和工程配置集成到一起,如果要配置設(shè)備驅(qū)動(dòng),就要通過修改BSP目錄下的config.h和syslib.c文件來完成。而基于VxBus架構(gòu)模型的好處是允許驅(qū)動(dòng)的集成和配置在Workbench工程中完成。這就意味著在Workbench環(huán)境下,每個(gè)驅(qū)動(dòng)程序都能通過可視化環(huán)境進(jìn)行配置,都能夠按要求添加或刪除設(shè)備。本文結(jié)合基于PCI2040數(shù)據(jù)采集卡驅(qū)動(dòng)的開發(fā)過程[1],分析了VxBus架構(gòu)下驅(qū)動(dòng)的設(shè)計(jì)實(shí)現(xiàn)。

1 VxBus簡(jiǎn)介

VxBus是指在VxWorks中用于支持設(shè)備驅(qū)動(dòng)的特有的架構(gòu),這種架構(gòu)包含對(duì)minimal BSP的支持。它包括以下功能:①允許設(shè)備驅(qū)動(dòng)匹配對(duì)應(yīng)設(shè)備;②提供驅(qū)動(dòng)程序訪問硬件的機(jī)制;③軟件其他部分訪問設(shè)備功能;④在VxWorks系統(tǒng)中,實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)的模塊化。VxBus在總線控制器驅(qū)動(dòng)程序服務(wù)的支持下,能在總線上發(fā)現(xiàn)設(shè)備,并執(zhí)行一些初始化工作,使驅(qū)動(dòng)與硬件設(shè)備之間正常的通訊。

VxBus 在整個(gè)系統(tǒng)中的位置示意圖。可以看到,VxBus起到了輔助總線的作用,提供了對(duì)總線控制驅(qū)動(dòng)的支持。

 

在VxWorks6.2版本發(fā)布前,設(shè)備驅(qū)動(dòng)并不能被集成到VxWorks工程配置當(dāng)中,為了添加或移出設(shè)備驅(qū)動(dòng),需要有豐富的BSP和驅(qū)動(dòng)開發(fā)相關(guān)的知識(shí)[2]。并且在驅(qū)動(dòng)被添加或移出時(shí)要去做一些管理VxWorks 工程的額外的工作。作為VxWorks系統(tǒng)組件的一部分,VxBus消除了上面遇到的一些難題,各種驅(qū)動(dòng)和支持組件的添加與刪除完全可以在 Workbench工程中進(jìn)行,而不需要BSP和驅(qū)動(dòng)相關(guān)的知識(shí),也不會(huì)在添加、刪除驅(qū)動(dòng)時(shí)增加管理VxWorks工程的額外工作。因此大大方便了BSP 的開發(fā)。

2 硬件介紹

TI公司推出的PCI2040是一款用于實(shí)現(xiàn)PCI局部總線與DSP之間無縫鏈接的專用芯片。在VxWorks實(shí)時(shí)操作系統(tǒng)環(huán)境下實(shí)現(xiàn)主機(jī)與DSP的通訊,系統(tǒng)利用PCI2040實(shí)現(xiàn)TMS320VC5410與主機(jī)的通訊。由于PCI2040是TI的配套專用芯片,硬件級(jí)的連接比較簡(jiǎn)單,將對(duì)應(yīng)的引腳連接即可。需要注意的是,未用的輸入信號(hào)線需要通過上拉電阻上拉至有效邏輯電平。TMS320VC5410的MCBSP0與TLC2548 連接,實(shí)現(xiàn)8路12位A/D數(shù)據(jù)的采集。TMS320VC5410將采集到的數(shù)據(jù)通過PCI2040傳輸?shù)街鳈C(jī)上,數(shù)據(jù)在主機(jī)上得到進(jìn)一步的處理。

 

3 驅(qū)動(dòng)開發(fā)

基于VxBus架構(gòu)下PCI2040設(shè)備驅(qū)動(dòng)的開發(fā)主要包括設(shè)備的初始化、設(shè)備控制以及設(shè)備驅(qū)動(dòng)如何以組件形式添加到Workbench配置界面中。下面分步介紹它的實(shí)現(xiàn)。

3.1設(shè)備驅(qū)動(dòng)初始化

設(shè)備的初始化,包含在BSP的初始化過程中[3],主要分三個(gè)階段。

 

3.1.1內(nèi)核預(yù)初始化階段

系統(tǒng)上電啟動(dòng),CPU在上電時(shí)跳轉(zhuǎn)到一個(gè)指定的地址 ,開始執(zhí)行指令,初始化內(nèi)存和CPU,然后是VxWorks 的初始化處理。

在VxWorks內(nèi)核預(yù)初始化早期,BSP的sysHwInit( )函數(shù)被執(zhí)行[4],在這個(gè)函數(shù)中,設(shè)備驅(qū)動(dòng)初始化工作第一步被執(zhí)行。sysHwInit( )函數(shù)執(zhí)行一些早期的初始化,調(diào)用hardWareInterFaceInit( )函數(shù),執(zhí)行初始化硬件內(nèi)存分配機(jī)制,這步允許在系統(tǒng)內(nèi)存池初始化之前,限制為設(shè)備驅(qū)動(dòng)分配內(nèi)存,這個(gè)函數(shù)接著調(diào)用 hardWareInterFaceBusInit( ),在hardWareInterFaceBusInit( )函數(shù)中完成所有設(shè)備驅(qū)動(dòng)和模塊的注冊(cè)工作。PCI2040的注冊(cè)函數(shù)是vxbPci2040Register()。 vxbPci2040Register()通過數(shù)據(jù)結(jié)構(gòu),向系統(tǒng)注冊(cè)一些設(shè)備初始化函數(shù)。其中涉及到三個(gè)數(shù)據(jù)結(jié)構(gòu):

LOCAL struct drvBusFuncs PciFuncs =

{

Pci2040InstInit, /* devInstanceInit */

Pci2040InstInit2, /* devInstanceInit2 */

Pci204InstConnect /* devConnect */

}

在這個(gè)結(jié)構(gòu)中,包含了初始化階段要調(diào)用的函數(shù)。下面的初始化過程會(huì)用到這些函數(shù)。

LOCAL struct vxbDeviceMethod Pci2040Methods[] =

{

DEVMETHOD(ReadHPID, PCI2040ReadHPID),

DEVMETHOD(WriteHPID, PCI2040WriteHPID),

DEVMETHOD(ReadHPIA, PCI2040ReadHPIA),

DEVMETHOD(WriteHPIA, PCI2040WriteHPIA),

DEVMETHOD(ReadHPIC, PCI2040ReadHPIC),

DEVMETHOD(WriteHPIC, PCI2040WriteHPIC),

DEVMETHOD(ReadCSR, PCI2040ReadCSR),

DEVMETHOD(WriteCSR, PCI2040WriteCSR),

{ 0, 0 }

}

這個(gè)結(jié)構(gòu)提供了應(yīng)用軟件操作硬件的一些函數(shù)及方法。

LOCAL struct vxbPciRegister Pci2040DevPciRegistration =

{

{

NULL, /* pNext */

VXB_DEVID_DEVICE, /* devID */

VXB_BUSID_PCI, /* busID = PCI */

VXB_VER_4_0_0, /* vxbVersion */

LNPCI_NAME, /* drvName */

&Pci2040Funcs, /* 總線驅(qū)動(dòng)函數(shù)*/

Pci2040Methods, /* 設(shè)備方法結(jié)構(gòu) */

Pci2040Probe, /* 設(shè)備探測(cè)函數(shù) */

Pci2040ParamDefaults /* 參數(shù)*/

},

NELEMENTS(PciPci204DevIDList),

PciPci204DevIDList /*設(shè)備資源列表*/

};

最后這個(gè)結(jié)構(gòu)在vxbPci2040Registe()中被使用。這個(gè)結(jié)構(gòu)包括幾個(gè)驅(qū)動(dòng)的初始化入口,其中Pci2040Probe()是 PCI2040采集卡的硬件探測(cè)函數(shù),該函數(shù)在VxBus初始化過程中檢測(cè)采集卡的數(shù)量,當(dāng)檢測(cè)到采集卡時(shí),將采集卡與驅(qū)動(dòng)結(jié)合,形成設(shè)備的一個(gè)實(shí)例,以便應(yīng)用程序使用。Pci204InstanceInit( )函數(shù)在VxBus初始化的第一階段被調(diào)用, Pci204InstanceInit( )函數(shù)只是簡(jiǎn)單地確保設(shè)備的中斷被禁止。

當(dāng)所有驅(qū)動(dòng)在VxWorks注冊(cè)之后,hardWareInterFaceBusInit( )和hardWareInterFaceInit( ) 函數(shù)返回,sysHwInit( ) 完成非VxBus 驅(qū)動(dòng)的初始化并返回。sysHwInit( ) 函數(shù)返回后,VxWorks內(nèi)核被初始化。

3.1.2 內(nèi)核自檢

在這個(gè)階段,內(nèi)核在sysHwInit2( )中執(zhí)行,BSP調(diào)用Pci2040InstanceInit2( )函數(shù)[5]。在這個(gè)函數(shù)中,建立系統(tǒng)內(nèi)存到設(shè)備空間的映射。關(guān)鍵部分代碼如下:

LOCAL void Pci204InstInit2(VXB_DEVICE_ID pDev)

{……[!--empirenews.page--]

for (i = 0; i < VXB_MAXBARS; i++)

{

if (pDev->regBaseFlags[i] == VXB_REG_IO)

break;

}

if (i == VXB_MAXBARS)

return;

pDrvCtrl->Pci2040Bar = pDev->pRegBase[i];

vxbRegMap (pDev, i, &pDrvCtrl->Pci2040Handle);

//設(shè)備I/O映射到系統(tǒng)內(nèi)存

……

}

此時(shí),完成內(nèi)核服務(wù)初始化,并可以被驅(qū)動(dòng)訪問。但是,中間層的服務(wù)仍然無效。

3.1.3 應(yīng)用程序初始化驅(qū)動(dòng)部分

在devInstanceInit2( )函數(shù)最后,創(chuàng)建用戶的運(yùn)行任務(wù),并完成設(shè)備驅(qū)動(dòng)的初始化。在這個(gè)階段,Pci2040InstanceConnect( )函數(shù)被調(diào)用,完成最后的初始化工作,在這個(gè)函數(shù)中,主要是建立中斷與中斷服務(wù)程序的連接。

至此,設(shè)備驅(qū)動(dòng)的初始化完成。

3.2驅(qū)動(dòng)程序的配置

采用VxBus驅(qū)動(dòng)的一個(gè)主要優(yōu)點(diǎn)是:設(shè)備的驅(qū)動(dòng)程序可以被看成VxWorks 系統(tǒng)的一個(gè)組件,通過集成的Workbench開發(fā)環(huán)境來配置設(shè)備驅(qū)動(dòng)。為了實(shí)現(xiàn)這一功能,開發(fā)的驅(qū)動(dòng)需要增加一些額外的擴(kuò)展文件。標(biāo)準(zhǔn)VxWorks設(shè)備驅(qū)動(dòng)有一個(gè)最小的文件集,對(duì)于大多數(shù)VxWorks設(shè)備驅(qū)動(dòng),最小的設(shè)備驅(qū)動(dòng)集要求有6個(gè)單獨(dú)的文件[6]。PCI2040數(shù)據(jù)采集卡需要有以下文件:

· 一個(gè)驅(qū)動(dòng)源文件PCI2040.c,執(zhí)行驅(qū)動(dòng)運(yùn)行邏輯,包括PCI2040驅(qū)動(dòng)的實(shí)現(xiàn)代碼。

· 一個(gè)組件描述文件PCI2040.cdf,允許集成驅(qū)動(dòng)到VxWorks開發(fā)工具Workbench當(dāng)中。

· 一個(gè)PCI2040.dc文件,提供驅(qū)動(dòng)注冊(cè)函數(shù)原型。

· 一個(gè)PCI2040.dr文件,提供一個(gè)調(diào)用注冊(cè)函數(shù)的C語言代碼段。

· 一個(gè)readme文件 ,提供版本信息。

· 一個(gè)makefile 文件,提供建立驅(qū)動(dòng)的編譯規(guī)則。

當(dāng)上述文件在workbench環(huán)境下進(jìn)行相應(yīng)的配置后,PCI2040的設(shè)備驅(qū)動(dòng)就會(huì)以組件的形式出現(xiàn)在開發(fā)工程的Kernel Configuration選項(xiàng)中,可以方便地進(jìn)行PCI2040驅(qū)動(dòng)配置。

4 應(yīng)用程序與驅(qū)動(dòng)的通信

為了使設(shè)備和驅(qū)動(dòng)能夠在VxWorks系統(tǒng)中使用,讓應(yīng)用程序、中間件、VxWorks內(nèi)核模塊訪問設(shè)備,執(zhí)行一些操作,最基本的方法是在VxWorks 中采用VxBus方法來實(shí)現(xiàn)硬件設(shè)備的訪問。VxBus方法是在驅(qū)動(dòng)中公開一個(gè)入口,使VxBus中API函數(shù)可以調(diào)用這些入口函數(shù)。在PCI2040初始化階段,Pci2040Methods結(jié)構(gòu)中注冊(cè)的函數(shù)就是在驅(qū)動(dòng)中公開的函數(shù),用于對(duì)PCI2040的操作。

例如,通過PCI2040 完成對(duì)DSP數(shù)據(jù)寄存器的訪問

struct vxbDriverControl ctrl;

vxbDevMethodRun(DEVMETHOD_CALL(ReadHPID),&ctrl);

vxbDevMethodRun( )函數(shù)夠被用于調(diào)用一個(gè)指定的驅(qū)動(dòng)方法,這個(gè)函數(shù)反復(fù)查找所有的實(shí)例,并檢查每一個(gè),看是否有指定公開申明的方法,如果實(shí)例有指定的方法,vxbDevMethodRun( )調(diào)用方法函數(shù)。

為了避免重復(fù)遍歷在系統(tǒng)上的所有實(shí)例,可以用 vxbDevMethodGet( )函數(shù)找出驅(qū)動(dòng)函數(shù)相對(duì)應(yīng)的驅(qū)動(dòng)方法 ,然后通過下面代碼完成函數(shù)調(diào)用。

STATUS (*methodFunc)(VXB_DEVICE_ID devID, void * pArg);

methodFunc = bDevMethodGet(devID,DEVMETHOD_CALL(ReadHPID));

if(methodFunc != NULL )

(*methodFunc)(devID, pArg);

在PCI2040的數(shù)據(jù)采集卡中,通常是DSP在采集完數(shù)據(jù)后,通過中斷通知主機(jī),去讀取數(shù)據(jù)。下面是中斷服務(wù)相關(guān)代碼。

void PCI2040Isr()

{ ……

temp=*(PCI2040. instID.pRegister+0x4); //讀中斷寄存器

if((tempr&0x1)!=0) //檢查是否是該實(shí)例中斷

{ *(PCI2040. instID.pRegister +0x4)=0x1;

temp= *(PCI2040. instIDpDspHpicRegister);

*(PCI2040. instIDpDspHpicRegister)=temp|0x0808;

//通知DSP,清除HINT中斷

semGive(semForPci2040Int);

}

}

采用基于VxBus架構(gòu)來開發(fā)PCI2040數(shù)據(jù)采集卡的驅(qū)動(dòng),通過擴(kuò)展文件實(shí)現(xiàn)驅(qū)動(dòng)的配置。與簡(jiǎn)單的非VxBus驅(qū)動(dòng)相比,顯然增加了工作量,然而對(duì)于基于多個(gè)BSP設(shè)備的復(fù)雜的驅(qū)動(dòng),VxBus驅(qū)動(dòng)是優(yōu)于非VxBus驅(qū)動(dòng)的。通過實(shí)際運(yùn)用證明,所開發(fā)采集卡的驅(qū)動(dòng)能夠穩(wěn)定運(yùn)行,并且能很方便地將該驅(qū)動(dòng)移植到其他的系統(tǒng)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉