国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

奔跑吧,SOC(一)軟件是怎么控制硬件的

發(fā)布時間:2016-1-28 10:04    發(fā)布者:designapp
關鍵詞: SOC , 寄存器
  很多人肯定很疑惑,在嵌入式開發(fā)中,為什么寫c代碼,就能夠控制硬件。這一切是怎么發(fā)生的了,下面我就給大家解剖一下,軟件是怎么控制硬件的。
  我們從控制8個led為例來說明:
  從最簡單的開始,如果使用硬件,控制8個led,最簡單的方式是什么:直接接上開關。就是以下的圖。通過開關控制led管腳輸出不同的電平,就能控制led了。但是這個方法很不靈活,我們要手動的去撥動開關,才能改變led狀態(tài)。
  


  我們將上面電路改一下,把開關的地方換成寄存器,并加一些額外的電路,這樣就可以通過使能信號和信號值改變led值輸出不同電平,間接的控制led了。而使能信號和信號值我們是可以通過外部給的,就比開關要靈活一些了。
  


  既然,上面有寄存器,我們可以給這個寄存器定義一個地址,當然這個地址目前是可以隨意定義的。假設為0x77777777。你可能會有疑問,為什么要給寄存器定義地址了?而且定義的地址為什么是32位了,這個先不著急,聽我慢慢道來。
  我們繼續(xù)在前面加電路
  


  這里,多了一個前級電路,前級電路提供兩個信號,一個地址,一個數(shù)據(jù)。在地址信號通路上,有一個電路模塊,判斷地址是不是0x77777777,是的話,使能信號為1,這樣數(shù)據(jù)不就直接傳遞給寄存器了。不是的話,使能信號為0。寄存器的輸出不變。這樣,通過地址和數(shù)據(jù)就能改變led了。
  這里0x77777777是不是很熟悉,這不就是之前定義的寄存器A的地址嗎?原來,地址就是用來判斷是否產(chǎn)生使能信號的,使能才能使數(shù)據(jù)能夠輸入到寄存器中。
  到了這里,是不是對軟件控制硬件有些眉目了。別著急,我們繼續(xù)往下走。
  既然前級電路只需要提供地址和數(shù)據(jù),并且地址是0x77777777,就可以控制寄存器A的值了,而控制了寄存器A,就控制led。那么我們將前級電路換成一個32位CPU。
  我們知道,CPU是可以產(chǎn)生3種總線信號的,一種地址總線,一種數(shù)據(jù)總線,一種控制總線。控制總線我們這里用不到。將地址總線接到地址線上,將數(shù)據(jù)總線接到數(shù)據(jù)線上。就是以下的電路:
  


  如果我們讓CPU產(chǎn)生地址為0x77777777,然后發(fā)出想要寫入寄存器A的數(shù)據(jù)B,那么數(shù)據(jù)B不就被寫入到寄存器A中,這樣,不就控制led了。這里知道為什么地址要32位的把,因為CPU是32位的,地址就是32位寬的。之所以定義32位的地址,目的是為了和CPU的地址總線32位寬兼容。
  到這里,是不是有豁然開朗的感覺了。我們再繼續(xù)。
  我們知道CPU是要取機器碼然后執(zhí)行的。如果剛好某條機器碼,能讓地址總線上產(chǎn)生0x77777777,數(shù)據(jù)總線上產(chǎn)生數(shù)據(jù)B。那么結(jié)果,數(shù)據(jù)B不就被寫入到寄存器A中了。假設CPU是32位risc的CPU,機器碼就是32位。那么該機器碼應該是如下:
  1001 0000 1110 0000 1011 1010 1111 0010(假設)
  既然這是一條機器碼,那么就應該有一個匯編指令與之對應,假設是
  str r0, r1
  我們預先將地址0x77777777寫入到r0中,數(shù)據(jù)B寫入到r1中,那么上面一條語句執(zhí)行后,不就將數(shù)據(jù)B寫入到寄存器A中了,不就控制led了。這樣不就實現(xiàn)了軟件控制了硬件了。既然匯編代碼可以控制硬件了,那么高級語言同樣也是控制硬件的,只要編譯后的匯編代碼是以上代碼就行了。
  整體控制硬件的代碼就是
  ldr r0, = 0x77777777
  ldr r1, =B
  str [r0], r1
  對應的C代碼就是
  (*(volatile unsigned long *)0x77777777) = B;
  使用指針操作,往0x77777777地址的寄存器寫入數(shù)據(jù)B,加入volatile關鍵字,是防止編譯器對操作進行優(yōu)化。
  通過上面的過程,是不是也可以理解,為什么在嵌入式底層驅(qū)動開發(fā)中,基本都是用C語言,而不用其他高級語言,比如JAVA等。因為這些高級語言沒有指針,你就不能控制寄存器,不能控制寄存器了,你當然就控制不了硬件了。C++也很少用,因為底層驅(qū)動開發(fā)需要高效率代碼,不能太復雜,而C++在這方面,比不過C語言。
  以上是寫入的過程了,如果想要知道led的狀態(tài)呢?通過讀取寄存器A的值,不就知道led的狀態(tài)了。原理是一樣的。只不過數(shù)據(jù)線要變成兩根,一個是負責寫,一根負責讀。電路圖如下:
  


  因為只考慮了一個寄存器,當不選中寄存器A時,讀取的數(shù)據(jù)為全0。
  通過,上面的講述,對軟件控制硬件有沒有了解一些了。軟件控制硬件,本質(zhì)上,就是通過寫代碼去修改或讀取硬件對應的寄存器的值。這樣,就相當于間接的控制了硬件。而硬件的寄存器對于一個處理器來說,都是固定的,都預先定義好了地址。所以在看ARM的數(shù)據(jù)手冊中,可以看到很多寄存器的地址。這些地址的作用,也就是能夠讓你在寫程序的時候,能夠正確的往這些寄存器里面寫入或讀取正確的值,從而控制硬件。
  CPU對外看到的都是寄存器,所以硬件設計的時候,就要對硬件的功能設置幾個寄存器,然后對這幾個寄存器分別定義幾個地址,這樣CPU才可以去控制這幾個寄存器,也就能控制硬件了。定義的寄存器地址位寬是和CPU的地址線位寬是有關系的,如果是一個8位的CPU,也就是經(jīng)典的C51,地址的寬度就是8位,所以你可以在頭文件reg51.c中看到使用sfr定義的地址位寬是8位。在STM32中,CPU是32位的,所以地址的寬度就是32位的,所以你看到STM32數(shù)據(jù)手冊中,寄存器的地址都是32位的,而且是4字節(jié)對齊的。
  以上,CPU只是控制了一個硬件,led,但是我們知道,CPU是可以控制很多硬件的,那這又是怎么實現(xiàn)的了?這個就得談談片上互聯(lián)總線了。
                               
               
本文地址:http://m.qingdxww.cn/thread-160479-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內(nèi)容、版權和其它問題,我們將根據(jù)著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉(zhuǎn)USB橋接器以及基于CAN的主機和自舉程序應用程序
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發(fā)培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 貿(mào)澤電子(Mouser)專區(qū)

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠色丁香九九婷婷综合五月 | 欧美一区二区三区不卡 | 久久亚洲精品成人综合 | 国产成人午夜极速观看 | 老师邪恶影院a啦啦啦影院 老师让我她我爽了好久老 老师感受到它在你里面了吗app | 国产91单男3p在线观看 | 精品视自拍视频在线观看 | 久草高清视频 | 国产成人亚洲精品播放器下载 | 67194最新网址 | 福利一区国产 | 网站免黄 | 99香蕉国产精品偷在线观看 | 色综合久久久久久久久五月 | 国产精品日本一区二区不卡视频 | 啦啦啦资源在线观看视频4 啦啦啦资源视频在线观看4 | 亚洲精品短视频 | 久草精品在线观看 | 日韩在线a视频免费播放 | 黄色欧美视频在线观看 | 精品视频免费观看 | 一级毛片一级黄片 | 91精品在线免费 | 久久精品亚洲一级毛片 | 色视频免费网站 | 国产中文字幕一区 | 妈妈的朋友 magnet | 四虎影视免费观看 | 热久久99影院 | 久久黑人 | 日日综合网 | 极品色综合 | 天天影视综合网色综合国产 | 日本岛国大片 | 9久久9久久精品 | 1024国产精品视频观看 | 久久精品视频网站 | 国产99视频在线观看 | 欧美人在线一区二区三区 | 丁香婷婷视频 | 色综合久久久久久久 |