隨筆 - 303  文章 - 883  trackbacks - 0
          <2009年2月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          1234567

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網(wǎng)站

          搜索

          •  

          最新評論

           

          大家好,從事工作之后,小尋很久沒寫什么了,現(xiàn)在對我來說,工作之余,研究一下技術,可能以成為一種樂趣,當人們做有益他人的事情,而不求回報,總是快樂。希望下來的內(nèi)容也能給你帶去快樂。  

          關于嵌入式linux開發(fā)并不是一句話,或一篇文章能講清楚的,很多事情也是如此,但有時候,就是那么一兩篇文章,將我們從一個陌生領域的門外進入門內(nèi)。。。。

          如果沒記錯,以前有位兄弟在驅(qū)動的文章里提出一個問題,現(xiàn)在我便把它拿出來

          如何編寫Linux 驅(qū)動程序()

          看完你寫的"驅(qū)動沒什么新鮮玩意兒",我在想,LDD那本書居然還在出版,讓我非常疑惑.僅僅填幾個結構就是驅(qū)動程序了啊....怎么連寫個積存器的動作都沒....

          當時我解釋了很多,如今看來實在是廢話,呵呵,隨著對技術認識,可以簡單的解釋:前面的linux驅(qū)動是建立在操作系統(tǒng)之上的,而這位朋友所說的寄存器設置是指在嵌入式開發(fā)領域,可以說嵌入開發(fā)和驅(qū)動開發(fā)是兩個交叉的學科,嵌入式開發(fā)里不一定全是驅(qū)動開發(fā),驅(qū)動開發(fā)也不全限定在嵌入式平臺。

          關于Linux驅(qū)動,我想需要解釋一個問題,”軟件是如何在硬件上跑起來的?

          從軟件的角度看上去,所有的硬件(寄存器)都是地址(如0x00010011),在arm上大多是32位的。那么為什么要用寄存器?舉個例子,對arm9處理器做編程,通過對寄存器的編程,如:

               LDR r0 , =0x56000010

               MOV r1 , #0x00000400

               STR   r1 , [r0]           @設置GPBCON寄存器,將GPB5端口(引腳)設置為輸出

               LDR r0   , =0x56000014

               MOV r1 , #0x00000000

               STR   r1 , [r0]           @設置CPBDAT寄存器,使GPB5 輸出為0低電平

          MAIN_LOOP:

               B     MAIN_LOOP

          我們就將GPB5設置為輸出端口,并讓GPB5輸出低電平,在開發(fā)板上您就會看到第一個LED燈被點亮。

          從上面的簡單例子看到,通過對寄存器的設置,目的是對硬件做配置,使硬件我們的軟件所用。所以如果硬要在軟件和硬件之間架起橋梁的話,那么這個橋梁便是寄存器,和那些地址了。關于這些地址,我們可以通過手冊獲得,有時候需要做些許計算。

          在這這里大家也許更關心的是:C是如何訪問硬件吧?

          這里講到的是裸跑所以必須有一段程序先對內(nèi)存堆棧做一下配置,這樣我們的C才能跑得起來(關于這部分,由于不是重點就不多講了)

               #define   GPBCON    (*(volatile unsigned long *)0x56000010)

               #define   GPBDAT    (*(volatile unsigned long *)0x56000014)

               int main(void)

               {

                   GPBCON = 0x00000040; //設置GPBCON寄存器,將GPB5端口(引腳)設置為輸出

                   GPBDAT = 0x00000000; //設置CPBDAT寄存器,使GPB5 輸出為0低電平

                   return 0

          }

          我們可以看到它其實和前面的匯編沒什么區(qū)別,只不過是比較好讀罷了。

          不少的處理器都為連在她周圍的硬件(的寄存器),分配給他們自己的地址空間,軟件便是通過地址空間來訪問這些硬件。如果您很想從事這方面的開發(fā),必要的硬件知識是不可少的^_^



          地震讓大伙知道:居安思危,才是生存之道。
          posted on 2009-02-07 11:41 小尋 閱讀(2970) 評論(3)  編輯  收藏 所屬分類: 嵌入式開發(fā)

          FeedBack:
          # re: 如何編寫Linux驅(qū)動程序(續(xù)集)-嵌入式開發(fā)1---軟件是如何在硬件上跑起來?[未登錄] 2009-03-24 21:13 hehe
          不錯 呵呵  回復  更多評論
            
          # re: 如何編寫Linux驅(qū)動程序(續(xù)集)-嵌入式開發(fā)1---軟件是如何在硬件上跑起來? 2009-03-31 16:12 liang
          老兄你好:
          我一個問題忙了幾天了,要開發(fā)pc104總線, 我想問一下前輩如何看懂接口或總線定義圖啊?  回復  更多評論
            
          # re: 如何編寫Linux驅(qū)動程序(續(xù)集)-嵌入式開發(fā)1---軟件是如何在硬件上跑起來? 2009-04-03 22:55 小尋
          無語 硬件理論基礎 懂了 就會看了  回復  更多評論
            
          主站蜘蛛池模板: 辽阳县| 鲁甸县| 成安县| 甘肃省| 洮南市| 大渡口区| 无极县| 贞丰县| 辽源市| 资中县| 盐亭县| 岑巩县| 吴忠市| 饶河县| 吉安市| 广水市| 曲靖市| 清涧县| 元朗区| 乐亭县| 广汉市| 枣阳市| 稷山县| 邯郸市| 隆子县| 永福县| 芦溪县| 浪卡子县| 吐鲁番市| 桂阳县| 临漳县| 广东省| 克拉玛依市| 洱源县| 连云港市| 茂名市| 米林县| 科技| 东丰县| 牡丹江市| 醴陵市|