單片機(jī)的最小系統(tǒng)?內(nèi)部的主要結(jié)構(gòu)?
答:最小系統(tǒng):電源、晶振(為系統(tǒng)提供基本的時鐘信號)、復(fù)位電路;內(nèi)部結(jié)構(gòu):ROM/RAM、計時器、中斷、I/O串并行口、總線擴(kuò)展控制。
RAM和ROM的區(qū)別?
答:ROM(只讀存儲器):它的信息一次寫入后只能被讀出,而不能被操作者修改或者刪除。一般用于存放固定的程序或數(shù)據(jù)表格。但是,“只讀”這個概念有時候可以被一些新特性的器件顛覆。
RAM(隨機(jī)存儲器):它就是我們平時說的內(nèi)存,主要用來存放各種現(xiàn)場的輸入/輸出數(shù)據(jù)、中間計算結(jié)果,以及與外部存儲器交換信息,或者作堆棧(特點:先進(jìn)后出,后進(jìn)先出)用。它的存儲單元根據(jù)具體需要可以讀出或者改寫。
兩者區(qū)別:RAM只能用于暫時存放程序與數(shù)據(jù)。一旦電源關(guān)閉或發(fā)生斷電,RAM中的數(shù)據(jù)就會丟失。而ROM中的數(shù)據(jù)在電源關(guān)閉或者斷電后仍然會保留下來。
簡而言之:相同點它們都是用來存儲數(shù)據(jù)的
不同點存儲數(shù)據(jù)的方式與數(shù)據(jù)能不能在二次加工不同
單片機(jī)I/O口有什么作用?I/0口的驅(qū)動能力?上拉電阻與下拉電阻的作用?
答:I/O口最主要的功能用來與外部器件實現(xiàn)數(shù)據(jù)信息的交互、速度匹配、數(shù)據(jù)傳送方式和增強(qiáng)單片機(jī)的負(fù)載能力。它在兩者之間扮演橋梁的作用,單片機(jī)擁有著串行與并行接口。每個種類的單片機(jī)的不同并行口也有著各自不同的功能。
單片機(jī)輸出低電平時,將允許外部器件,向單片機(jī)引腳內(nèi)灌入電流,這個電流,稱為“灌電流”,外部電路稱為“灌電流負(fù)載”。
單片機(jī)輸出高電平時,則允許外部器件,從單片機(jī)的引腳拉出電流,這個電流,稱為“拉電流”,外部電路稱為“拉電流負(fù)載”。
單片機(jī)輸出驅(qū)動能力的問題:每個單個的引腳,輸出低電平的時候,允許外部電路,向引腳灌入的最大電流為 10 mA;每個 8 位的接口(P1、P2 以及 P3),允許向引腳灌入的總電流最大為 15 mA,而 P0 的能力強(qiáng)一些,允許向引腳灌入的最大總電流為26 mA;全部的四個接口所允許的灌電流之和,最大為 71 mA。而當(dāng)這些引腳“輸出高電平”的時候,單片機(jī)的“拉電流”能力呢?可以說是太差了,竟然不到 1 mA。
結(jié)論就是:單片機(jī)輸出低電平的時候,驅(qū)動能力尚可,而輸出高電平的時候,就沒有輸出電流的能力。
綜上所述:灌電流負(fù)載,是合理的;而“拉電流負(fù)載”和“上拉電阻”會產(chǎn)生很大的無效電流,并且功耗大。
設(shè)計單片機(jī)的負(fù)載電路,應(yīng)該采用“灌電流負(fù)載”的電路形式,以避免無謂的電流消耗。
在數(shù)字電路中,只有二種狀態(tài),要么是高電平,要么是低電平,在通電初期,這些輸出狀態(tài)是不確定的,為了使電路確定狀態(tài),必需使用上拉電阻或下拉電阻,使一個原來不確定電平變高的叫上拉電阻,否則就是下拉電阻,上拉電阻就是從電源上接一只電阻到這個狀態(tài)口上就可以了,(就是把高的電壓加到這個點上去,這個點的電位就高了)下拉電阻的接法,從這個狀態(tài)口接一只電阻到負(fù)極(或數(shù)字接地),因電路形式與類別不同,當(dāng)輸入端有信號,這種變化會反應(yīng)到輸出口,從輸出口得到了一個狀態(tài),本來應(yīng)該完成任務(wù)了,但這會兒輸入口已沒信號了,可輸出端還是這個狀態(tài)(這個人習(xí)慣不好,開門后總是不關(guān)門,加一只彈簧,(電阻)讓它自己關(guān)門,)這時候也要用到上下拉電阻,這里有復(fù)位的作用。
常見的時鐘電路有哪些?為什么要使用PLL?
答:先了解一下什么是時鐘電路?
時鐘電路就是產(chǎn)生像時鐘一樣準(zhǔn)確運(yùn)動的振蕩電路,任何工作都按時間順序。用于產(chǎn)生這個時間的電路就是時鐘電路。
組成:晶體振蕩器、晶震控制芯片和電容組成。
現(xiàn)在流行的串行時鐘電路有:DS1302、DS1307、PCF8485等
它們的特點:接口簡單、價格低廉、使用方便。
DS1302:具有涓細(xì)電流充電能力的電路,主要特點:采用串行數(shù)據(jù)傳輸,可為掉電保護(hù)電源提供可編程的充電功能,并且可以關(guān)閉充電功能。采用普通32.768KHz晶振。
PLL(PhaseLocked Loop):鎖相環(huán)電路。用來統(tǒng)一整合時脈訊號,使高頻器件正常工作。如:內(nèi)存的存取資料等。PLL用于振蕩器中的反饋技術(shù)。許多電子設(shè)備要正常工作,通常需要外部的輸入信號與內(nèi)部的振蕩信號同步。一般的晶振由于工藝與成本原因,做不到很高的頻率,而在需要高頻應(yīng)用時,有相應(yīng)的器件VCO,實現(xiàn)轉(zhuǎn)成高頻,但不穩(wěn)定,故利用鎖相環(huán)路就可以實現(xiàn)穩(wěn)定且高頻的時脈沖訊號。
什么是時脈:指同步電路中時鐘的基礎(chǔ)頻率,它以(若千次周期每秒)來度量,單位是(Hz)
總之:PLL可以同步頻率,相位正交。倍頻、變頻。
單片機(jī)的尋址方式有哪些?
答:80C51有七種尋址方式:
1、立即尋址,尋址空間為ROM;
2、直接尋址,尋址空間為片內(nèi)RAM的低128B和特殊功能寄存器;
3、寄存器尋址,尋址空間為A、B、DPTR、CY、通用工作寄存器等;
4、寄存器間接尋址,片內(nèi)RAM低128B、片外RAM;
5、相對尋址,尋址空間為ROM;
6、變址尋址,尋址空間為ROM;
7、位尋址,尋址空間為片內(nèi)RAM低128B的位尋址區(qū)的128個位,其字節(jié)地址為20H~2FH;以及部分可以位尋址的特殊功能寄存器。
參考:AT89C51單片機(jī)能直接認(rèn)識和執(zhí)行的機(jī)器指令有255條,有7種尋址方式,即立即尋址、直接尋址、寄存器尋址、寄存器間接尋址、變址尋址、相對尋址和位尋址。
1. 直接尋址:
指令中直接給出參與操作的數(shù)據(jù)的地址,該地址一般用direct表示。
匯編指令:MOV A,direct
該指令的功能是將片內(nèi)RAM地址direct單元中的內(nèi)容(參與操作的數(shù)據(jù))傳送到累加器A中,雙字節(jié)指令。
2. 立即尋址:
指令中直接給出參與操作的數(shù)據(jù),稱立即數(shù),用data表示。在匯編語言中,為標(biāo)明立即數(shù),為data加前綴”#”。立即數(shù)可以是8位和16位二進(jìn)制數(shù),分別用#data和#data16表示。
匯編語言指令:MOV A,#data
該指令將立即數(shù)data傳送到累加器A中,雙字節(jié)指令。
3. 寄存器尋址:
參與操作的數(shù)據(jù)存放在寄存器中,匯編指令中直接以寄存器名來表示參與操作的數(shù)據(jù)地址,寄存器包括工作寄存器R0~R7、累加器A、AB、數(shù)據(jù)指針DPTR和位運(yùn)算寄存器C。
匯編語言指令:MOV A,Rn ;n=0~7
該指令將Rn中的內(nèi)容傳送到累加器A中,單字節(jié)指令。
4. 寄存器間接尋址:
寄存器間接尋址為二次尋址,第一次尋址得到寄存器的內(nèi)容為(Ri)或(DPTR),第二次尋址是將第一次尋址得到的寄存器內(nèi)容作為地址,并在其中存、取參與操作的數(shù)據(jù)。匯編語言中,寄存器前綴@是寄存器間接尋址的標(biāo)志,有@Ri、@DPTR等。
匯編語言指令:MOV A,@Ri ;i=0、1
該指令是將Ri中的內(nèi)容作為地址,再將該地址中的內(nèi)容傳送到累加器A中,單字節(jié)指令。
5. 變址尋址:
間接尋址由兩個寄存器提供。若由A、PC提供,在匯編語言指令中尋址地址表示為@A+PC;若由A和DPTR提供,在匯編語言指令中尋址地址為@A+DPTR。其中,PC或DPTR被稱為基址寄存器,A被稱為變址寄存器,基址與變址相加為16位無符號加法。若變址寄存器A中內(nèi)容加基址寄存器DPTR(或PC)中內(nèi)容時,低8位有進(jìn)位,則該進(jìn)位直接加到高位,不影響進(jìn)位標(biāo)志。因變址尋址指令多用于查表,故常稱為查表指令。
匯編語言指令:MOVC A,@A+DPTR
該指令將DPTR中的內(nèi)容加上A中的內(nèi)容作為地址,再將該地址中的內(nèi)容傳送到累加器A中,單字節(jié)指令。
6. 相對尋址:
相對尋址是以相對尋址指令的下一條指令的程序計數(shù)器PC的內(nèi)容為基值,加上指令機(jī)器代碼中的“相對地址”,形成新的PC值(要轉(zhuǎn)移的指令地址)的尋址方式。指令機(jī)器代碼中“相對地址”指的是用一個帶符號的8位二進(jìn)制補(bǔ)碼表示的偏移字節(jié)數(shù),其取值范圍為-128~+127,負(fù)數(shù)表示向后轉(zhuǎn)移,正數(shù)表示向前轉(zhuǎn)移。
若(PC)表示該指令在ROM中的首地址,該指令字節(jié)數(shù)為2,執(zhí)行時分兩步操作:(PC)←(PC)+2,(PC)←(PC)+相對地址。第一步完成后,PC中的值為該指令的下一條指令的首地址;第二步完成后,PC中的內(nèi)容(PC)為轉(zhuǎn)移的目標(biāo)地址。所以,轉(zhuǎn)移的目標(biāo)地址范圍是該相對尋址指令的下一條指令首址加上-128~—+127字節(jié)的地址。
匯編語言指令:SJMP rel
匯編語言相對尋址指令中的”rel”往往是一個標(biāo)號地址,表示ROM中某轉(zhuǎn)移目標(biāo)地址。匯編軟件對該匯編語言指令進(jìn)行匯編時,自動算出“相對地址”并填入機(jī)器代碼中,應(yīng)將”rel”理解為“帶有相對意義的轉(zhuǎn)移目標(biāo)地址”。
Rel=(PC)+相對尋址指令字節(jié)數(shù)+相對地址
其中,(PC)為該指令所在ROM中的首地址。
7. 位尋址:
參與操作的數(shù)據(jù)為“位”,而不是字節(jié),是對片內(nèi)數(shù)據(jù)存儲器RAM和SFR中可位尋址單元的位進(jìn)行操作的尋址方式。
匯編語言指令:ANL C,bit
該指令將bit(位地址)中的內(nèi)容(0或1)與C中的內(nèi)容進(jìn)行與操作,再將結(jié)果傳送到PSW中的進(jìn)位標(biāo)志C中。
什么是時鐘周期?機(jī)器周期?指令周期?它們之間的關(guān)系?
答:1、時鐘周期又叫做振蕩周期;單片機(jī)內(nèi)部時鐘電路產(chǎn)生(或外部時鐘電路送入)的信號周期,單片機(jī)的時序信號是以時鐘周期信號為基礎(chǔ)而形成的,在它的基礎(chǔ)上形成了機(jī)器周期、指令周期和各種時序信號。定義為時鐘脈沖的倒數(shù)(可以這樣理解:時鐘周期就是單片機(jī)外接晶振的倒數(shù),例如:12M的晶振,它的時鐘周期就是1/12us),是計算機(jī)中最基本的、最小的時間單位。在一個時鐘周期內(nèi),CPU僅完成一個最基本的動作。
2、計算機(jī)中,為了便于管理,常把一條指令的執(zhí)行過程劃分為若干個階段,每一個階段完成一項工作。例如:取指令、存儲器讀、存儲器寫等,這每一項工作稱為一個基本操作。完成一項基本操作所需要的時間成為機(jī)器周期。一般情況,一個機(jī)器周期由若干個S周期(狀態(tài)周期)組成。機(jī)器周期是單片機(jī)的基本操作周期,每個機(jī)器周期包含S1、S2、……S6這6個狀態(tài),每個狀態(tài)包含兩拍P1和P2,每個拍為一個時鐘周期(振蕩周期)。因此,一個機(jī)器周期包含12個時鐘周期。依次可表示為S1P1、S1P2、S2P1、S2P2……、S6P1、S6P2。
3、指令周期:計算機(jī)從取一條指令開始,到執(zhí)行完該指令所需要的時間稱為指令周期。不同的指令,指令長度不同,指令周期也不一樣。但指令周期以機(jī)器周期為單位,指令不同,所需的機(jī)器指令也不同。
51單片機(jī)指令根據(jù)指令長度與執(zhí)行周期分為:
1) 單字節(jié)單周期指令
2) 單字節(jié)雙周期指令
3) 雙字節(jié)單周期指令
4) 雙字節(jié)雙周期指令
5) 三字節(jié)雙周期指令
6) 一字節(jié)四周期指令
總結(jié):時鐘周期是最小單位,機(jī)器周期需要1個或者多個時鐘周期,指令周期需要1個或者多個機(jī)器周期;機(jī)器周期是指完成一個基本操作的時間。指令周期是CPU的關(guān)鍵指標(biāo),指取出并執(zhí)行一條指令的時間。一般以機(jī)器周期為單位,分單指令執(zhí)行周期、雙指令執(zhí)行周期等。機(jī)器周期是完成一個基本操作的時間單元。時鐘周期是CPU的晶振的工作頻率的倒數(shù)。
單片機(jī)有哪些接口,各模塊有哪些特性及應(yīng)用環(huán)境?
答:接口電路——用于銜接外設(shè)與總線,實現(xiàn)存儲空間擴(kuò)展、I/O口線擴(kuò)展、類型轉(zhuǎn)換(電平轉(zhuǎn)換、串并轉(zhuǎn)換、A/D轉(zhuǎn)換)、功能模塊、通信擴(kuò)展、總線擴(kuò)展等。
外圍設(shè)備——工作設(shè)備,連接在接口電路上,主要有輸出設(shè)備和輸入設(shè)備。
看門狗相關(guān)問題:
看門狗的原理?
答:工作原理:在系統(tǒng)運(yùn)行以后就啟動看門狗計數(shù)器,此時看門狗就開始自動計時,如果達(dá)到一定的時間還不去給它進(jìn)行清零,看門狗計數(shù)器就會溢出從而引起看門狗中斷,造成系統(tǒng)的復(fù)位。
為什么會溢出呢?
因為看門狗是一個計數(shù)器,而計數(shù)器位數(shù)有限。能夠裝的數(shù)值也就有限(比如8位的最多裝256個數(shù),16位的最多裝65536個數(shù)),從開啟看門狗那刻起,它就開始不停的數(shù)機(jī)器周期,數(shù)一個機(jī)器周期就計數(shù)器加1,加到計數(shù)器盛不下了(這就是溢出)就產(chǎn)生一個復(fù)位信號,重啟系統(tǒng)。
看門狗分為軟件看門狗和硬件看門狗,在什么情況下軟件看門狗失效?
答:硬件看門狗是利用一個定時器電路,其定時輸出連接到電路的復(fù)位端,程序在一定時間范圍內(nèi)對定時器清零,因此程序正常工作時,定時器總不能溢出,也就不能產(chǎn)生復(fù)位信號。如果程序出現(xiàn)故障,不在定時周期內(nèi)復(fù)位看門狗,就使得看門狗定時器溢出產(chǎn)生復(fù)位信號并重啟系統(tǒng)。
軟件看門狗原理上一樣,只是將硬件電路上的定時器用處理器的內(nèi)部定時器代替,這樣可以簡化硬件電路設(shè)計,但是在可靠性方面不如硬件定時器。
1、系統(tǒng)內(nèi)部定時器自身發(fā)生故障看門狗就會失效(當(dāng)然可以通過雙定時器相互監(jiān)視,成本高);
2、中斷系統(tǒng)故障導(dǎo)致定時器中斷失效。
3、整個程序死機(jī)。主程序出現(xiàn)異常。
什么時候喂狗?怎么喂狗?喂狗的注意事項?
答:在實際的單片機(jī)應(yīng)用系統(tǒng)中,到底選用哪種型號的看門狗,采用何種喂狗方式和看門狗連接方式以及在編程中喂狗命令應(yīng)該放在程序中什么位置,這要根據(jù)現(xiàn)場干擾源的特點、已采用的干擾措施、單片機(jī)硬件資源和軟件結(jié)構(gòu)特點以及對單片機(jī)系統(tǒng)的可靠性等具體情況而定。
看門狗一般應(yīng)用到程序的那些位置?
答: 一些重要的程序,必須讓它一直跑著;而且還要時時關(guān)心它的狀態(tài)——不能讓它出現(xiàn)死鎖現(xiàn)象。(當(dāng)然,如果一個主程序會出現(xiàn)死鎖,肯定是設(shè)計或者編程上的失誤。首要做的事是Debug。)但如果時間緊迫可以用軟件看門狗,暫時應(yīng)急。
喂狗命令放置位置:
定時中斷服務(wù)子程序中;
主程序中.
復(fù)位相關(guān)問題:
復(fù)位時單片機(jī)有什么動作?
答:主要做的就是初始化每個寄存器,包括最重要的PC指針,不包括RAM,然后單片機(jī)從復(fù)位地址開始執(zhí)行程序。
必須使RST引腳(9)加上持續(xù)兩個機(jī)器周期(即24個振蕩周期)的高電平。單片機(jī)就執(zhí)行復(fù)位操作。如果RST持續(xù)為高電平,單片機(jī)就處于循環(huán)復(fù)位狀態(tài)。
單片機(jī)有哪些復(fù)位源,什么情況下會導(dǎo)致各個復(fù)位源
答:
6個復(fù)位源
TM4C123GH6PM微控制器有6個復(fù)位源:
(1)上電復(fù)位(POR);
(2)外部復(fù)位輸入引腳有效(RST);
(3)掉電檢測可以用于由以下任一事件引起:① 低于BOR0,觸發(fā)值是BOR0的 最高電壓值;② 低于BOR1,觸發(fā)值是BOR1的最高 電壓值。
(4)軟件啟動復(fù)位(利用軟件復(fù)位寄存器);
(5)違反看門狗復(fù)位條件;
(6)MOSC故障。
STM8S共有9個復(fù)位源:
NRST引腳產(chǎn)生的外部復(fù)位
上電復(fù)位(POR)
掉電復(fù)位(BOR)
獨立看門狗復(fù)位
窗口看門狗復(fù)位
軟件復(fù)位
SWIM復(fù)位
非法操作碼復(fù)位
EMS復(fù)位:當(dāng)一些關(guān)鍵的寄存器被破壞或錯誤加載時產(chǎn)生的復(fù)位
所有的復(fù)位源最終都作用于NRST管腳,并在復(fù)位過程中保持低電平。復(fù)位入口向量在內(nèi)存映射中位于固定的地址6000h。
復(fù)位的兩種啟動方式?
答:1、上電復(fù)位:要求接通電源后,自動實現(xiàn)復(fù)位操作。
2、按鈕復(fù)位:要求接通電源后,單片機(jī)自動復(fù)位,并且在單片機(jī)運(yùn)行期間,使用開關(guān)也可以實現(xiàn)復(fù)位。
復(fù)位存在哪些問題?
答:采用上電復(fù)位:復(fù)位信號上電過程中有掉電現(xiàn)象,可能會造成邏輯方面的錯誤導(dǎo)致相關(guān)芯片復(fù)位時間不夠、二次復(fù)位等、從而不能夠正常工作起來。原因:產(chǎn)生的復(fù)位信號給了幾個芯片用,導(dǎo)致這個復(fù)位信號的負(fù)載壓力比較大,驅(qū)動能力不夠從而往下調(diào)電,此現(xiàn)象常常出現(xiàn)在RC復(fù)位上。
復(fù)位信號上電前有毛刺與復(fù)位信號上電時有毛刺,可能會造成邏輯方面的錯誤導(dǎo)致相關(guān)芯片復(fù)位時間不夠。方案:加大上拉電阻的阻值。
復(fù)位電路有哪些?那種比較好?
答:單片機(jī)復(fù)位電路主要有四種類型:
(1)微分型復(fù)位電路:
(2)積分型復(fù)位電路:
(3)比較器型復(fù)位電路:
比較器型復(fù)位電路的基本原理。上電復(fù)位時,由于組成了一個RC低通網(wǎng)絡(luò),所以比較器的正相輸入端的電壓比負(fù)相端輸入電壓延遲一定時間.而比較器的負(fù)相端網(wǎng)絡(luò)的時間常數(shù)遠(yuǎn)遠(yuǎn)小于正相端RC網(wǎng)絡(luò)的時間常數(shù),因此在正端電壓還沒有超過負(fù)端電壓時,比較器輸出低電平,經(jīng)反相器后產(chǎn)生高電平.復(fù)位脈沖的寬度主要取決于正常電壓上升的速度.由于負(fù)端電壓放電回路時間常數(shù)較大,因此對電源電壓的波動不敏感.但是容易產(chǎn)生以下二種不利現(xiàn)象:
1)電源二次開關(guān)間隔太短時,復(fù)位不可靠:
2)當(dāng)電源電壓中有浪涌現(xiàn)象時,可能在浪涌消失后不能產(chǎn)生復(fù)位脈沖。
為此,將改進(jìn)比較器重定電路,可以利用數(shù)字邏輯的方法和比較器配合,設(shè)計的比較器重定電路。此電路稍加改進(jìn)即可作為上電復(fù)位和看門狗復(fù)位電路共同復(fù)位的電路,大大提高了復(fù)位的可靠性。
(4)看門狗型復(fù)位電路.
看門狗型復(fù)位電路主要利用CPU正常工作時,定時復(fù)位計數(shù)器,使得計數(shù)器的值不超過某一設(shè)定的值;當(dāng)CPU不能正常工作時,由于計數(shù)器不能被復(fù)位,因此其計數(shù)會超過某一值,從而產(chǎn)生復(fù)位脈沖,使得CPU恢復(fù)正常工作狀態(tài)。此復(fù)位電路的可靠性主要取決于軟件設(shè)計,即將定時向復(fù)位電路發(fā)出脈沖的程序放在何處是最優(yōu)的設(shè)計。一般設(shè)計,將此段程序放在定時器中斷服務(wù)子程序中。然而,有時這種設(shè)計仍然會引起程序走飛或工作不正常。原因主要是:當(dāng)程序"走飛"發(fā)生時,定時器初始化以及開中斷之后的話,這種"走飛"情況就有可能不能由Watchdog復(fù)位電路校正回來.因為定時器中斷一真在產(chǎn)生,即使程序不正常,Watchdog也能被正常復(fù)位.為此提出定時器加預(yù)設(shè)的設(shè)計方法.即在初始化時壓入堆棧一個地址,在此地址內(nèi)執(zhí)行的是一條關(guān)中斷和一條死循環(huán)語句.在所有不被程序代碼占用的地址盡可能地用子程序返回指令RET代替.這樣,當(dāng)程序走飛后,其進(jìn)入陷阱的可能性將大大增加.而一旦進(jìn)入陷阱,定時器停止工作并且關(guān)閉中斷,從而使Watchdog復(fù)位電路會產(chǎn)生一個復(fù)位脈沖將CPU復(fù)位.當(dāng)然這種技術(shù)用于實時性較強(qiáng)的控制或處理軟件中有一定的困難。
由此可見,四種復(fù)位電路中,看門狗型復(fù)位電路較其他三中復(fù)位電路更加適合。
堆棧相關(guān)問題:
堆棧的原理?過程怎么操作?
答:單片機(jī)RAM中,常常會指定一個專門的區(qū)域來存放某些特別的數(shù)據(jù),它遵循先進(jìn)后出、后進(jìn)先出的原則。這個RAM區(qū)就是堆棧。堆棧是一種數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)項按序排列:堆,順序隨意。棧,后進(jìn)先出)。使用一個稱作堆棧指針的專用寄存器指示前的操作位置,堆棧指針總是指向棧頂。
操作過程:
1) 堆棧的建立(初始化)
2) 參數(shù)入棧(push)
3) 參數(shù)出棧(pop)(后進(jìn)先出)
堆棧應(yīng)用在什么地方?存在什么問題?怎么解決?
答:在80C51單片機(jī)中,堆棧在子程序調(diào)用和中斷時會把斷點地址自動進(jìn)棧和出棧。進(jìn)棧和出棧的指令(PUSH、POP)操作可用于保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。由于子程序調(diào)用和中斷都允許嵌套,并可以多級嵌套,而現(xiàn)場的保護(hù)也往往使用堆棧,所以一定要注意給堆棧以一定的深度,以免造成堆棧內(nèi)容的破壞而引起程序執(zhí)行的“跑飛”。
堆棧指針SP在80C51中存放當(dāng)前的堆棧棧頂所指存儲單元地址的一個8位寄存器。80C51單片機(jī)的堆棧是向上生成的,即進(jìn)棧時SP的內(nèi)容是增加的;出棧時SP的內(nèi)容是減少的。
系統(tǒng)復(fù)位后。80C51的SP內(nèi)容為07H。若不重新定義,則以07H為棧底,壓棧的內(nèi)容從08H單元開始存放。但工作寄存器R0~R7有4組,占有內(nèi)部RAM地址為00H~1FH,位尋址區(qū)占有內(nèi)部RAM地址為20H~2FH。若程序中使用了工作寄存器1~3組或位尋址區(qū),則必須通過軟件對SP的內(nèi)容重新定義,使堆棧區(qū)設(shè)定在片內(nèi)數(shù)據(jù)RAM區(qū)中的某一區(qū)域內(nèi)(如30H),堆棧深度不能超過片內(nèi)RAM空間。
學(xué)習(xí)堆棧的作用?
答:在片內(nèi)RAM中,常常要指定一個專門的區(qū)域來存放某些特別的數(shù)據(jù),它遵循順序存取和后進(jìn)先出(LIFO/FILO)的原則,這個RAM區(qū)叫堆棧。
1.子程序調(diào)用和中斷服務(wù)時CPU自動將當(dāng)前PC值壓棧保存,返回時自動將PC值彈棧。
2.保護(hù)現(xiàn)場/恢復(fù)現(xiàn)場
3.數(shù)據(jù)傳輸
也就是說,堆棧是進(jìn)入中斷的時候用到的,單片機(jī)一旦遇到中斷請求,就會去處理中斷,處理完后再回來處理主程序,這樣就涉及到了一個問題,單片機(jī)要保存中斷之前的信息,以便處理完后能夠回到主程序中,單片機(jī)會在響應(yīng)中斷前,把單片機(jī)現(xiàn)在的指針地址(也就是處理完要返回的地址),以及一些必要的數(shù)據(jù)壓入堆棧(沒有這些數(shù)據(jù),單片機(jī)處理完中斷后就無法確定主程序的狀態(tài))。
中斷相關(guān)問題:
中斷的響應(yīng)過程?優(yōu)先級?
答:1、響應(yīng)過程:
1)根據(jù)響應(yīng)的中斷源的中斷優(yōu)先級,使相應(yīng)的優(yōu)先級狀態(tài)觸發(fā)器置1;
2) 執(zhí)行硬件中斷服務(wù)子程序調(diào)用,并把當(dāng)前程序計數(shù)器PC的內(nèi)容壓入堆棧,保護(hù)斷點,尋找中斷源。
3) 清除相應(yīng)的中斷請求標(biāo)志位(串行口中斷請求標(biāo)志RI和TI除外);
4) 把被響應(yīng)的中斷源所對應(yīng)的中斷服務(wù)程序的入口地址(中斷矢量)送入PC,從而轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序。
5) 中斷返回,程序返回斷點處進(jìn)行執(zhí)行。
2、優(yōu)先級:中斷的優(yōu)先級有兩個:查詢優(yōu)先級與執(zhí)行優(yōu)先級
查詢優(yōu)先級:查詢優(yōu)先級是不可以更改和設(shè)置的
1)系統(tǒng)默認(rèn)的優(yōu)先級(邏輯上):
外部中斷0 > 定時器中斷0 > 外部中斷1 > 定時器中斷1 > 串行中斷
2)由IP寄存器來決定優(yōu)先級。當(dāng)IP對應(yīng)位置為1時,該中斷級別提高。同為1是按默認(rèn)級別
中斷嵌套的好處與壞處?
答:中斷嵌套:CPU在處理級別較低的中斷過程中,出現(xiàn)了級別較高的中斷請求。CPU停止執(zhí)行低級別中斷,執(zhí)行高級別的中斷處理程序后,再接著執(zhí)行低級別的未被處理完的中斷程序。
使用中斷嵌套可以使高優(yōu)先級別的中斷得到及時的響應(yīng)和處理。
1) CPU與外部設(shè)備并行工作
2) 能夠處理例外事件
3) 實現(xiàn)實時處理
4) 實現(xiàn)人機(jī)聯(lián)系
5) 實現(xiàn)用戶程序與操作系統(tǒng)的聯(lián)系
6) 實現(xiàn)多道程序并行執(zhí)行
7) 在多處理機(jī)系統(tǒng)中,實現(xiàn)處理機(jī)之間的聯(lián)系
壞處:高級別的中斷一直持續(xù)的話會影響低級別中斷的處理。
中斷向量表的理解
答:中斷源的識別標(biāo)志,可用來形成相應(yīng)的中斷服務(wù)程序的入口地址或存放中斷服務(wù)程序的首地址稱為中斷向量。把所有的中斷向量集中起來,按中斷類型號從小到大的順序存放到存儲器的某一區(qū)域內(nèi),這個存放中斷向量的存儲區(qū)叫做中斷向量表,即中斷服務(wù)程序入口地址表。
中斷在單片機(jī)中起到什么作用?
答:中斷能實現(xiàn)快速的CPU與慢速的外設(shè)同步工作,實現(xiàn)數(shù)據(jù)傳送、故障檢測與處理、人機(jī)聯(lián)系、多機(jī)系統(tǒng)、多道程序分時操作、實時信息處理等。
其它:
什么是臨界段,哪些情況下會存在臨界段的問題,如何進(jìn)行臨界段保護(hù)。
答:1.臨界段代碼,也叫臨界區(qū),是指那些必須完整連續(xù)運(yùn)行,不可被打斷的代碼段。
2. ①讀取或者修改變量(特別是用于任務(wù)間通信的全局變量)的代碼,一般來說這是最常見的臨界代碼。
②調(diào)用公共函數(shù)的代碼,特別是不可重入的函數(shù),如果多個任務(wù)都訪問這個函數(shù),結(jié)果是可想而知的??傊?,對于臨界段要做到執(zhí)行時間越短越好,否則會影響系統(tǒng)的實時性。
3.中斷處理程序和任務(wù)都會訪問的臨界段代碼,需要使用關(guān)中斷的方法加以保護(hù);僅由任務(wù)訪問的臨界段代碼,可以通過給調(diào)度器上鎖的方法來保護(hù)。
什么是可重入型函數(shù),使用時需要注意哪些問題
答:可重入函數(shù)
不為連續(xù)的調(diào)用持有靜態(tài)數(shù)據(jù)。
不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。
使用本地數(shù)據(jù),或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護(hù)全局?jǐn)?shù)據(jù)。
如果必須訪問全局變量,記住利用互斥信號量來保護(hù)全局變量。
絕不調(diào)用任何不可重入函數(shù)。
注意事項:
1 :編寫可重入函數(shù)時,應(yīng)注意局部變量的使用(如編寫C/C++ 語言的可重入函數(shù)時,應(yīng)使用auto 即缺省態(tài)局部變量或寄存器變量)
說明:編寫C/C++語言的可重入函數(shù)時,不應(yīng)使用static局部變量,否則必須經(jīng)過特殊處理,才能使函數(shù)具有可重入性。
2 :編寫可重入函數(shù)時,若使用全局變量,則應(yīng)通過關(guān)中斷、信號量(即P 、V 操作)等手段對其加以保護(hù)
說明:若對所使用的全局變量不加以保護(hù),則此函數(shù)就不具有可重入性,即當(dāng)多個進(jìn)程調(diào)用此函數(shù)時,很有可能使有關(guān)全局變量變?yōu)椴豢芍獱顟B(tài)。
專用詞匯解釋:
VCC:C=circuit 表示電路的意思, 即接入電路的電壓;
VDD:D=device 表示器件的意思, 即器件 內(nèi)部的工作電壓;
對于數(shù)字電路來說,VCC是電路的供電電壓,VDD是芯片的工作電壓(通常Vcc>Vdd),VSS是接地點;有些IC既有VDD引腳又有VCC引腳,說明這種器件自身帶有電壓轉(zhuǎn)換功能。
VEE:發(fā)射極電源電壓, Emitter Voltage, 一般用于 ECL 電路的負(fù)電源電壓.
VSS:S=series 表示公共連接的意思,通常是指電路公共接地端電壓。
VPP:不同芯片對Vpp的定義稍有不同,比如電壓峰峰值,單片機(jī)中Vpp多數(shù)定義為編程電壓
在場效應(yīng)管(或COMS器件)中,VDD為漏極,VSS為源極,VDD和VSS指的是元件引腳,而不表示供電電壓。一般來說VCC=模擬電源,VDD=數(shù)字電源,VSS=數(shù)字地,VEE=負(fù)電源