<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM體系結構下面內存和i/o映射區別

ARM體系結構下面內存和i/o映射區別

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
(1)關(guān)于IO與內存空間:

在X86處理器中存在著(zhù)I/O空間的概念,I/O空間是相對于內存空間而言的,它通過(guò)特定的指令in、out來(lái)訪(fǎng)問(wèn)。端口號標識了外設的寄存器地址。Intel語(yǔ)法的in、out指令格式為:
IN 累加器, {端口號│DX}
OUT {端口號│DX},累加器
目前,大多數嵌入式微控制器ARM、PowerPC等中并不提供I/O空間,而僅存在內存空間。內存空間可以直接通過(guò)地址、指針來(lái)訪(fǎng)問(wèn),程序和程序運行中使用的變量和其他數據都存在于內存空間中。
即便是在X86處理器中,雖然提供了I/O空間,如果由我們自己設計電路板,外設仍然可以只掛接在內存空間。此時(shí),CPU可以像訪(fǎng)問(wèn)一個(gè)內存單元那樣訪(fǎng)問(wèn)外設I/O端口,而不需要設立專(zhuān)門(mén)的I/O指令。因此,內存空間是必須的,而I/O空間是可選的。

本文引用地址:http://dyxdggzs.com/article/201611/318962.htm

(2)inb和outb:

在Linux設備驅動(dòng)中,宜使用Linux內核提供的函數來(lái)訪(fǎng)問(wèn)定位于I/O空間的端口,這些函數包括:
· 讀寫(xiě)字節端口(8位寬)
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
· 讀寫(xiě)字端口(16位寬)
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
· 讀寫(xiě)長(cháng)字端口(32位寬)
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);
· 讀寫(xiě)一串字節
void insb(unsigned port, void *addr, unsigned long count);
void outsb(unsigned port, void *addr, unsigned long count);
· insb()從端口port開(kāi)始讀count個(gè)字節端口,并將讀取結果寫(xiě)入addr指向的內存;outsb()將addr指向的內存的count個(gè)字節連續地寫(xiě)入port開(kāi)始的端口。
· 讀寫(xiě)一串字
void insw(unsigned port, void *addr, unsigned long count);
void outsw(unsigned port, void *addr, unsigned long count);
· 讀寫(xiě)一串長(cháng)字
void insl(unsigned port, void *addr, unsigned long count);
void outsl(unsigned port, void *addr, unsigned long count);
上述各函數中I/O端口號port的類(lèi)型高度依賴(lài)于具體的硬件平臺,因此,只是寫(xiě)出了unsigned。

(3)readb和writeb:
在設備的物理地址被映射到虛擬地址之后,盡管可以直接通過(guò)指針訪(fǎng)問(wèn)這些地址,但是工程師宜使用Linux內核的如下一組函數來(lái)完成設備內存映射的虛擬地址的讀寫(xiě),這些函數包括:
· 讀I/O內存
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
與上述函數對應的較早版本的函數為(這些函數在Linux 2.6中仍然被支持):
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
· 寫(xiě)I/O內存
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
與上述函數對應的較早版本的函數為(這些函數在Linux 2.6中仍然被支持):
void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);

(4)把I/O端口映射到“內存空間”:
void *ioport_map(unsigned long port, unsigned int count);
通過(guò)這個(gè)函數,可以把port開(kāi)始的count個(gè)連續的I/O端口重映射為一段“內存空間”。然后就可以在其返回的地址上像訪(fǎng)問(wèn)I/O內存一樣訪(fǎng)問(wèn)這些I/O端口。當不再需要這種映射時(shí),需要調用下面的函數來(lái)撤消:
void ioport_unmap(void *addr);
實(shí)際上,分析ioport_map()的源代碼可發(fā)現,所謂的映射到內存空間行為實(shí)際上是給開(kāi)發(fā)人員制造的一個(gè)“假象”,并沒(méi)有映射到內核虛擬地址,僅僅是為了讓工程師可使用統一的I/O內存訪(fǎng)問(wèn)接口訪(fǎng)問(wèn)I/O端口。



關(guān)鍵詞: ARM體系結構內存io映

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>