當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:為了加快開發(fā)調(diào)試μClinux嵌入式系統(tǒng)的外部硬件設(shè)備,采用直接物理地址的設(shè)備訪問(wèn)方法,在μClinux嵌入式系統(tǒng)中實(shí)現(xiàn)了外部硬件設(shè)備的快速訪問(wèn)。使用地址映像,將

摘要:為了加快開發(fā)調(diào)試μClinux嵌入式系統(tǒng)的外部硬件設(shè)備,采用直接物理地址的設(shè)備訪問(wèn)方法,在μClinux嵌入式系統(tǒng)中實(shí)現(xiàn)了外部硬件設(shè)備的快速訪問(wèn)。使用地址映像,將設(shè)備的寄存器映像到處理器的內(nèi)存空間統(tǒng)一編址,通過(guò)指針定義的地址操作函數(shù)對(duì)外設(shè)備進(jìn)行訪問(wèn)。該方法可以在μClinux操作系統(tǒng)支持的嵌入式系統(tǒng)的硬件環(huán)境中進(jìn)行硬件外部設(shè)備的快速調(diào)試,避免了因等待外部硬件設(shè)備驅(qū)動(dòng)程序的編寫而耽誤外部硬件調(diào)試的時(shí)間,從而加快外部硬件設(shè)備調(diào)試速度,提高硬件開發(fā)調(diào)試效率。 關(guān)鍵詞:方法 μClinux硬件 調(diào)試 快速 在傳感器網(wǎng)絡(luò)節(jié)點(diǎn)中,采用了基于Linux的嵌入式操作系統(tǒng)。開發(fā)基于Linux操作系統(tǒng)的嵌入式微處理器應(yīng)用系統(tǒng),關(guān)鍵是Linux能夠訪問(wèn)嵌入式處理器上擴(kuò)展連接的外部設(shè)備。一旦能夠訪問(wèn)連接的外部芯片設(shè)備,就可以靈活地在Linux上運(yùn)行對(duì)嵌入式系統(tǒng)外部設(shè)備的有關(guān)訪問(wèn)控制應(yīng)用。 Linux在個(gè)人PC機(jī)上的設(shè)備驅(qū)動(dòng)框架作了介紹。介紹了μClinux中訪問(wèn)嵌入式系統(tǒng)外部設(shè)備的設(shè)備驅(qū)動(dòng)方式的框架。不過(guò)對(duì)于設(shè)備驅(qū)動(dòng)程序的操作函數(shù)的實(shí)現(xiàn)由于與具體的外設(shè)備硬件有關(guān),沒有實(shí)現(xiàn)的具體統(tǒng)一方案。設(shè)備驅(qū)動(dòng)方式采用通用的文件訪問(wèn)方式操作設(shè)備,這給對(duì)硬件底層不了解的高層用戶的程序設(shè)計(jì)帶來(lái)了方便。但對(duì)于硬件的設(shè)計(jì)和調(diào)試人員來(lái)說(shuō),不了解底層硬件的操作就無(wú)法實(shí)現(xiàn)設(shè)備的訪問(wèn)。硬件設(shè)計(jì)人員必須實(shí)現(xiàn)訪問(wèn)函數(shù)的具體操作過(guò)程,以達(dá)到對(duì)外部擴(kuò)展設(shè)備的訪問(wèn)測(cè)試和靈活控制。也就是說(shuō),先要完成設(shè)備驅(qū)動(dòng)程序,然后才能進(jìn)行下一步的硬件設(shè)備調(diào)試。 編寫和實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)程序必須先了解和實(shí)現(xiàn)對(duì)設(shè)備底層的訪問(wèn),這是個(gè)復(fù)雜的過(guò)程。先要掌握處理器如何尋址外部設(shè)備、如何配置外部設(shè)備;再實(shí)現(xiàn)底層的地址訪問(wèn)函數(shù);然后再編寫設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)函數(shù),進(jìn)而編寫設(shè)備驅(qū)動(dòng)程序;將驅(qū)動(dòng)程序編譯進(jìn)Linux操作系統(tǒng)內(nèi)核;最后在Linux系統(tǒng)中通過(guò)標(biāo)準(zhǔn)的設(shè)備訪問(wèn)方式訪問(wèn)外部設(shè)備。 采用設(shè)備驅(qū)動(dòng)方式需要很多時(shí)間,以至于耽誤硬件設(shè)計(jì)調(diào)試的進(jìn)程。另一方面,由于應(yīng)用于嵌入式的Linux不支持動(dòng)態(tài)的加載設(shè)備驅(qū)動(dòng)模塊,只能將設(shè)備的模塊編譯進(jìn)Linux內(nèi)部,也就是要將設(shè)備驅(qū)動(dòng)程序重新編譯進(jìn)用于嵌入式的Linux內(nèi)核中,為此采用驅(qū)動(dòng)方式又增加了內(nèi)核的代碼。 在μClinux操作系統(tǒng)中,可以采用直接物理地址訪問(wèn)外部擴(kuò)展設(shè)備,針對(duì)設(shè)備寄存器的地址單元進(jìn)行讀寫操作,直接與硬件接觸,而且便于從最底層了解設(shè)備的操作,直接與硬件接觸,而且便于從最底層了解設(shè)備的工作方式,加快開發(fā)調(diào)試產(chǎn)品的速度。該方法僅僅修改少量的代碼,采用直接地址的訪問(wèn)方式能夠快速完成對(duì)外設(shè)備的訪問(wèn)測(cè)試。與設(shè)備驅(qū)動(dòng)方式相比,重新編譯后使內(nèi)核代碼增加較少。而在μClinux中要采用直接物理地址的外部設(shè)備訪問(wèn),需要修改啟動(dòng)代碼,建立設(shè)備訪問(wèn)函數(shù),需要一定技巧。本文以Motorola的ColdFire MCF5272嵌入式微處理器平臺(tái)為例,介紹了μClinux對(duì)外部設(shè)備的快速訪問(wèn)方法。

1 存儲(chǔ)空間編址 對(duì)于μClinux來(lái)說(shuō),其設(shè)計(jì)是針對(duì)沒有MMU(Memory Manage Unit)的處理器,即μClinux不能使用處理器的虛擬內(nèi)存管理技術(shù),μClinux采用存儲(chǔ)器的分頁(yè)管理,系統(tǒng)在啟動(dòng)時(shí)把實(shí)際存儲(chǔ)器進(jìn)行分頁(yè)。在加載應(yīng)用程序時(shí)程序分頁(yè)加載。但由于沒有MMU管理,實(shí)際上μClinux采用實(shí)存儲(chǔ)器管理策略。 ΜClinux系統(tǒng)對(duì)于內(nèi)存的訪問(wèn)是直接的,它對(duì)地址的訪問(wèn)不需要經(jīng)過(guò)MMU,而是直接送到地址線上輸出,所有程序中訪問(wèn)的地址都是實(shí)際的物理地址。操作系統(tǒng)對(duì)內(nèi)存空間沒有保護(hù),各個(gè)進(jìn)程實(shí)際上共享一個(gè)運(yùn)行空間。 ΜClinux采用了實(shí)內(nèi)存模式,各個(gè)內(nèi)部段在物理內(nèi)存(沒有虛存)層面都是連續(xù)的,其內(nèi)存空間的地址映像如圖1。 根據(jù)內(nèi)存空間是否獨(dú)立,可以將I/O空間的配置分為兩種:一種是I/O空間與內(nèi)存空間相互獨(dú)立,這樣I/O空間的訪問(wèn)需要使用專門的I/O函數(shù)如inb和 outb等。Intel CPU就使用這種方法。另一種是將I/O寄存器作為內(nèi)存的一部分,即I/O寄存器與內(nèi)存統(tǒng)一編址,這樣使用普通的內(nèi)存訪問(wèn)語(yǔ)句即可讀寫I/O寄存器。 Motorola 68K處理器就采用這種體系結(jié)構(gòu),處理器MCF5272也統(tǒng)一編址。即其RAM、FLASH和外設(shè)I/O均統(tǒng)一編址,沒有地址變換和內(nèi)存保護(hù)。 2 快速設(shè)備訪問(wèn) 在C語(yǔ)言中,用指針可以對(duì)內(nèi)存地址單元進(jìn)行直接訪問(wèn),因此在設(shè)計(jì)中可以采用指針對(duì)外部設(shè)備進(jìn)行快速操作。 2.1 地址映像 為了訪問(wèn)外部設(shè)備,首先應(yīng)將外設(shè)的寄存器映像到MCF5272的內(nèi)存,與內(nèi)存統(tǒng)一編址。為此,需要修改相應(yīng)代碼。 用于COLDFIRE MCF5272的嵌入式μClinux啟動(dòng)代碼由兩部分組成: μClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S μClinux/linux/arch/m68knommu/platform/5272/sysinit.c 其中crt0_rom.S由匯編寫成,完成CPU的初始化設(shè)置,這是整個(gè)軟件體系的最開始執(zhí)行的代碼入口,CPU一加電就跳到這里執(zhí)行;sysinit.c為C語(yǔ)言代碼,完成MCF5272的集成模塊SIM(如串口、時(shí)鐘、通用I/O等)、SDRAM、FLASH和其它外設(shè)接口、片選等的初始化設(shè)置。 MCF5272的片選CS0~CS7的寄存器CSBR0~CSBR7和CSOR0~CSOR7可將外設(shè)備寄存器的地址映像到內(nèi)存儲(chǔ)空間,這樣可以采用對(duì)內(nèi)存空間的訪問(wèn)來(lái)達(dá)到訪問(wèn)外部設(shè)備。其中寄存器CSBR指明了映像的內(nèi)存起始地址、映像的內(nèi)存容量、總線寬度等;寄存器CSOR用于配置訪問(wèn)控制。片選 CS0用于啟動(dòng)存儲(chǔ)器ROM(FLASH)。 在C語(yǔ)言文件sysinit.c中修改代碼以實(shí)現(xiàn)外設(shè)的寄存器映像功能。應(yīng)用片選CS2實(shí)現(xiàn)的代碼如下: MCF5272_WR_CS_CSBR2(imm,0xffa00001);//寄存器內(nèi)存開始地址:0xffa00000 MCF5272_WR_CS_CSOR2(imm,0xfff00014);//片選2 其中imm為無(wú)符號(hào)字符指針,代表了MCF5272系統(tǒng)集成模塊(SIM)中的寄存器地址。 2.2 實(shí)現(xiàn)訪問(wèn)函數(shù) 通過(guò)修改啟動(dòng)代碼,將外部設(shè)備的寄存器單元映像到內(nèi)存單元后,就可以使用訪問(wèn)內(nèi)存的宏和指針快速訪問(wèn)外部設(shè)備的寄存器。有兩類實(shí)現(xiàn)設(shè)備快速訪問(wèn)的函數(shù)。 2.2.1 使用宏定義 (1)對(duì)設(shè)備的該函數(shù)read_register()實(shí)現(xiàn) #define read_register(IMM,OFFSET,SIZE)Mcf5272iord(IMMP,OFFSET,SIZE) (2)對(duì)設(shè)備的寫函數(shù)write_register()實(shí)現(xiàn) #define write_register(IMM,OFFSET,SIZE,DAT)Mcf5272iowr(IMMP,OFFSET,SIZE,DATA) 其中Mcf5272_iord和Mcf5272_iowr為宏。在sysinit.h中有下列宏定義: (a)用于計(jì)算地址的宏 #define Mcf5272_addr(IMM,OFFSET)((void *)%26;amp;((unsigned char *)IMMP[OFFSET])) 表示基地址為IMM,偏移地址為OFFSET的內(nèi)存地址。宏返回物理地址。 (b)訪問(wèn)內(nèi)存的宏 #define Mcf5272_iord(IMMP,OFFSET,SIZE) (*(volatile uint ## SIZE *)(Mcf5272_addr)(IMMP,OFFSET))) #define Mcf5272_iowr(IMMP,OFFSET,SIZE,DATA) (*(volatile uint ## SIZE *)(Mcf5272_addr(IMMP,OFFSET))=(DATA)) 分別表示讀內(nèi)存地址單元內(nèi)容、將數(shù)據(jù)DATA寫入內(nèi)存地址單元。地址單元的基地址為IMM,偏移地址為OFFSET。SIZE表示每次讀寫操作的數(shù)據(jù)度,取值可為8、16、32,分別表示每次操作8位、16位、32位的總線數(shù)據(jù)。[!--empirenews.page--]

2.2.2 采用指針直接定義 (1)對(duì)設(shè)備的讀函數(shù)inb()、inw()、inl()實(shí)現(xiàn) #define inb(addr)(*(volatile unsigned chart*)(addr)) #define inw(addr)(*(volatile unsignedshort*)(addr)) #define inl(addr)(*(volatile unsigned long*)(addr)) 分別是8位、16位、32位數(shù)據(jù)總線的讀函數(shù)。 (2)對(duì)設(shè)備的寫函數(shù)outb()、outw()、outl()實(shí)現(xiàn) #define outb(data,addr)((*(volatile unsigned char*)(addr))=(data)) #define outw(data,addr)((*(volatile unsigned short*)(addr))=(data)) #define outl(data,addr)((*(volatile unsigned short*)(addr))=(data)) #define outl(data,addr)((*(volatile unsigned long*)(addr))=(data)) 分別是8位、16位、32位數(shù)據(jù)總線的寫函數(shù)。 3 應(yīng)用實(shí)驗(yàn) 在筆者的傳感器網(wǎng)絡(luò)節(jié)點(diǎn)中(見圖2),外部設(shè)備芯片采用W99200F,它包含100多個(gè)寄存器。在芯片上電復(fù)位后,芯片寄存器的復(fù)位初始值在手冊(cè)中是已知的。根據(jù)訪問(wèn)方式,它包含三類寄存器:只讀、只寫、可讀寫。W99200F芯片部分寄存器偏移地址及其復(fù)位初始化值如表1所示。 表1 W99200F芯片中部分寄存器及其初始化值 寄存器名偏移地址訪問(wèn)方式數(shù)據(jù)寬度復(fù)位值 Vint_source 0x0d 只讀 8 0x40 Vbv_initial 0x18 讀寫 8 0x13 Vquality 0x19 讀寫 8 0x08 Vin_cntl 0x21 讀寫 8 0x0c Vsize_h 0x24 讀寫 8 0x2c 修改啟動(dòng)代碼和實(shí)現(xiàn)訪問(wèn)函數(shù),其中寄存器CSBR2指明了映像的內(nèi)存起始地址、映像的內(nèi)存容量、總線寬度等。重新編譯μClinux內(nèi)核,并將生成的下載文件燒寫到FLASH中,重新上電在內(nèi)核運(yùn)行起來(lái)后(或者mount上宿主機(jī)硬盤手動(dòng)啟動(dòng)μClinux內(nèi)核),通過(guò)編制一段C語(yǔ)言的測(cè)試程序,調(diào)用設(shè)備訪問(wèn)函數(shù),即可對(duì)外部設(shè)備芯片的寄存器進(jìn)行讀寫。下面是一段測(cè)試程序test.c。 #include #include "io.h" //包含定義的設(shè)備訪問(wèn)函數(shù) int main(void) { printf("Vint_source:0x%x",inb(0xffa00000+0x0d)); //讀寄存器Vint_source初始值 printf("Vbv_initial:0x%x",inb(0xffa00000+0x18)); //向寄存器Vbv_initial寫入值0x7f outb(ox1f,0xffa00000+0x19));//向寄存器Vquality寫入值0x1f outb(0x7f,0xffa00000+0x21));//向寄存器Vin_cntl寫入值0x7f outb(0x2d,0xffa00000+0x24));//向寄存器Vsize_h寫入值0x2d printf(“Vbv_initial:0x%x”,inb(0xffa00000+0x18)); //讀寄存器Vbv_initial的值 printf("Vin_cntl:0x%x"inb(0xffa00000+0x21)); //讀寄存器Vin_cntl的值 printf("Vsize_h:0x%x",inb(0xffa00000+0x24)); //讀寄存器Vsize_h的值 return; } 該測(cè)試程序先讀出外部設(shè)備上電的初始值;再對(duì)外芯片的可讀寫寄存器進(jìn)行寫操作,后讀出寫入的值。在宿主機(jī)Linux系統(tǒng)的minicom調(diào)試窗口中 mount上宿主機(jī)硬盤,運(yùn)行編譯好的test程序,得到該測(cè)試程序的輸出。讀出的初始化值與外部設(shè)備手冊(cè)上的值完全一樣,并且寫入外部設(shè)備寄存器的值與而后讀出的值也完全相同。 通過(guò)測(cè)試檢驗(yàn)說(shuō)明設(shè)備訪問(wèn)函數(shù)能夠按物理地址訪問(wèn)外部設(shè)備。比較設(shè)備驅(qū)動(dòng)程序方法,該方法可以在較短時(shí)間正確訪問(wèn)外部設(shè)備,這樣對(duì)硬件調(diào)試人員來(lái)說(shuō)節(jié)約了時(shí)間,可以快速進(jìn)行硬件的開發(fā)調(diào)試,而不是等待編寫好設(shè)備驅(qū)動(dòng)程序后才調(diào)試硬件,編寫設(shè)備驅(qū)動(dòng)程序可以單獨(dú)進(jìn)行。因此,在μClinux嵌入系統(tǒng)中采用本文介紹的方法調(diào)試外部設(shè)備,具有快速方便的特點(diǎn),大大加快了在μClinux應(yīng)用系統(tǒng)中的設(shè)備調(diào)試,節(jié)約了時(shí)間。

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉