1樓:匿名使用者
硬體介面標準(參閱有關匯流排,裝置控制器的技術文件)作業系統的裝置無關的部分
也就是說 驅動位於硬體和裝置無關軟體之間,向下遮蔽裝置的硬體細節,向上為作業系統io管理機制提供具體的策略。
一者,你即要有系統結構的常識,又要有io軟體層次的常識二者,必須和參閱硬體介面標準,必須懂作業系統的io管理的機制。
所以,驅動的編寫,即與硬體細節打交道,有和具體的作業系統打交道。
驅動的編寫模式單一,只要你啃下這些東西,就ok了,相對而言,不如應用軟體難做,只是不少人對系統沒有較為深入的理解罷了。
2樓:手機使用者
做嵌入式應用的話一般的程式設計就可以了。那麼嵌入式驅動開發與核心開發的話就需要學習多個方面的知識。我就把這方面的要求給你交流一下:
(一家之言啊,自己多年從事嵌入式開發的一點感悟)嵌入式驅動開發需要了解的知識大概有以下幾類:
1 嵌入式作業系統驅動框架。每一個作業系統都有自己的構架,應該瞭解驅動在整個系統中的具體位置與構建驅動程式的主要事項
2 匯流排知識,比如pci、usb匯流排。
3 晶片知識。驅動其實就是對裝置上一些暫存器的配置、cpu與裝置本身的通訊以及對不同命令的處理
4 要做好驅動,必須對所使用的cpu體系結構有一個比較深刻的認識5 c++基本用不上,主要是c和彙編。
6 做驅動最好要懂核心除錯(比如說linux)
3樓:匿名使用者
c和彙編,然後研究linux kernel吧。
做linux下的驅動開發,需要掌握哪些技能和知識點?有沒具體的要求列一下.謝謝各位
4樓:匿名使用者
.您要驅動什麼東西?拋開linux系統的約束,您對要驅動的東西是如何工作的、如何去程式設計驅動它瞭解嗎?
是一點不瞭解?半知半解?一般瞭解?
還是熟知?精通?如果對要驅動的東西都不瞭解,或者純粹就想泛泛地學習linux驅動程式設計,估計收穫不會很大。
2.做過多執行緒程式設計嗎?為什麼要多執行緒?
深刻理會了多執行緒中如何訪問臨界資源,如何使用mutex,semaphore?多個執行緒工作起來,怎麼控制它們像我們幾個人一起協作幹活那樣,該各幹各的,又該相互通知與配合呢?
3.如果把作業系統比作一個大的執行程式,那麼驅動程式就相當於以動態連結庫形式提供的「外掛」。您有沒有做過「外掛」式的應用程式?
沒做過也沒關係,您認真思考一下這樣的問題:您要做一個控制小車的程式,您這個程式功能很牛x,您希望無論是張家的小車,還是李家的小車都能被您控制,無奈您手頭上只有牛家的小車,但你明白,張家、李家的小車功能和你牛家的差不多,控制也就那些事,就是目前不知道具體該如何控制。您得想個法子,留好介面,儘可能保證以後張家、李家的小車都可以被你的程式控制——這時候,你的程式該怎麼設計結構比較好呢?
4.cpu在時鐘脈衝「pia-pia」的節奏下都在幹些什麼?無論是x86或是arm,要做驅動,對這個還是得有點基本的瞭解。
5.保護模式,虛擬記憶體,大致的道理明白嗎?這個得知道。
咱們現在大多數的處理器都有cache,cache幹啥用?對dma會有些什麼不良影響?這個如果要搞dma(例如pci裝置驅動)需要明白。
6.按樓上的兄弟說的,找本ldd學習
7.總的來說,裝置驅動程式乾的是驅動硬體的活,但它的編寫更需要注重軟體的思路、結構和方法。前面說的寫小車控制程式能一定程度上說明這個問題。
當然,聽起來好像有點難,但是幹起來還是挺爽的,沒有想的那麼複雜
請問學習linux驅動開發都需要學習哪些基礎,請各位高人幫忙推薦幾本好書
5樓:匿名使用者
c語言必須精通,接下來是linux的一操作命令,還有需要了解一些工具的用法。總之驅動不是好學的,但是學好之後一定會很有用的。
6樓:匿名使用者
嵌入式處理器概述;2)arm體系結構;3)arm指令分類及其定址方式;4)arm程式設計;
1.2 arm的c程式設計
1)arm c/c++ 混合程式設計;2)ads的使用;3)arm開發除錯環境的建立;
實驗:1、組合語言實驗;2、彙編、c語言混合程式設計實驗。
1.3 s3c2410a處理器
1)s3c2410a處理器體系結構;2)s3c2410a 啟動**分析-彙編;3)s3c2410a中斷控制器;
實驗:1、外部中斷實驗;2、矩陣鍵盤掃描實驗。
4)s3c2410a看門狗控制器;5)3c2410a pwm時鐘應用;6)s3c2410a實時時鐘控制器;
實驗:定時器實驗(看門狗、pwm時鐘、實時時鐘)。
7)s3c2410 nand flash控制器;8)s3c2410啟動**分析-c部分;9)s3c2410串列埠控制器;
實驗:1、flash控制器實驗;2、串列埠控制器實驗。
10)s3c2410a iic控制器;11)s3c2410a lcd控制器;12)s3c2410a觸控式螢幕控制器;
實驗:1、iic控制器實驗;2、lcd控制器實驗3、觸控式螢幕控制器實驗。
第二部分:嵌入式linux基礎課程(3天)
2.1 linux 快速入門
如何系統的學習linux驅動開發
7樓:維灣教育培訓
在學習之前一直對驅動開發非常的陌生,感覺有點神祕。不知道驅動開發和普通的程式開發究竟有什麼不同;它的基本框架又是什麼樣的;他的開發環境有什麼特殊的地方;以及怎麼寫編寫一個簡單的字元裝置驅動前編譯載入,下面我就對這些問題一個一個的介紹。
一、驅動的基本框架
1. 那麼究竟什麼是驅動程式,它有什麼用呢:
l 驅動是硬體裝置與應用程式之間的一箇中間軟體層
l 它使得某個特定硬體能夠響應一個定義良好的內部程式設計介面,同時完全隱蔽了裝置的工作細節
l 使用者通過一組與具體裝置無關的標準化的呼叫來完成相應的操作
l 驅動程式的任務就是把這些標準化的系統呼叫對映到具體裝置對於實際硬體的特定操作上
l 驅動程式是核心的一部分,可以使用中斷、dma等操作
l 驅動程式在使用者態和核心態之間傳遞資料
2. linux驅動的基本框架
3. linux下裝置驅動程式的一般可以分為以下三類
1) 字元裝置
a) 所有能夠象位元組流一樣訪問的裝置都通過字元裝置來實現
b) 它們被對映為檔案系統中的節點,通常在/dev/目錄下面
c) 一般要包含open read write close等系統呼叫的實現
2) 塊裝置
d) 通常是指諸如磁碟、記憶體、flash等可以容納檔案系統的儲存裝置。
e) 塊裝置也是通過檔案系統來訪問,與字元裝置的區別是:核心管理資料的方式不同
f) 它允許象字元裝置一樣以位元組流的方式來訪問,也可一次傳遞任意多的位元組。
3) 網路介面裝置
g) 通常它指的是硬體裝置,但有時也可能是一個軟體裝置(如迴環介面loopback),它們由核心中網路子系統驅動,負責傳送和接收資料包。
h) 它們的資料傳送往往不是面向流的,因此很難將它們對映到一個檔案系統的節點上。
二、怎麼搭建一個驅動的開發環境
因為驅動是要編譯進核心,在啟動核心時就會驅動此硬體裝置;或者編譯生成一個.o檔案, 當應用程式需要時再動態載入進核心空間執行。因此編譯任何一個驅動程式都要連結到核心的原始碼樹。
所以搭建環境的第一步當然是建核心原始碼樹
1. 怎麼建核心原始碼樹
a) 首先看你的系統有沒有原始碼樹,在你的/lib/ modules目錄下會有核心資訊,比如我當前的系統裡有兩個版本:
#ls /lib/ modules
2.6.15-rc7 2.6.21-1.3194.fc7
檢視其原始碼位置:
## make menuconfig (配置核心各選項,如果沒有配置就無法下一步編譯,這裡可以不要改任何東西)
#make
如果編譯沒有出錯。那麼恭喜你。你的開發環境已經搭建好了
三、瞭解驅動的基本知識
1. 裝置號
1) 什麼是裝置號呢?我們進系統根據現有的裝置來講解就清楚了:
#ls -l /dev/
crwxrwxrwx 1 root root 1, 3 2009-05-11 16:36 null
crw------- 1 root root 4, 0 2009-05-11 16:35 systty
crw-rw-rw- 1 root tty 5, 0 2009-05-11 16:36 tty
crw-rw---- 1 root tty 4, 0 2009-05-11 16:35 tty0
在日期前面的兩個數(如第一列就是1,3)就是表示的裝置號,第一個是主裝置號,第二個是從裝置號
2) 裝置號有什麼用呢?
l 傳統上, 主編號標識裝置相連的驅動. 例如, /dev/null 和 /dev/zero 都由驅動 1 來管理, 而虛擬控制檯和串列埠終端都由驅動 4 管理
l 次編號被核心用來決定引用哪個裝置. 依據你的驅動是如何編寫的自己區別
3) 裝置號結構型別以及申請方式
l 在核心中, dev_t 型別(在 中定義)用來持有裝置編號, 對於 2.6.0 核心, dev_t 是 32 位的量, 12 位用作主編號, 20 位用作次編號.
l 能獲得一個 dev_t 的主或者次編號方式:
major(dev_t dev); //主要
minor(dev_t dev);//次要
4) 怎麼在程式中分配和釋放裝置號
在建立一個字元驅動時需要做的第一件事是獲取一個或多個裝置編號來使用. 可以達到此功能的函式有兩個:
l 一個是你自己事先知道裝置號的
register_chrdev_region, 在 中宣告:
int register_chrdev_region(dev_t first, unsigned int count, char *name);
first 是你要分配的起始裝置編號. first 的次編號部分常常是 0,count 是你請求的連續裝置編號的總數. name 是應當連線到這個編號範圍的裝置的名子; 它會出現在 /proc/devices 和 sysfs 中.
l 第二個是動態動態分配裝置編號
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
使用這個函式, dev 是一個只輸出的引數, 它在函式成功完成時持有你的分配範圍的第一個數. fisetminor 應當是請求的第一個要用的次編號; 它常常是 0. count 和 name 引數如同給 request_chrdev_region 的一樣.
5) 裝置編號的釋放使用
不管你是採用哪些方式分配的裝置號。使用之後肯定是要釋放的,其方式如下:
void unregister_chrdev_region(dev_t first, unsigned int count);
6)2. 驅動程式的二個最重要資料結構
1) file_operation
倒如字元裝置scull的一般定義如下:
struct file_operations scull_fops = ;
file_operation也稱為裝置驅動程式介面
定義在 , 是一個函式指標的集合. 每個開啟檔案(內部用一個 file 結構來代表)與它自身的函式集合相關連( 通過包含一個稱為 f_op 的成員, 它指向一個 file_operations 結構). 這些操作大部分負責實現系統呼叫, 因此, 命名為 open, read, 等等
2) file
定義位於include/fs.h
struct file結構與驅動相關的成員
l mode_t f_mode 標識檔案的讀寫許可權
l loff_t f_pos 當前讀寫位置
l unsigned int_f_flag 檔案標誌,主要進行阻塞/非阻塞型操作時檢查
l struct file_operation * f_op 檔案操作的結構指標
l void * private_data 驅動程式一般將它指向已經分配的資料
l struct dentry* f_dentry 檔案對應的目錄項結構
3. 字元裝置註冊
1) 核心在內部使用型別 struct cdev 的結構來代表字元裝置. 在核心呼叫你的裝置操作前, 必須編寫分配並註冊一個或幾個這些結構. 有 2 種方法來分配和初始化一個這些結構.
l 如果你想在執行時獲得一個獨立的 cdev 結構,可以這樣使用:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
l 如果想將 cdev 結構嵌入一個你自己的裝置特定的結構; 你應當初始化你已經分配的結構, 使用:
void cdev_init(struct cdev *cdev, struct file_operations *fops);
2) 一旦 cdev 結構建立, 最後的步驟是把它告訴核心, 呼叫:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
說明:dev 是 cdev 結構, num 是這個裝置響應的第一個裝置號, count 是應當關聯到裝置的裝置號的數目. 常常 count 是 1, 但是有多個裝置號對應於一個特定的裝置的情形.
3) 為從系統去除一個字元裝置, 呼叫:
void cdev_del(struct cdev *dev);
4. open 和 release
如何使用使用者故事驅動敏捷開發
一 主體不抄 同1 驅動 是 指驅襲動計算機裡軟體的程式。2 軟體 是一系列按照特定順序組織的計算機資料和指令的集合。二 特點不同 1 驅動 是新增到作業系統中的特殊程式,其中包含有關硬體裝置的資訊。此資訊能夠使計算機與相應的裝置進行通訊。2 軟體 並不只是包括可以在計算機 這裡的計算機是指廣義的計...
怎樣做才能開發左右腦,如何開發左右腦?
我們正常的使用都是大腦 也就是主行動的,小腦開發甚少,建議多做肢體活動和多讀書 如何開發左右腦?提取碼 xpsy右腦潛能開發教育是一項針對0 18歲孩子開發潛能的教育,通過一系列科學系統的右腦潛能開發方法促進孩子大腦的生長髮育,使得神經元細胞健康發育,神經元細胞間的的連線更加緊密,構成資訊傳遞的快速...
我想以後做老師或者翻譯,如何自學英語
學習英語無非就是聽.說.讀.寫.譯。其實教材不是很重要的 隨便什麼教材都可以 然後再看看你準備叫什麼年紀的 大專的話就只能教初中或者小學!建議你在熟悉熟悉初中和小學的教材!還有要想教小學的話口語一定要好點!初中呢英語的基礎知識要搞清楚咯 我帶過一學習的課 其實教材很簡單。但是引申出來的語法問題有時候...