最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

單片機是什么?它是怎樣執(zhí)行程序的?

2021-06-20 15:35 作者:想啥_做啥  | 我要投稿

單片機(Micro Control Unit):全稱微型控制單元,簡稱單片機(MCU),從字面意思我們可以了解到,它就是一個微型的計算機系統(tǒng)。然后我們下面通過對比來了解下它為什么時一個微型計算機系統(tǒng)。


電腦主板

? ? ?我們首先來看下我們熟悉的電腦主板,可能有人會問,我是來學(xué)單片機的,你給我介紹主板干嘛?我們這里是用主板來做一個類比,我們看了上面一大堆東西,估計很多人用了很長時間的也不知道單片機和代碼是怎么回事。

? ? ?我這里找了一張電腦主板的電路框圖,這個是比較老的一個主板,DDR2內(nèi)存的,從下面框圖中我們大概可以看到大的板塊包括CPU,北橋,南橋;其中南橋下面主要掌管著這些低速設(shè)備USB,PCI,SATA,BIOS等外設(shè)。


電腦主板實物
電腦主板原理框圖

手機"CPU"

? ? ?這里CPU之所以加了引號是因為CPU指的是中央處理單元,而我們手機的處理器不僅僅只有中央處理功能。這是2021年5月最新版的聯(lián)發(fā)科天璣900處理器,我們再看下左邊的介紹,有CPU,GPU,5G和WIFI模組,還有人工智能APU;對比下主板是不是發(fā)現(xiàn)有什么共同點。沒錯,手機處理器將這些外設(shè)全部集成到一個芯片里面去了,其實像現(xiàn)在最新CPU也是朝著這個方向做的,目前已經(jīng)有很多CPU把顯卡集成進去了。

? ?那么我們可以思考一下,我其實并不需要電腦CPU和手機處理器這么強悍的性能和諸多功能,我只要控制個I/O、串口通信等。那些不要的東西給它裁剪掉,加上簡單的計算單元,然后把它的可靠性提高,你說可以不?答案肯定是可以的,這也代表著我們思考的問題跟這些計算機科學(xué)家思考的問題是一致的????。我們接著往下看。

聯(lián)發(fā)科天璣處理器

單片機內(nèi)部組成

? ? ?我們看下圖中在校期間和教科書上用的最多的51單片單片機,同樣包含CPU(8051內(nèi)核),SRAM(內(nèi)存)可憐的1K,閃存(硬盤)也只有區(qū)區(qū)的幾十K,然后外圍的模塊基本就是下載代碼用的ISP,EEPROM,看門狗,復(fù)位模塊,串口模塊,中斷模塊,基本輸入輸出I/O模塊。

? ?STC89C52RC內(nèi)部框圖? ? ?
PIC16單片機內(nèi)部框圖
MSP430單片機內(nèi)部框圖
典型的STM32內(nèi)部框圖

因為單片機主要應(yīng)用在一些對價格比較敏感的領(lǐng)域,所以這類單片機種類也比較多,像51是我們常用的單片機,主要應(yīng)用的場合有數(shù)碼家電(洗衣機,電飯鍋,電磁爐,微波爐),工業(yè)現(xiàn)場數(shù)據(jù)采集與傳輸?shù)?,但是隨著它的價格優(yōu)勢下降和易上手程度,慢慢的市場被32位單片機被取代,我們看下圖大家熟知的STM32是不是感覺比51單片機的內(nèi)部結(jié)構(gòu)復(fù)雜很多,51單片機有的外設(shè)它都有,并且這些模塊更強大的;51單片機沒有的模塊它也有,調(diào)試功能模塊,RTC模塊,USB模塊,CAN總線模塊,ADC,SPI,I2C等等 。

? ? ?我們再來看下MCU與人的一個對比,CPU相當(dāng)于是人的大腦,用來處理來自各個模塊的信息,然后I/O輸出就相當(dāng)于人的手,CPU+RAM+FLASH相當(dāng)于人的大腦,I/O輸入和A/D則相當(dāng)于人的皮膚和眼睛用來接收外界的溫度,圖像信息輸入;而串口、SPI、I2C等總線則相當(dāng)于耳朵和嘴巴的配合,一方面接收其它控制器發(fā)送過來的信息,另外一方面將要傳遞的信息發(fā)送出去。

單片機是如何工作的?


先舉一個例子:我們要住酒店,我們是通過什么來找到你要住哪個位置的,是的,那就是房間號,這個房間號是酒店預(yù)先編好的。然后我們通過唯一的房間號,可以找到這個房間;如果這是我們的公司,我們每個大的房間里面都是一些職能小組在里面辦公,然后我們的項目管理員接受到領(lǐng)導(dǎo)的指令后,就不斷的去每個房間找相應(yīng)的職能部門來完成任務(wù)。

? ? ?那么我們單片機也一樣,我們所有的外設(shè)都是掛在單片機的可以訪問的地址上,我們要對單片機進行預(yù)先定義地址,不然我們就找不到哪個設(shè)備對應(yīng)那個地址,也就沒辦法操作。其實單片機地址是我們虛構(gòu)出來的,為了便于實際使用中的方便而已。

CPU是如何執(zhí)行程序的?

1、我們先來看下兩位全加器

A = 01B = 1H

B = 11B = 3H

A + B = 1 + 3 = 4 = 100B

Proteus仿真文件:

鏈接:https://pan.baidu.com/s/18HpW-4B-JH5bCi1ejWVjkA?

提取碼:zn8f?

2位全加器

為了方便更多比特位的運算,我們使用內(nèi)部集成8個全加器芯片74283來運算

DATA1 = 0000 0101B = 5H

DATA2 = 0000 1010B = 10H

SUM ? ?= 0000 1111B = 15H

Proteus仿真文件:

鏈接:https://pan.baidu.com/s/11GWChNuA5jYWqUWm2LJDWQ?

提取碼:kjp0?

8位全加器

2、那么數(shù)字電路是如何進行加減乘除運算的?

注意:我們這里不考慮一些特殊的情況,我們8位數(shù)最大能表示的數(shù)為255,所以只考慮數(shù)值小于255的情況,更深入的探討大家可以去尋找更專業(yè)的資源學(xué)習(xí)。

加法運算:

假設(shè)我們要進行8+13運算:

十進制運算:8+13= 21;

二進制運算:0000 1000 + 0000 1101 ?= 00010101;

我們通過8位全加器來驗證下

減法運算:

? ? ?加法是進位,減法需要考慮的則是借位,小學(xué)時對加減法的經(jīng)驗是這樣的,但是計算機不是這么處理的。計算機只有加法,沒有減法。那么 int a = b - c 是怎么得出來結(jié)果的呢?首先要了解一個概念——補碼。

? ? ?計算機中對于有符號數(shù),用最高位作為符號位,“0” 代表 “+” ,“1” 代表 “負號-” ;其余數(shù)位用作數(shù)值位,代表數(shù)值。比如 Byte 類型的取值范圍為 -128 ~ 127。其中,表示數(shù)值的只有 7 位,首位表示正負。

? ?補碼規(guī)定,正數(shù)和 0 的補碼就是其原碼(原碼、反碼的定義這里就不多贅述),負數(shù)的補碼是其正數(shù)的原碼取反再加 1 。

舉個例子,求負 -10 的補碼:十進制 10 的原碼(按 8 位舉例)為 0000 1010,其反碼為 1111 0101,取反后再加 1 即為其補碼1111 0110。因此,負10 的補碼為 1111 0110。

不知道寫到這里,大家有沒有發(fā)現(xiàn)什么端倪?我們再回到減法計算來,a = b - c 實際上等同于a = b + ( -c )。

情形1,減數(shù)>被減數(shù)

  • 12 - 5= 0000 1100 + 1111 1011= (1)0000 0111= 7 括號里為進位,因為只有 8 位,所以高于 8 位的進位要去掉。

  • (-5 )二進制: 000 0101;

  • 反碼:1111 1010;

  • 補碼 = 反碼+1:1111 1011

  • 最終通過加入反相電路和加1電路得到的最終結(jié)果,進位去掉后為0000 0111換算成10近制就是7

情形2,減數(shù)>被減數(shù)

  • 再來計算下7 - 9= 0000 0111 + 1111 0111= 1111 1110= -2

  • (-9)二進制:0000 1001,

  • 反碼:1111 0110,

  • 補碼:1111 0111

  • 然后得到的是負數(shù),我們又要把它反回來

  • 補碼-1:1111 1110-1 = 1111 1101

  • 反碼反過來:0000 0010

  • 0000 0111 + 1111 1101

通過這兩個例子是不是就清楚了計算機是如何計算減法的了?


乘法運算:

通過說減法,我們是不是對乘法也有一定的啟發(fā)了呢?乘法其實就是循環(huán)的加法。比如 5 * 3 實際上就是 5 + 5 + 5。貌似就說完了。實際上不僅僅如此的?,F(xiàn)在有一個電子器件叫做乘法器,其可以實現(xiàn)二進制的乘法、除法等運算。我們同樣以 5 * 3 做為例子,講解一下乘法器計算乘法的流程。

  • 5 * 3 = 0000 0101 ?* ?0000 0011

  • 第一步:5 + 5 = 10

  • 00000 0101 + 0000 0101 = 0000 1010

  • 第二步:10 + 5 = 15

  • 0000 0101 + 0000 1010 = 0000 1111

小提示:當(dāng)然也可以通過移位電路來運輸也是可以的,這里就不舉例子了

? ? ?雖然CPU中有乘法器,但是我們發(fā)現(xiàn)實際的最終操作流程還是加法和位移操作計算的乘法運算。我們寫的代碼中的乘法到底是用乘法器運算還是轉(zhuǎn)化成加法運算,我們也并不太確定,有些編譯器編譯的時候會對代碼進行優(yōu)化,選取最優(yōu)的一種算法來計算結(jié)果。


除法運算:

除法可以通過減法來實現(xiàn),比如 10 / 3 等價于 10 一直減 3 直到被減數(shù)小于 3 ,減了 3 次,那么 10 / 3 的結(jié)果就為 3 了,余數(shù)為減完剩下的值 1 。

其實上面已經(jīng)提到了乘法器,除法的原理同樣也類似(這里不說浮點數(shù)的除法,只說整數(shù)的除法),但是稍微復(fù)雜一點。

同樣我們舉個例子來說明一下。

  • 10 / 3 = 000 1010 / 0000 0011

  • 第一步:10 - 3 = 7

  • 000 1010 - 0000 0011 = 0000 0111

  • 第二步:7 - 3 = 4

  • 0000 0111 - 0000 0011 = 0000 0100

  • 第三步:4 - 3 = 1,通過比較大小,不能再繼續(xù)減下去。

  • 0000 0100 - 0000 0011 = 0000 0001

小提示:這里只是展示其中一種除法運算,大家可以去思考其他方式的除法運算,比如說使用移位方式。

然后我們再來看一個完整的CPU計算電路

感興趣的小伙伴可以參考下面這個鏈接:

http://www.buthowdoitknow.com/but_how_do_it_know_cpu_model.html

這里面包含有完整的8位與運算電路,或運算電路,右移運算電路,左移運算電路,還有加法運算電路等,我們實際運算的時候就通過取到的指令通過內(nèi)部解碼來決定當(dāng)前操作是進行加法操作,還是移位操作,又或是對外部I/O進行鎖存操作。


然后這里面我們發(fā)現(xiàn)復(fù)雜的運算會產(chǎn)生中間數(shù)據(jù),比如說乘法,除法,要計算好幾次才能得到結(jié)果,所以我們就需要寄存器來臨時存儲這些數(shù)據(jù),這樣我們就可以計算了。


單片機執(zhí)行整個程序流程分解



我們以這個代碼為例來詳細講解下。

我們再來看下匯編指令,我們的程序從main函數(shù)開始執(zhí)行


小提示:我們的單片機默認都是跳轉(zhuǎn)到main函數(shù)處執(zhí)行

第一步:取指令

C:0x0019 C280

PC計數(shù)器指向讀取指令的地址,然后存儲到指令寄存,通過指令解碼器解碼后輸送給運算單元,執(zhí)行相應(yīng)操作. 示例:我們的單片機程序一般都是直接跳轉(zhuǎn)到main函數(shù),這時PC = 0x0019地址里面的指令是C280


第二步:解碼

CLR LED(0x80.0)

? ?指令寄存器中的指令通過譯碼電路進行譯碼,然后CPU根據(jù)譯碼的結(jié)果來執(zhí)行加減乘除,移位等操作,示例:通過譯碼器電路我們得知C280代表的意思是C2表示清除位指令



第三步:執(zhí)行

? ?在執(zhí)行階段會根據(jù)指令的類型,將算數(shù)/邏輯單元(ALU)用于不同的目的。對其他指令,它會作為一個加法器來計算增加或減少棧指針,或者計算有效地址,或者只是簡單地加0,將一個輸入傳遞到輸出

示例:這里相當(dāng)于是清除0x80的第0位,也就是將P0.0置低,然后PC更新PC的值,沒有對PC值進行操作的話,它就自動累加這里自動累加后是0x001B,然后繼續(xù)第一步循環(huán)操作就完成了我們整個程序的一個執(zhí)行。

這里只是給出大致的程序執(zhí)行方式,省略了很多細節(jié)操作,大家可以進一步參考更詳細的程序執(zhí)行過程。


晶振在單片機中是起什么作用?


上面的運算,我們都是通過手動的方式來進行的, 我們知道數(shù)字電路本身是不工作的,它也不能工作,否則電路就會出亂子,它必須依賴其它電路產(chǎn)生的高低電平才能驅(qū)動它工作,我們把這種有規(guī)律的高低電平定為脈沖,單片機也是數(shù)字電路,它又是怎么工作的?我們必須要有一個能源源不斷產(chǎn)生脈沖的電路,它才能持續(xù)不斷的工作下去,這也就是晶振在單片機電路中為什么被稱作為“心臟”的原因,我們把這個“心臟”去掉,相應(yīng)的整個單片機系統(tǒng)也會罷工。

? ? ?為什么有些單片機沒有晶振?我們知道單片機工作只要有持續(xù)不斷的脈沖輸入就行,我們有些場合對單片機沒有精確的時間要求,所以一般使用內(nèi)部自帶的振蕩器為單片機提的時鐘脈沖也能確保單片機正常工作,所以在有些地方我們就看不到晶振。那是因為內(nèi)部自帶了RC振蕩電路。

復(fù)位:CPU執(zhí)行程序需要有一個初始狀態(tài),通過復(fù)位可以進入到一個初始狀態(tài)。這樣單片機知道自己的起始位置,它才能按照既定的方式運行程序。

單片機是什么?它是怎樣執(zhí)行程序的?的評論 (共 條)

分享到微博請遵守國家法律
宜川县| 犍为县| 五常市| 武定县| 南华县| 镇赉县| 万载县| 鄂托克旗| 临洮县| 凤城市| 揭西县| 泸水县| 铁岭县| 普定县| 交口县| 卢湾区| 陆川县| 政和县| 卢龙县| 惠东县| 鹤峰县| 高陵县| 柳林县| 天长市| 五原县| 灌阳县| 宜川县| 澎湖县| 耿马| 凤山县| 台南县| 庆云县| 吴旗县| 咸阳市| 通榆县| 兴仁县| 静乐县| 东明县| 宣汉县| 银川市| 吕梁市|