A. c語言竟是如何調用硬體
大家都知道我們可以使用C語言寫一段程序來控制硬體工作,但你知道其工作原理嗎?以下僅供參考!
c語言在實際運行中,都是以匯編指令的方式運行的,由編譯器把C語言編譯成匯編指令,CPU直接執行匯編指令。
所以這個問題就變成,匯編指令是如何操作硬體的?
如果把硬體平台限制在x86環境下,那麼匯編指令操作硬體基本上只有兩種方式:
方式一:
通過向內存空間寫數據。硬體會把硬體上的各種寄存器(外行可以理解為訪問硬體的介面或者操作硬體的工具)映射到某一塊內存地址空間上,之後只要用匯編指令,甚至C語言去讀寫這一段內存地址空間(並非真正操作物理內存),就可以達到操作硬體的目的了。
如果題主還有WindowsXP環境(虛擬機也可以),就可以用匯編指令直接操作顯存:
MOV AX,B800
MOV ES,AX
XOR DI,DI
MOV CX,0800
MOV AX,5555
REPZ STOSB
硬體的各種寄存器會被映射到某一塊物理內存中,這種方式稱為MMIO,在Windows的設備管理器里,右鍵點設備,看屬性-》資源里,不少硬體設備都有「內存范圍」的參數,這里的內存范圍就表示這個硬體的資源可以通過訪問這一段內存來控制它。
方式二:
x86匯編中,還有兩個特殊的指令是IN和OUT,這是x86平台上獨有的,上面圖里的I/O范圍,就是用IN/OUT這兩個指令來訪問和控制的。
以上兩種訪問硬體的方式,第一種是可以用C語言實現的,上面一段匯編,本質上類似於C語言代碼:
char ptr = 0xB8000;
int i;
for (i = 0; i 《0x800; i++)
{ptr + i = 0x55;
}
第二種IN/OUT方式沒有直接的C語言語法對應,需要自己封裝匯編。
那麼為什麼平時很難用C語言操作硬體呢?這是因為平時寫的代碼大多數都在保護模式下,保護模式下,直接訪問物理地址會受到限制,C語言操作的地址都是虛地址。
對於Windows來說,要訪問物理地址,需要工作在內核模式,也就是的寫驅動才行。
而在顯存方面,首先,題主要先明白物理地址和虛擬地址的概念。
原來的8086cpu設計的時候,地址空間有一塊區域(640K-1M)之間,有一塊作為顯存使用
這里你說的預留的地址,是指物理地址,這一段地址的准確范圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理內存地址一直都保留給顯存使用,不區分32位還是64位,也不區分保護模式還是實模式。
可見這一段內存至今仍然是留給顯卡使用的。
那麼現在為什麼不能直接用這段內存了?
因為現在的軟體都運行在保護模式下,訪問的地址都是虛擬地址,而並非物理地址,包括你使用cmd命令打開的環境,都是虛擬地址,雖然32位XP里能用debug命令向000B8000上寫數據並能顯示在cmd的界面里,但本質上,這都是虛擬出來的。
如果要想用這段顯存怎麼辦?
自己寫一個簡易的操作系統,不啟動顯卡的各種圖形加速功能,CPU進入保護模式後在GDT里映射一個4G的數據段,與物理地址一致,那麼向000B8000上寫數據,就會像過去DOS一樣顯示在屏幕上,所以保護模式下也可以訪問這一段內存。所以,保護模式下,也可以用它。
顯卡那麼多顯存是怎麼映射的?
有很多內存地址被映射給顯存了,就是通過這種映射關系,把一些物理地址留給顯存,使得CPU能像訪問內存一樣訪問顯存資源。
當然,實際情況是,2G顯存未必完全映射,而是只映射一部分地址,顯卡有一些開放的寄存器能夠控制哪部分顯存映射過來,這樣就能使得CPU在使用比較少的物理地址范圍的情況下,訪問全部的顯存。
還有一個很有意思的事情:在虛擬機里,找到映射的高地址部分的第一塊內存區域,寫一個能直接訪問物理地址的程序(比如一個驅動),去讀這一塊內存,然後寫到文件里,再用屏幕截圖,也寫到文件里,會發現截圖的內容和顯存里讀出來的內容基本上是一樣的。
網友awayisblue
要回答你的問題,我們需要要知道:
硬體是一種什麼樣的存在
什麼是驅動。
C語言怎麼操作硬體
我就不嚴格去定義這些概念了,我就以一個例子來通俗地講解一下吧。
首先講硬體:
先介紹一款單片機晶元STM8。
這款晶元裡面有cpu, 內存,寄存器(先不要覺得看到新名詞壓力大,繼續往下看)等等,相當於我們的電腦了,但還要外接其它硬體。
這里你需要知道的概念是:
晶元的引腳跟寄存器是相對應的,寄存器是8位的內存單元(對,存在於內存上面),當你往這個內存單元裡面寫入數據時,晶元的引腳的電壓會發生變化,比如說我寫入的是01100001,則晶元上與之對應的8個引腳的電壓狀態(分為高電平與低電平兩種)會輸出:低高高低低低低高。
cpu可以執行代碼指令,指令可以操作內存。
結論:所以從上面兩點可以我們可以知道,cpu可以執行指令,使晶元的引腳電平(電壓)發生變化。
關於這款顯示器,我們需要知道的是:
它是有引腳的,這些引腳可以跟到前面介紹的那款單片機晶元的引腳相連。
該顯示器有自帶的內存,用於存儲要顯示的字元,顯示器從該內存裡面讀取字元來來顯示。
單片機晶元與該顯示器相連後,可以通過引腳往該顯示器的內存里寫數據(通過多個引腳電平的高低不同來代表不同的數據,比如說:低高高低低低低高 代表01100001,這個數據寫在顯示器的.內存裡面,被顯示器所顯示,當然,會根據ASCII來顯示數字對應的字元,01100001對應的字元是『a』),除了接收數據的引腳外,還有控制顯示器的引腳(這個我們會在驅動那裡介紹,繼續往下看)。
結論:單片機晶元與顯示器相連,可以通過引腳輸出的電平來控制顯示器的字元顯示。
那麼,綜合上面,也就是說,單片機晶元cpu可以通過執行指令來控制顯示器的字元顯示。
而這里,題主所說的硬體,指的就是這個顯示器了。
接下來講驅動:
那麼,什麼是驅動呢?驅動無非就是硬體跟軟體的中間層,但我們不糾結這種關系,直接來看一下,對於我們這個例子,驅動指的是什麼。首先我們要知道:
顯示器支持很多種操作,比如說清除顯示,游標移動,讀取數據,寫數據等等。
這些操作數據引腳和控制引腳來實現。
引腳可以通過單片機晶元來控制。
結論:我們可以通過在單片機晶元裡面寫顯示器的「驅動」程序來屏蔽掉硬體(顯示器硬體)層。
於是這里驅動程序,指的是顯示器所支持操作的程序表示。比如說清除顯示,我們可以編寫一個clear()函數,游標移動,我們編寫一個move_cursor()函數,讀取數據和寫數據分別為read()和write(),然後分別實現就可以了(通過向寄存器里寫數據的形式,進而控制引腳的電平變化,再而控制顯示器,這個過程前面已有介紹)。這些函數就是驅動程序了。為什麼上面說驅動程序可以屏蔽掉硬體呢?因為程序員可以使用前面的驅動程序來直接操作顯示器(硬體),而不用知道太多關於硬體的事情,而一般的驅動程序也可以由廠家來提供。
再說明一點:一般這些驅動程序可以用匯編寫(出於運行效率的考慮),也可以用C語言來編寫的,比如說我上面的例子,就可以直接用C語言來編寫。當然C語言內聯匯編的形式也可以。
最後講C語言怎麼操作硬體:
相信到這里,C語言是怎麼操作硬體的已經比較明白了。
這里總結一下:
C語言由CPU運行(實際上是先編譯成機器碼存在晶元裡面然後執行),可以去操作內存。
內存里有一段是跟寄存器相對應的,而寄存器是跟晶元的引腳相對應的,於是操作該段內存就能控制晶元引腳的電壓變化。
硬體(比如說顯示器)有引腳(或者說排線,這些也是一樣的東西),這些引腳跟晶元的引腳相連可以接受晶元的控制。
可以把對某個硬體的操作做成一系列操作函數,這些操作函數就是驅動程序了。
於是我們的C語言只要去調用這個驅動程序就可以直接操作硬體了。(當然驅動程序也可以由C語言來編寫,所以C語言操作硬體並不一定要經過驅動程序)。
B. c語言運行所需要硬體配置
能裝操作系統的電攜穗圓腦就行。
有些單片機也是用C語言編程的,不過現在的單片機一般也比族敬九十年代初的8086好多了。所以現在只要是電腦辯塌,能裝上操作系統,就能運行C語言。
你可以安裝Linux或者BSD,系統自帶C語言編譯器和程序編輯器,很低配置的硬體都能用C語言編程。
C. C語言是怎麼操控硬體的
操作系統在 BIOS(基本輸入輸出系統,一般是電腦主板上的一塊 ROM 晶元)程序中提供了對電腦中各種硬體設備,如顯示卡、軟盤、硬碟、串、並口、內存等的底層控製程序,C 語言中如果要直接操作硬體一般通過直接調用這些 BIOS 程序來實現,很少有人繞過BIOS程序直接操控硬體,當然那樣做也是可以的,只不過你必須是硬體的高高手,知道如何具體去控制它。
D. c語言可以直接對硬體操作嗎
害,這個問題怎麼說呢,操作系統才是直接對硬體進行操作的,如果操作系統使用C語言編寫,那麼宏觀上看上去就變成了C語言對硬體進行了操作,但用戶編程的c語言程序是不可以直接對硬體進行操作的,必須調用操作系統提供的服務才可以對硬體進行操作,比如printf函數.
E. C語言可以直接對硬體進行操作嗎
不能。
首先,C語言不能夠直接對硬體進行操作。從本質上來說,連匯編語言都不可以。只有機器語言能夠直接操作硬體。
其次,C語言要操作硬體是必須經過一系列的編譯轉換。最終它會成為0101的機械碼,這個時候它根本不是我們所能夠理解的C語言了。
以GCC編譯器為例,這個可以分為四步。
第一步是預處理,包括語法檢查等工作。 gcc -P abc.c 第二步由源程序生產匯編語言代碼。 gcc -S abc.c 會生成abc.s文件,這個文件里就是匯編代碼。 第三步編譯器生成目標代碼,一個源文件生成一個目標代碼。 gcc -c abc.c 會生成abc.o 第四步連接器從目標代碼生成可執行文件。 gcc abc.o
最後,相對來說,C語言在高級語言當中是最貼近物理層面的語言。它也被稱作高級語言裡面的低級語言。因為它很多方面都非常貼近硬體。典型的就是指針,這是一種通過物理地址直接操作內存的變數。
F. 用C語言寫的程序怎麼與硬體聯系起來
通過串口和單片機就能聯系起來了! 你的計算器實現的功能是按鍵加減乘除等等 單片機上有按鍵,只要你編程沒錯 接上之後就可以了 然後做成實物需要買板子以及電阻之類的器件焊接而成,最後把程序拷到單片機里 就可以了! 對了,我覺得你可以買本這方面的書當參考,不用別的書 大學工科類單片機教材就可以的!
G. 如何將C語言與硬體結合起來
C語言和硬體結合,必須是可編程晶元了,嵌入式ARM ,單片機 ,DSP的底層都是用C語言編程
H. C語言是如何控制硬體的
首先,以下寫的東西不是復制粘貼,我會給你詳細的介紹、
1,要知道,計算機的發展規律是離硬體越來越遠,離人類的自然語言越來越近。為什麼這么說呢。
計算機語言的發展是:機器語言,匯編語言,高級語言,第四代語言,和自然語言。。
對於機器語言,只能識別二進制。而二進制就是0和1.0和1代表的是開關。比如1代表關閉,0代表打開。那麼每一台進算計的開關都不一樣,也就是硬體都不一樣,所以機器語言沒有移植性。
對於匯編語言,就是把機器語言用助記符來代替。比如,機器語言,如果是個8位的,11001010,都很難記。更別說16位的了。那麼用助記符來代替他們,會容易些。比如用add,表示加,那麼不用記那麼長的數了。其他的兩者並沒有什麼太大的區別。也沒有移植性。
對於高級語言,就是C語賣蘆言,他具有很強的可移植性腔配旦。因為他有專門的編譯器。可以把C語言編譯成機器語言。所以對於高級語言,只有在編譯的時候才去操宗硬體。
比如:
#include
void main()
{
int a;
a=20;
printf("a=%d\n",a);
}
這里,定義一個a是一個整型,那麼硬體就分配給他4個位元組或者8個位元組(不同的軟體不一樣),那麼這個就是一個硬體操縱。當然只有在編譯的時候才對硬體進行操縱。
這也說明其可移植性強。因為對每一台電腦都可以這樣下指令的。
再往後的第四代語言,就是面向問題的語言了。就是指需要告訴電腦需要怎麼做,不需要告訴電腦應該怎麼做,離硬體更遠了。因為你只需要讓a等於20,但不需要告訴電腦分配給a幾個位元組,電腦自己會搞定的。
對於自然語言就是人類自己的語言了,更不需要操縱硬體了。
其實C語言可是說是一種中級語言,既有匯編的優勢,也有高級語言的優勢。
像我學的單片機,用C控制流水燈伍擾的亮滅。就是直接通過C的操縱單片機的P1口引腳來進行的。有空你可以了解下。
I. c語言是不是編程 編程又跟硬體系統有關系嗎
c語言譽虛哪是編慶碼程語言, 需要用到VC++編程軟體來進行編寫程序的過程才是編程。
編程和硬體系統沒有太大關系,前提 可以完美運譽腔行編程軟體既可。
J. 計算機硬體描述語言(VHDL)與編程語言(C語言)的區別及關系,
計算機硬體描述語言(VHDL)與編程語言(C語言)的區別及關系,
首先說VHDL:它是描述電路的計算機工具,早期的CPLD等器件是基於與-或陣列的,更容易說明這點,VHDL是描述電路行為的,當下載到器件後,它就是具體的電路,這個電路全由與-或陣列組成。後期的FPGA也一樣,只是它是基於查找表的。再說C語言:我們可以認為它是用於控制特定電路的工作。我們都知道可以C編程的控制器都有程序存儲器,它裡面就存放了C編譯後的二進制代碼。而VHDL里下載後根本就不需要這個存放程序的地方。
硬體描述語言與高級編程語言有何區別?
用途不一樣
VHDL等硬體描述語言主要用於CPLD、FPGA的大規模可編程邏輯器件
而C語言等高級編程語言主要用於計算機等方面
軟體編程語言和硬體描述語言的差別?
verilog hdl 的程序燒到晶元里會影響晶元里的電路結構吧~ C編譯成機器碼以後一般都是在通用計算機上跑~這個問題很大有點不知道從何說起,老衲盡力了
VHDL硬體描述語言和匯編語言有什麼關系嗎?
做單片機方面,匯編語言是必學的,雖然單片機編程所用的大部分是C語言!
VhdL語言是針對FPGA和CPLD的硬體描述語言,兩者沒多大共同點,是針對兩個不同領域的語言!
學習單片機後,你辯茄可以往ARM和DSP方向發展!現在電子的一個大方向
你也可以單獨學習VHDL,將FPGA學懂,那麼你就是兼顧電子兩大類的最尖端人才了!
VHDL代碼是標準的硬體描述語言這句話怎樣理解?何謂硬體描述語言?
VHDL說簡單點 就是你用你心裏面想的話去描述電路 讓CPLD /FPGA去實現 是用來描述電路的 所以說叫硬體描述語言 自己的理解 希望能幫到你
VHDL硬體描述語言的延遲語句是什麼?
VHDL每一條語句最終生成的是一堆電路,記得是一堆實實在在的電路,不是生成一堆來執行什麼功能的程序 所以不存在什麼延時問題,所謂的延時,只是輸入到輸出的延時,執行語句的耗時那是不存在這種說法的
現在學硬體描述語言,VHDL好還是Verilog好
初學者我感覺因為有C語言基礎,Verilog的話比較容易上手,語法比較像。但是不要因此而輕視它,有些地方是初學者很難理解的比如阻塞式賦值和非阻塞式賦值等。
誰能介紹一下"硬體描述語言VHDL"?
硬體描述語言HDL是一種用形式化方法描述數字電路和系統的語言。利用這種語言,數字電路系統的設計可以從上層到下層(從抽象到具體)逐層描述自己的設計思想,用一系列分層次的模塊來表示極其復雜的數字系統。然後,利用電子設計自動化(EDA)工具,逐層進行模擬驗證,慧灶謹再把其中需要變為實際電路的模塊組合,經過自動綜合工具轉換到門級電路網表。接下去,再用專用集成電路ASIC或現場可編程門陣列FPGA自動布局布線工具,把網表轉換為要實現的具體電路布線結構。
目前,這種高層次(high-level-design)的方法已被廣泛採用。據統計,目前在美國矽谷約有90%以上的ASIC和FPGA採用硬體描述語言進行設計。
硬體描述語言HDL的發展至今已有20多年的歷史,並成功地應用於設計的各個階段:建模、模擬、驗證和綜合等。到20世紀80年代,已出現了上百種硬體描述語言,對設計自動化曾起到了極大的促進和推動作用。但是,這些語言一般各自面向特定的設計領域和層次,而且眾多的語言使用戶無所適從。因此,急需一種面向設計的多領域、多層次並得到普遍認同的標准硬體描述語言。20世紀80年代後期,VHDL和Verilog HDL語言適應了這種趨勢的要求,先前基後成為IEEE標准。
現在,隨著系統級FPGA以及系統晶元的出現,軟硬體協調設計和系統設計變得越來越重要。傳統意義上的硬體設計越來越傾向於與系統設計和軟體設計結合。硬體描述語言為適應新的情況,迅速發展,出現了很多新的硬體描述語言,像Superlog、SystemC、Cynlib C++等等。究竟選擇哪種語言進行設計,整個業界正在進行激烈的討論。因此,完全有必要在這方面作一些比較研究,為EDA設計做一些有意義的工作,也為發展我們未來的晶元設計技術打好基礎
可編程硬體描述語言主要包括哪倆種
VHDL和Verilog HDL
VHDL:
功能強大、設計靈活
支持廣泛、易於修改
強大的系統硬體描述能力
獨立於器件的設計、與工藝無關
很強的移植能力
易於共享和復用
Verilog HDL:Verilog來自C 語言,易學易用,編程風格靈活、簡潔,使用者眾多,特別在ASIC領域流行;
在VHDL硬體描述語言中,architectures的功能是什麼?
architecture是定義的結構體,定義了實體後就需要定義結構體