WinCE OAL中的Memory函式介紹

2021-06-20 05:16:12 字數 1449 閱讀 4883

**:

在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 檔案中找到相關的操作函式,這些函式用來虛擬位址與實體地址之間的轉換,它們...