**:
在bsp開發中經常會用到實體地址與虛擬位址的轉換,一般都是基於實體地址獲得相應的虛擬位址來訪問硬體。在wince6.0中,可以在wince600/platform/common/src/inc/oal_memory.h檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們都是基於oemaddresstable表的。也就是說,首先要在oemaddresstable中定義虛擬位址到實體地址之間的對映關係,然後才能使用這些函式。這些函式可以在oal中使用,也可以在eboot中使用,有時也會在驅動中使用。
函式都比較簡單,介紹一下:
void* oalcatoua(void *ca):
該函式根據cached的虛擬位址,返回uncached的虛擬位址
void* oalpatoca(uint32 pa):
該函式根據硬體實體地址,返回cached的虛擬位址
void* oalpatoua(uint32 pa):
該函式根據硬體實體地址,返回uncached的虛擬位址
void* oalpatova(uint32 pa, bool cached):
該函式根據硬體實體地址,返回虛擬位址,虛擬位址是否為cached取決於引數cached,true表示cached,false表示uncached
void* oaluatoca(void *ua):
該函式根據uncached的虛擬位址,返回cached的虛擬位址
uint32 oalvatopa(void *va):
該函式根據虛擬位址,返回相應的硬體實體地址
函式用起來很簡單,無非是在實體地址,cached/uncached的虛擬位址之間轉換。但是實體地址必須在oemaddresstable中定義才可以。所以說白了,也是一種記憶體靜態對映。
虛擬位址不是隨便定義的,wince中有規定,必須在0x80000000---0x9fffffff。
實際上wince建立了兩套虛擬位址空間,乙個是0x80000000---0x9fffffff,是cache enabled。
另乙個是0xa0000000---0xbfffffff,是cache disabled。
區別:如果我們訪問的這個空間只是一段記憶體空間(比如sdram),那麼就可以用cache enabled的空間來訪問,這樣訪問資料的速度會比較快,因為資料被儲存在cache中。
如果我們訪問的這個空間是乙個外設的位址,那麼我們就要使用cached disabled的空間來訪問,這樣才能使cpu與外設同步。
經驗:
只要是sdram,可以用cache enabled空間訪問。
如果是暫存器,就用cache disabled空間訪問。
WinCE OAL中的中斷處理
這張圖想必很多人都見過,主要這張圖太經典了,所以還是貼出來嘮叨幾句,硬體中斷產生以後,會導致核心isr的執行,然後由oal中的isr來處理相應的中斷,最後導致相對應的ist執行完成真正的中斷處理。所以在wince中,中斷處理由isr和ist共同完成。isr主要完成中斷源的確定,遮蔽該中斷並返回給核心...
WinCE OAL中的Memory函式介紹
在bsp開發中經常會用到實體地址與虛擬位址的轉換,一般都是基於實體地址獲得相應的虛擬位址來訪問硬體。在wince6.0中,可以在wince600 platform common src inc oal memory.h檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們都是基於o...
WinCE OAL中的Memory函式介紹
在 bsp開發中經常會用到實體地址與虛擬位址的轉換,一般都是基於實體地址獲得相應的虛擬位址來訪問硬體。在 wince6.0 中,可以在 wince600 platform common src inc oal memory.h 檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們...