目前嵌入式系統的工程師有蠻多時候需要撰寫所謂特定device或是chip的driver,這邊先就一些基本的觀念做一點解釋。以linux來說,其程式分成兩個部分,一種運行於kernel,這種程式擁有控制硬體暫存器的權限,因此這邊的程式如果有bug,因為權限太大,很容易造成系統的記憶體空間發生錯誤,而導致整個系統crash。另外一種是運行在user space的程式,這種程式沒有權利直接去存取那些可以直接控制硬體的暫存器,因此其必須利用由linux定義出來,介於user space跟kernel space的介面,將控制的request由這個介面傳給kernel space的driver,用這個driver來將從硬體得到的值再傳回給user space的程式,完成一次對硬體的request。
linux為了統一這個介於中間層的interface,其定義了一些固定的功能,寫driver的時候只要去覆寫這些固定的function,則上層(user-space)可以使用類似的介面來控制許多不同種類的device。
linux將每個device都視為一個檔案,對其做資料上的操作,就很像對檔案做開檔讀檔以及寫入的功能。如果有一些hardware-depedent的一些功能,則可以利用(ioctl+自訂command)的方式來實現。
例如:假設有一個gpio的driver,並且也已經在kernel新增一個gpio(General Purpose I/O)的device,則我們如果要對其操作,我們一樣要先利用open的函數將device打開(f_op=open("/dev/gpio","參數")),然後此時如果成功開啟了device,其會回傳一個file operator,這可以視為要對這個device進行操作的代碼,則我們要對這gpio進行一些特定功能(例如控制值為邏輯0或是邏輯1,或是控制此GPIO為輸入或是輸出)的時候,我們只要使用ioctl的system call,將事先定義好的command以及這個file operator傳進去,我們就可以對device進行這些特定的操作。
基本上在linux撰寫driver,主要就是在kernal層中對一些硬體相關的暫存器做控制,來達到傳輸資料以及控制的目的,不過因為linux有規定好user space跟kernel space的介面規則,因此kernel層的driver還需要根據linux規定的driver框架,進行一些函數的覆寫,大致上這就是linux driver的初步觀念,比較細節的部分,留待以後說明。
2011年8月14日 星期日
2011年8月10日 星期三
TCP/IP Stack for Embedded System
最近因為工作需要,在尋找open source的TCP/IP stack,果然發現了一個好物->uIP,這是一個由Adam Dunkel 所發展的一個用C所寫成的網路協定library,專門for記憶體資源相當有限的8-bit或是16-bit的嵌入式系統應用。由於他是BSD的license,所以目前在很多商用的應用上被大量使用。
它實做了MAC layer以上的protocol,並且它將需要控制ethernet晶片的介面抽象化,讓開發者可以根據不同的硬體來做改寫,而不需要去動到協定本身,因此可以很容易的在不同硬體上做移植。目前這個project已經被整進一個嵌入式系統作業系統的project中(Contiki),這個計畫也是同個開發者所主持,其中主要的網路功能就是使用uIP。
因為uIP為了節省記憶體的使用量,其把一些僅在高效能應用上所需要用到的功能去掉,因此其功能上並不是這麼完整,
另外還有一個solution 叫做 lwIP(lightwight), 一樣是Adam Dunkel所開發 (這個人真猛!!),這個project所實做的功能就更多,但是一樣維持好的記憶體使用效率,因此仍然適用於嵌入式系統。至於要選擇何者來做移植,主要還是要看搭配的硬體效能以及限制。
參考網站:
uIP (old) - http://www.sics.se/~adam/old-uip/
Contiki - http://www.sics.se/contiki/
lwIP - http://www.sics.se/~adam/lwip/
它實做了MAC layer以上的protocol,並且它將需要控制ethernet晶片的介面抽象化,讓開發者可以根據不同的硬體來做改寫,而不需要去動到協定本身,因此可以很容易的在不同硬體上做移植。目前這個project已經被整進一個嵌入式系統作業系統的project中(Contiki),這個計畫也是同個開發者所主持,其中主要的網路功能就是使用uIP。
因為uIP為了節省記憶體的使用量,其把一些僅在高效能應用上所需要用到的功能去掉,因此其功能上並不是這麼完整,
另外還有一個solution 叫做 lwIP(lightwight), 一樣是Adam Dunkel所開發 (這個人真猛!!),這個project所實做的功能就更多,但是一樣維持好的記憶體使用效率,因此仍然適用於嵌入式系統。至於要選擇何者來做移植,主要還是要看搭配的硬體效能以及限制。
參考網站:
uIP (old) - http://www.sics.se/~adam/old-uip/
Contiki - http://www.sics.se/contiki/
lwIP - http://www.sics.se/~adam/lwip/
訂閱:
文章 (Atom)
勒式交易策略
權證的交易策略有一種操作方法叫做勒式交易策略(其實這種交易策略跟選擇權是一樣的),今天來介紹一下這種操作的方法。 首先這種交易策略,適合在你 預期你的連結標的會在未來有個大趨勢 (無論是大跌或是大漲),例如總統大選,或是希臘債務 到期日等等。此時你可以買進不同履約價但是到期日一...
-
目前嵌入式系統的工程師有蠻多時候需要撰寫所謂特定device或是chip的driver,這邊先就一些基本的觀念做一點解釋。以linux來說,其程式分成兩個部分,一種運行於kernel,這種程式擁有控制硬體暫存器的權限,因此這邊的程式如果有bug,因為權限太大,很容易造成系統的記憶...
-
在我研替的面試經驗中,因為投的是數位IC的工程師,因此所謂verilog的blocking & non-blocking的觀念,幾乎是每一家公司的必考題,因此我以我的見解做一個解釋,如有錯誤歡迎指正 顧名思義,所謂的blocking就是verilog大括號所刮起來的...