單片機如何執行代碼命令,單片MCU內存如何分配?
發布時間:2017-06-30 責任編輯:susan
【導讀】單dan片pian機ji執zhi行xing程cheng序xu的de過guo程cheng,實shi際ji上shang就jiu是shi執zhi行xing我wo們men所suo編bian製zhi程cheng序xu的de過guo程cheng。即ji逐zhu條tiao指zhi令ling的de過guo程cheng。計ji算suan機ji每mei執zhi行xing一yi條tiao指zhi令ling都dou可ke分fen為wei三san個ge階jie段duan進jin行xing。即ji取qu指zhi令ling-----分析指令-----執行指令。
單片機執行指令過程詳解
取指令的任務是:根據程序計數器PC中的值從程序存儲器讀出現行指令,送到指令寄存器。
分析指令階段的任務是:將指令寄存器中的指令操作碼取出後進行譯碼,分析其指令性質。如指令要求操作數,則尋找操作數地址。
計算機執行程序的過程實際上就是逐條指令地重複上述操作過程,直至遇到停機指令可循環等待指令。
一yi般ban計ji算suan機ji進jin行xing工gong作zuo時shi,首shou先xian要yao通tong過guo外wai部bu設she備bei把ba程cheng序xu和he數shu據ju通tong過guo輸shu入ru接jie口kou電dian路lu和he數shu據ju總zong線xian送song入ru到dao存cun儲chu器qi,然ran後hou逐zhu條tiao取qu出chu執zhi行xing。但dan單dan片pian機ji中zhong的de程cheng序xu一yi般ban事shi先xian我wo們men都dou已yi通tong過guo寫xie入ru器qi固gu化hua在zai片pian內nei或huo片pian外wai程cheng序xu存cun儲chu器qi中zhong。因yin而er一yi開kai機ji即ji可ke執zhi行xing指zhi令ling。
下麵我們將舉個實例來說明指令的執行過程:

開機時,程序計算器PC變為0000H。然後單片機在時序電路作用下自動進入執行程序過程。執行過程實際上就是取出指令(取出存儲器中事先存放的指令階段)和執行指令(分析和執行指令)的循環過程。
例如執行指令:MOV A,#0E0H,其機器碼為“74H E0H”,該指令的功能是把操作數E0H送入累加器,0000H單元中已存放74H,0001H單元中已存放E0H。當單片機開始運行時,首先是進入取指階段,其次序是:
1.程序計數器的內容(這時是0000H)送到地址寄存器;
2.程序計數器的內容自動加1(變為0001H);
3.地址寄存器的內容(0000H)通過內部地址總線送到存儲器,以存儲器中地址譯碼電跟,使地址為0000H的單元被選中;
4.CPU使讀控製線有效;
5.在讀命令控製下被選中存儲器單元的內容(此時應為74H)送到內部數據總線上,因為是取指階段,所以該內容通過數據總線被送到指令寄存器。
至此,取指階段完成,進入譯碼分析和執行指令階段。
由於本次進入指令寄存器中的內容是74H(操作碼),以譯碼器譯碼後單片機就會知道該指令是要將一個數送到A累加器,而該數是在這個代碼的下一個存儲單元。所以,執行該指令還必須把數據(E0H)從存儲器中取出送到CPU,即還要在存儲器中取第二個字節。其過程與取指階段很相似,隻是此時PC已為0001H。指令譯碼器結合時序部件,產生74H操作碼的微操作係列,使數字E0H從0001H單元取出。
因為指令是要求把取得的數送到A累加器,所以取出的數字經內部數據總線進入A累加器,而不是進入指令寄存器。至此,一條指令的執行完畢。單片機中PC=0002H,PC在CPU每次向存儲器取指或取數時自動加1,單片機又進入下一取指階段。這一過程一直重複下去,直至收到暫停指令或循環等待指令暫停。CPU就是這樣一條一條地執行指令,完成所有規定的功能。
對於一款mcu來說,在性能描述的時候都會告訴sram,flash的(de)容(rong)量(liang)大(da)小(xiao),對(dui)於(yu)初(chu)學(xue)者(zhe)來(lai)說(shuo),也(ye)不(bu)會(hui)去(qu)考(kao)慮(lv)和(he)理(li)會(hui)這(zhe)些(xie)東(dong)西(xi),拿(na)到(dao)東(dong)西(xi)就(jiu)隻(zhi)用(yong)。其(qi)實(shi)不(bu)然(ran),這(zhe)些(xie)量(liang)都(dou)是(shi)十(shi)分(fen)重(zhong)要(yao)的(de),仔(zai)細(xi)想(xiang)想(xiang),代(dai)碼(ma)為(wei)什(shen)麼(me)可(ke)以(yi)運(yun)行(xing),代(dai)碼(ma)量(liang)是(shi)多(duo)少(shao),定(ding)義(yi)的(de)int、short等等類型的變量究竟是怎麼分配和存儲的,這些問題都和內寸有關係。
首先單片機的內存可以大小分為ram和rom,這裏就不再解釋ram和rom的區別了,我們可以將其等效為flash和sram,其中根據flash和sram的定義可得,flash裏麵的數據掉電可保存,sram中的並不可以,但是sram的執行速度要快於flash,可以將單片機的程序分為code(代碼存儲區)、RO-data(隻讀數據存儲區)、RW-data(讀寫數據存儲區)和ZI-data(零初始化數據區)。在MDK編譯器下可以觀察到在代碼中這4個量的值,如下圖1所示:
圖1:

其中code和RO-data存儲在flash中,所以兩者之和為單片機中flash需要分配給它們的空間大小(並且等於代碼所生成的.bin文件大小),另外RW-data和ZI-data存儲在sram中,同樣兩者之和為單片機中sram需要分配給它們的空間大小。
另外,我們必然會想到棧區(stack)、堆區(heap)、全局區(靜態區)(staTIc)、文字常量區和程序代碼區和上麵所介紹的code、RO-data等的關係。

1、棧區(stack):由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。 這些值是可讀寫的,那麼stack應該被包含在RW-data(讀寫數據存儲區),也就是單片機的sram中。
2、堆區(heap):一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。可以理解,這些也是被包含在單片機的sram中的。
3、全局區(靜態區)(staTIc):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束後由係統釋放。這些數據也是可讀可寫的,和stack、heap一樣,被包含在sram中。
4、文字常量區:常量字符串就是放在這裏的。這些數據是隻讀的,分配在RO-data(隻讀數據存儲區),則被包含在flash中。
5、程序代碼區:存放函數體的二進製代碼,可以想象也是被包含在flash,因為對於MCU來說,當其重新上電,代碼還會繼續運行,並不會消失,所以存儲在flash中。
綜上所述,MCU的內存分配基本如此,其中並沒有提到存儲空間所對應的flash和sram地址。
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 三星上演罕見對峙:工會集會討薪,股東隔街抗議
- 摩爾線程實現DeepSeek-V4“Day-0”支持,國產GPU適配再提速
- 築牢安全防線:智能駕駛邁向規模化應用的關鍵挑戰與破局之道
- GPT-Image 2:99%文字準確率,AI生圖告別“鬼畫符”
- 機器人馬拉鬆的勝負手:藏在主板角落裏的“時鍾戰爭”
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
鑒頻器
江蘇商絡
交流電機
腳踏開關
接觸器接線
接近開關
接口IC
介質電容
介質諧振器
金屬膜電阻
晶體濾波器
晶體諧振器
晶體振蕩器
晶閘管
精密電阻
精密工具
景佑能源
聚合物電容
君耀電子
開發工具
開關
開關電源
開關電源電路
開關二極管
開關三極管
科通
可變電容
可調電感
可控矽
空心線圈

