建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳門賭場網站:RTOS設備驅動向嵌人式Linux的移植

?

Linux狂風雨般攻克了嵌入式系統市場。闡發財指出,大年夜約有1/3到1/2的32/64位新的嵌入式系統設計采納了Linux。嵌入式 Linux 已經在很多利用領域顯示出上風,比如SOHO家庭收集和成像/多功能外設。在(NAS/SAN)存儲,家庭數字娛樂(HDTV/PVR/DVR/STB),和手持設備/無線設備,分外是數字移動電話更得到大年夜幅度成長。

嵌入式Linux新利用不會憑空從開拓者的頭腦中冒出來,大年夜部分項目都是由成千上萬行,以致數百萬行的代碼組成。成千上百的嵌入式項目已經成功地將現有的其它平臺的代碼移植到Linux下,比如Wind River VxWorks 和 pSOS, VRTX, Nucleus 和其它RTOS。這些移植事情有側緊張的代價和現實意義。

到今朝為止,大年夜多半關于移植已有的RTOS利用到嵌入式Linux的文獻,關注RTOS 接口(API)、義務、調整模式以及如何將他們映射到響應得用戶空間去。同樣緊張的是,在I/O調用密集的嵌入式法度榜樣中若何將RTOS的硬件接口代碼移植到加倍規范的Linux設備驅動法度榜樣中去。

本文將概述幾種常用的常常呈現于現有嵌入式利用中的內存映射I/O措施。它們涵蓋的范圍從對中斷辦事例程的特殊應用及用戶線程對硬件造訪到呈現于有些ROTS中的半規范化驅動法度榜樣模型。這對付移植RTOS 代碼到規范化的Linux設備啟動法度榜樣具有必然啟迪生發火用,并且先容了一些移植措施。分外埠,本文會重點評論爭論RTOS和Linux中的內存映射,基于I/O調整行列步隊的移植,將RTOS I/O重定義到Linux下的驅動法度榜樣和守護進程里。

RTOS I/O 觀點

“不規范”是描述大年夜多半RTOS系統I/O的最佳詞語。多半RTOS是針對較早的無MMU的CPU而設計,以是輕忽了內存治理部分,縱然當MMU問世后也是這樣:不區分物理地址和邏輯地址。大年夜多半 RTOS還整個運行在特權模式,雖然外面上看來是增強了機能。整個的RTOS 利用和系統代碼都能夠造訪全部地址空間、內存映射過的設備、以及其他I/O操作。這樣,縱然存在區別,也是很難把RTOS利用法度榜樣代碼同驅動法度榜樣代碼區分開來。

不規范的布局導致了I/O實現的特殊性。在很多環境下,短缺設備驅動法度榜樣模型的認同。根據這種無層次的特點,回首一下基于RTOS軟件中應用的一些緊張觀點和習慣用法異常有指示意義。

內嵌的內存造訪

上個世紀八十年代中期商業化的RTOS產品中,多半嵌入式軟件都有一個對新蒲京澳門賭場網站履行光陰有嚴格需求的,采納I/O查詢和中斷辦事例程的大年夜輪回。開拓職員在項目采納RTOS和履行法度榜樣,主要為了加強并行性和多義務同步,繞開其它有礙實現該目標的法度榜樣布局。這樣,縱然RTOS供給了I/O 調用形式化措施,嵌入式法度榜樣員繼承應用直接的I/O操作:

#define DATA_REGISTER 0xF00000F5

char getchar(void) {

return (*((char *) DATA_REGISTER)); /* read from port */

}

void putchar(char c) {

*((char *) DATA_REGISTER) = c; /* write to port */

}

多半受過練習的開拓者常會將這樣的直接I/O代碼從硬件代新蒲京澳門賭場網站碼平分分開來。然則我照樣常常看到諸如斯類的I/O調用代碼。

當開始應用直接內存映射I/O的時刻,新打仗Linux的嵌入式開拓職員老是想把這類代碼移到用戶空間,經由過程mmap()調用來替代定義寄存器地址的#define 語句。這種處置懲罰措施對付一些原型是可以的,但不能支持中斷處置懲罰,限定了實時相應,分外不安然,不得當商業化產品的宣布。

RTOS 中斷辦事例程

在 Linux里, 中斷辦事屬于內核層; 在一個 RTOS里, 中斷辦事例程代碼沒有特殊規定且常與利用法度榜樣代碼沒什么差別(不外乎返回序列異同)。很多 RTOS供給系統調用或者宏來讓代碼自己檢測它自己的切換狀態(比如 Wind River VxWorks的 intContext())。中斷辦事例程平日也應用標準的庫函數,隨之而來也有可重入性和移植性等問題。

· 一個或者多個利用義務從行列步隊讀消息掏出數據

傳統的RTOS和Linux的范例I/O對照

輸出經常由類似的機制來完成-代替write()或新蒲京澳門賭場網站者相似的系統調用,一個或者多個RTOS義務,將數據放進行列步隊.行列步隊中的數據由以下幾種歷程掏出:一個I/O法度榜樣或者相應“籌備好發送”中斷的中斷辦事例程,一個系統時鐘,或者其它壅閉在取數據行列步隊中的利用義務,然后履行I/O操作(可所以輪詢,也可所以經由過程 DMA).

將RTOS I/O 映射到 Linux中

上面描述的基于行列步隊的臨盆者/破費者I/O模型,僅僅是傳統多種設計中所采納的分外措施的一種。讓我們繼承用這個直接的例子,來評論爭論幾種在嵌入式Linux下的實現措施:

大年夜規模移植到用戶空間

對付只是初步懂得Linux設備驅動設計,或者沒有履歷的開拓者,可能將大年夜多半這種基于行列步隊的法度榜樣原封不動地移植到用戶空間。在這種驅動法度榜樣映擲中,內存映射經由過程函數mmap()供給的指針可以在用戶空間操作物理I/O接口。

#include

#define REG_SIZE 0x4 /* device register size */

#define REG_OFFSET 0xFA400000

/* physical address of device */

void *mem_ptr; /* de-reference for memory-mapped access */

int fd;

fd=open("/dev/mem",O_RDWR); /* open physical memory (must be root) */

mem_ptr = mmap((void *)0x0, REG_AREA_SIZE, PROT_READ+PROT_WRITE,

MAP_SHARED, fd, REG_OFFSET)新蒲京澳門賭場網站;

/* actual call to mmap() */

一個進程下的用戶線程運行類似RTOS的中斷辦事例程或延時義務一樣的操作,然后應用SVR4進程間通信函數msgsnd()將消息放進行列步隊,等待被另一個本地線程或者另一個進程使用函數msgrcv()獲取。

移植的基礎觀點輕易理解,問題主要呈現在細節上。最常見的是RTOS中的利用法度榜樣接口以及若何把它們保留到linux布局中繼承應用。

整體闡發―重構

要是項眼光陰要求不是很緊,并且為了將來項目的可重用和代碼可移植性,你會化光陰闡發當前RTOS利用法度榜樣布局以及如何將他們映射到Linux中去。對付RTOS利用,必要斟酌將義務對應逐一映射到Linux基于進程的線程中去,或者斟酌將RTOS利用重分配到多個Linux進程中去。基于這些斟酌,應該從新斟酌將RTOS進程間通信(IPC)用相宜的進程間或者進程內通訊來替代。

在驅動法度榜樣上,肯定要把不規范的內嵌式RTOS代碼轉化成響應的驅動法度榜樣。假如已有的利用法度榜樣已經很好劃分,或者應用RTOS I/O利用法度榜樣接口,或者分隔在不合的層面,轉化事情將異常輕易進行。假如這類I/O代碼分散于全部利用法度榜樣中,將面臨偉大年夜事情量。

基于API的措施

對付急于開脫舊RTOS,或者考試測驗將原型綜合在一路的開拓者, 更傾向于將很多RTOS映射或者轉化為相稱Linux API。法度榜樣的接口險些是透明的(兼容的API,IPC,系統數據類型等)。另外部分可以經由過程用#define 從新定義和應用宏來辦理。剩下的部分必要從新編碼,作為完備抽象層的一部分。

經由過程應用仿真庫-很多商業嵌入式Linux都帶有(比如我們公司的針對Wind River VxWorks 和 pSOS的仿真庫),新蒲京澳門賭場網站或者應用第三方公司供給的API映射包,比如MapuSoft,能夠使你在移植基于API的法度榜樣時有優越的起頭。

移植RTOS代碼和API 到Linux的多叉措施

大年夜多半項目采納混雜的措施,映射所有兼容的或者輕易轉化的API,從新設置設置設備擺設擺設那些對運行速率有要求的部分,從新編寫殘剩的部分代碼直到編譯經由過程和可以運行徑止。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
江苏体彩虚拟e球彩走势 61彩票开奖 捕鱼游戏开发捕鱼游戏开发的未来发展 2014年上证指数 032特码最准心水论坛 山西泳坛夺金 天津十一选五怎样跟号 河北开一个彩票投注站 亿乐彩游戏 qq分分彩微信群