国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

μClinux嵌入系統(tǒng)中外部硬件設(shè)備的快速調(diào)試方法

發(fā)布時間:2010-11-16 10:48    發(fā)布者:eetech
為了加快開發(fā)調(diào)試μClinux嵌入式系統(tǒng)的外部硬件設(shè)備,采用直接物理地址的設(shè)備訪問方法,在μClinux嵌入式系統(tǒng)中實現(xiàn)了外部硬件設(shè)備的快速訪問。使用地址映像,將設(shè)備的寄存器映像到處理器的內(nèi)存空間統(tǒng)一編址,通過指針定義的地址操作函數(shù)對外設(shè)備進行訪問。該方法可以在μClinux操作系統(tǒng)支持的嵌入式系統(tǒng)的硬件環(huán)境中進行硬件外部設(shè)備的快速調(diào)試,避免了因等待外部硬件設(shè)備驅(qū)動程序的編寫而耽誤外部硬件調(diào)試的時間,從而加快外部硬件設(shè)備調(diào)試速度,提高硬件開發(fā)調(diào)試效率。  

傳感器網(wǎng)絡(luò)節(jié)點中,采用了基于Linux的嵌入式操作系統(tǒng)。開發(fā)基于Linux操作系統(tǒng)的嵌入式微處理器應(yīng)用系統(tǒng),關(guān)鍵是Linux能夠訪問嵌入式處理器上擴展連接的外部設(shè)備。一旦能夠訪問連接的外部芯片設(shè)備,就可以靈活地在Linux上運行對嵌入式系統(tǒng)外部設(shè)備的有關(guān)訪問控制應(yīng)用。  

Linux在個人PC機上的設(shè)備驅(qū)動框架作了介紹。介紹了μClinux中訪問嵌入式系統(tǒng)外部設(shè)備的設(shè)備驅(qū)動方式的框架。不過對于設(shè)備驅(qū)動程序的操作函數(shù)的實現(xiàn)由于與具體的外設(shè)備硬件有關(guān),沒有實現(xiàn)的具體統(tǒng)一方案。設(shè)備驅(qū)動方式采用通用的文件訪問方式操作設(shè)備,這給對硬件底層不了解的高層用戶的程序設(shè)計帶來了方便。但對于硬件的設(shè)計和調(diào)試人員來說,不了解底層硬件的操作就無法實現(xiàn)設(shè)備的訪問。硬件設(shè)計人員必須實現(xiàn)訪問函數(shù)的具體操作過程,以達到對外部擴展設(shè)備的訪問測試和靈活控制。也就是說,先要完成設(shè)備驅(qū)動程序,然后才能進行下一步的硬件設(shè)備調(diào)試。  

編寫和實現(xiàn)設(shè)備驅(qū)動程序必須先了解和實現(xiàn)對設(shè)備底層的訪問,這是個復(fù)雜的過程。先要掌握處理器如何尋址外部設(shè)備、如何配置外部設(shè)備;再實現(xiàn)底層的地址訪問函數(shù);然后再編寫設(shè)備驅(qū)動程序的實現(xiàn)函數(shù),進而編寫設(shè)備驅(qū)動程序;將驅(qū)動程序編譯進Linux操作系統(tǒng)內(nèi)核;最后在Linux系統(tǒng)中通過標(biāo)準(zhǔn)的設(shè)備訪問方式訪問外部設(shè)備。  

采用設(shè)備驅(qū)動方式需要很多時間,以至于耽誤硬件設(shè)計調(diào)試的進程。另一方面,由于應(yīng)用于嵌入式的Linux不支持動態(tài)的加載設(shè)備驅(qū)動模塊,只能將設(shè)備的模塊編譯進Linux內(nèi)部,也就是要將設(shè)備驅(qū)動程序重新編譯進用于嵌入式的Linux內(nèi)核中,為此采用驅(qū)動方式又增加了內(nèi)核的代碼。  

在μClinux操作系統(tǒng)中,可以采用直接物理地址訪問外部擴展設(shè)備,針對設(shè)備寄存器的地址單元進行讀寫操作,直接與硬件接觸,而且便于從最底層了解設(shè)備的操作,直接與硬件接觸,而且便于從最底層了解設(shè)備的工作方式,加快開發(fā)調(diào)試產(chǎn)品的速度。該方法僅僅修改少量的代碼,采用直接地址的訪問方式能夠快速完成對外設(shè)備的訪問測試。與設(shè)備驅(qū)動方式相比,重新編譯后使內(nèi)核代碼增加較少。而在μClinux中要采用直接物理地址的外部設(shè)備訪問,需要修改啟動代碼,建立設(shè)備訪問函數(shù),需要一定技巧。本文以Motorola的ColdFire MCF5272嵌入式微處理器平臺為例,介紹了μClinux對外部設(shè)備的快速訪問方法。


  
1 存儲空間編址  

對于μClinux來說,其設(shè)計是針對沒有MMU(Memory Manage Unit)的處理器,即μClinux不能使用處理器的虛擬內(nèi)存管理技術(shù),μClinux采用存儲器的分頁管理,系統(tǒng)在啟動時把實際存儲器進行分頁。在加載應(yīng)用程序時程序分頁加載。但由于沒有MMU管理,實際上μClinux采用實存儲器管理策略。  

ΜClinux系統(tǒng)對于內(nèi)存的訪問是直接的,它對地址的訪問不需要經(jīng)過MMU,而是直接送到地址線上輸出,所有程序中訪問的地址都是實際的物理地址。操作系統(tǒng)對內(nèi)存空間沒有保護,各個進程實際上共享一個運行空間。  

ΜClinux采用了實內(nèi)存模式,各個內(nèi)部段在物理內(nèi)存(沒有虛存)層面都是連續(xù)的,其內(nèi)存空間的地址映像如圖1。  

根據(jù)內(nèi)存空間是否獨立,可以將I/O空間的配置分為兩種:一種是I/O空間與內(nèi)存空間相互獨立,這樣I/O空間的訪問需要使用專門的I/O函數(shù)如inb和outb等。Intel CPU就使用這種方法。另一種是將I/O寄存器作為內(nèi)存的一部分,即I/O寄存器與內(nèi)存統(tǒng)一編址,這樣使用普通的內(nèi)存訪問語句即可讀寫I/O寄存器。Motorola 68K處理器就采用這種體系結(jié)構(gòu),處理器MCF5272也統(tǒng)一編址。即其RAM、FLASH和外設(shè)I/O均統(tǒng)一編址,沒有地址變換和內(nèi)存保護。  

2 快速設(shè)備訪問  

C語言中,用指針可以對內(nèi)存地址單元進行直接訪問,因此在設(shè)計中可以采用指針對外部設(shè)備進行快速操作。  

2.1 地址映像  

為了訪問外部設(shè)備,首先應(yīng)將外設(shè)的寄存器映像到MCF5272的內(nèi)存,與內(nèi)存統(tǒng)一編址。為此,需要修改相應(yīng)代碼。  

用于COLDFIRE MCF5272的嵌入式μClinux啟動代碼由兩部分組成:  

μClinux/linux/arch/m68knommu/platform/5272/MOTOROLA/crt0_rom.S  
μClinux/linux/arch/m68knommu/platform/5272/sysinit.c  

其中crt0_rom.S由匯編寫成,完成CPU的初始化設(shè)置,這是整個軟件體系的最開始執(zhí)行的代碼入口,CPU一加電就跳到這里執(zhí)行;sysinit.c為C語言代碼,完成MCF5272的集成模塊SIM(如串口、時鐘、通用I/O等)、SDRAM、FLASH和其它外設(shè)接口、片選等的初始化設(shè)置。  
MCF5272的片選CS0~CS7的寄存器CSBR0~CSBR7和CSOR0~CSOR7可將外設(shè)備寄存器的地址映像到內(nèi)存儲空間,這樣可以采用對內(nèi)存空間的訪問來達到訪問外部設(shè)備。其中寄存器CSBR指明了映像的內(nèi)存起始地址、映像的內(nèi)存容量、總線寬度等;寄存器CSOR用于配置訪問控制。片選CS0用于啟動存儲器ROM(FLASH)。  

在C語言文件sysinit.c中修改代碼以實現(xiàn)外設(shè)的寄存器映像功能。應(yīng)用片選CS2實現(xiàn)的代碼如下:  

MCF5272_WR_CS_CSBR2(imm,0xffa00001);//寄存器內(nèi)存開始地址:0xffa00000  
MCF5272_WR_CS_CSOR2(imm,0xfff00014);//片選2  

其中imm為無符號字符指針,代表了MCF5272系統(tǒng)集成模塊(SIM)中的寄存器地址。  

2.2 實現(xiàn)訪問函數(shù)  

通過修改啟動代碼,將外部設(shè)備的寄存器單元映像到內(nèi)存單元后,就可以使用訪問內(nèi)存的宏和指針快速訪問外部設(shè)備的寄存器。有兩類實現(xiàn)設(shè)備快速訪問的函數(shù)。  

2.2.1 使用宏定義  

(1)對設(shè)備的該函數(shù)read_register()實現(xiàn)  

#define read_register(IMM,OFFSET,SIZE)Mcf5272iord(IMMP,OFFSET,SIZE)  

(2)對設(shè)備的寫函數(shù)write_register()實現(xiàn)  

#define write_register(IMM,OFFSET,SIZE,DAT)Mcf5272iowr(IMMP,OFFSET,SIZE,DATA)  
其中Mcf5272_iord和Mcf5272_iowr為宏。在sysinit.h中有下列宏定義:  

(a)用于計算地址的宏  
#define Mcf5272_addr(IMM,OFFSET)((void *)%26;amp;((unsigned char *)IMMP[OFFSET]))  
表示基地址為IMM,偏移地址為OFFSET的內(nèi)存地址。宏返回物理地址。  

(b)訪問內(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ù)。




2.2.2 采用指針直接定義  

(1)對設(shè)備的讀函數(shù)inb()、inw()、inl()實現(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)對設(shè)備的寫函數(shù)outb()、outw()、outl()實現(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)用實驗  

在筆者的傳感器網(wǎng)絡(luò)節(jié)點中(見圖2),外部設(shè)備芯片采用W99200F,它包含100多個寄存器。在芯片上電復(fù)位后,芯片寄存器的復(fù)位初始值在手冊中是已知的。根據(jù)訪問方式,它包含三類寄存器:只讀、只寫、可讀寫。W99200F芯片部分寄存器偏移地址及其復(fù)位初始化值如表1所示。

表1 W99200F芯片中部分寄存器及其初始化值  

寄存器名
偏移地址
訪問方式
數(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

修改啟動代碼和實現(xiàn)訪問函數(shù),其中寄存器CSBR2指明了映像的內(nèi)存起始地址、映像的內(nèi)存容量、總線寬度等。重新編譯μClinux內(nèi)核,并將生成的下載文件燒寫到FLASH中,重新上電在內(nèi)核運行起來后(或者mount上宿主機硬盤手動啟動μClinux內(nèi)核),通過編制一段C語言的測試程序,調(diào)用設(shè)備訪問函數(shù),即可對外部設(shè)備芯片的寄存器進行讀寫。下面是一段測試程序test.c。  

#include  
#include "io.h" //包含定義的設(shè)備訪問函數(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;  
}  

該測試程序先讀出外部設(shè)備上電的初始值;再對外芯片的可讀寫寄存器進行寫操作,后讀出寫入的值。在宿主機Linux系統(tǒng)的minicom調(diào)試窗口中mount上宿主機硬盤,運行編譯好的test程序,得到該測試程序的輸出。讀出的初始化值與外部設(shè)備手冊上的值完全一樣,并且寫入外部設(shè)備寄存器的值與而后讀出的值也完全相同。  

通過測試檢驗說明設(shè)備訪問函數(shù)能夠按物理地址訪問外部設(shè)備。比較設(shè)備驅(qū)動程序方法,該方法可以在較短時間正確訪問外部設(shè)備,這樣對硬件調(diào)試人員來說節(jié)約了時間,可以快速進行硬件的開發(fā)調(diào)試,而不是等待編寫好設(shè)備驅(qū)動程序后才調(diào)試硬件,編寫設(shè)備驅(qū)動程序可以單獨進行。因此,在μClinux嵌入系統(tǒng)中采用本文介紹的方法調(diào)試外部設(shè)備,具有快速方便的特點,大大加快了在μClinux應(yīng)用系統(tǒng)中的設(shè)備調(diào)試,節(jié)約了時間。
本文地址:http://www.qingdxww.cn/thread-39557-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 利用模擬開發(fā)工具生態(tài)系統(tǒng)進行安全電路設(shè)計
  • 更佳設(shè)計的解決方案——Microchip模擬開發(fā)生態(tài)系統(tǒng)
  • 深度體驗Microchip自動輔助駕駛應(yīng)用方案——2025巡展開啟報名!
  • Cortex-M4外設(shè) —— TC&TCC結(jié)合事件系統(tǒng)&DMA優(yōu)化任務(wù)培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美片在线视频观看 | 四虎黄色片 | 免费色网| 国产精品亚洲欧美一区麻豆 | 日本在线观看高清不卡免v 日本在线观看的免费 | 四虎永久网址影院 | 亚洲四虎永久在线播放 | 欧美成人精品大片免费流量 | 日韩一级免费视频 | 99精品视频在线在线视频观看 | 亚色网址| 欧美日韩视频一区二区在线观看 | 99在线播放 | 91av小视频| 四虎免费最新在线永久 | 99热这里只有免费国产精品 | 亚洲天堂免费在线视频 | 酒色网址 | 麻豆观看| 国产精品福利久久2020 | 欧美国产在线看 | 欧洲欧美人成在线视频免费下载 | 亚洲高清在线观看视频 | 成人久久久观看免费毛片 | 成品人app软件大全下载免费 | 亚洲区精选网址 | 国产一区二区在线播放 | 在线观看色视频 | 国产三级成人 | 亚洲综合色婷婷久久 | 无限看动漫片的视频高清免费 | 亚洲第一成年网 | 精品国产不卡一区二区三区 | 黄页网站 | 色综合五月婷婷 | 午夜色大片在线观看 | 天美传媒无忧传媒果冻传媒 | 亚洲国产成人精品91久久久 | 青青草国产免费久久久91 | 中文在线最新版天堂 | 国产成人免费片在线观看 |