目錄1、關(guān)于時(shí)鐘周期、機(jī)器周期和指令周期2、堆棧相關(guān)3、臨界區(qū)你應(yīng)該知道的一切
1、單片機(jī)的時(shí)鐘周期是什么?機(jī)器周期?指令周期?它們之間是什么關(guān)系?
2、堆棧的工作原理是什么,都有什么操作流程?
3、什么是臨界區(qū),臨界區(qū)有什么用處?
解析:
1、關(guān)于時(shí)鐘周期、機(jī)器周期和指令周期
時(shí)鐘周期也稱(chēng)為振蕩周期,定義為時(shí)鐘脈沖的倒數(shù)(可以這樣來(lái)理解,時(shí)鐘周期就是單片機(jī)外接晶振的倒數(shù),例如12M的晶振,它的時(shí)間周期就是1/12 us),是計(jì)算機(jī)中基本的、小的時(shí)間單位。
在一個(gè)時(shí)鐘周期內(nèi),CPU僅完成一個(gè)基本的動(dòng)作。對(duì)于某種單片機(jī),若采用了1MHZ的時(shí)鐘頻率,則時(shí)鐘周期為1us;若采用4MHZ的時(shí)鐘頻率,則時(shí)鐘周期為250us。由于時(shí)鐘脈沖是計(jì)算機(jī)的基本工作脈沖,它控制著計(jì)算機(jī)的工作節(jié)奏(使計(jì)算機(jī)的每一步都統(tǒng)一到它的步調(diào)上來(lái))。顯然,對(duì)同一種機(jī)型的計(jì)算機(jī),時(shí)鐘頻率越高,計(jì)算機(jī)的工作速度就越快。但是,由于不同的計(jì)算機(jī)硬件電路和器件的不完全相同,所以其所需要的時(shí)鐘周頻率范圍也不一定相同。我們學(xué)習(xí)的8051單片機(jī)的時(shí)鐘范圍是1.2MHz-12MHz。
在8051單片機(jī)中把一個(gè)時(shí)鐘周期定義為一個(gè)節(jié)拍(用P表示),二個(gè)節(jié)拍定義為一個(gè)狀態(tài)周期(用S表示)。
機(jī)器周期
在計(jì)算機(jī)中,為了便于管理,常把一條指令的執(zhí)行過(guò)程劃分為若干個(gè)階段,每一階段完成一項(xiàng)工作。例如,取指令、存儲(chǔ)器讀、存儲(chǔ)器寫(xiě)等,這每一項(xiàng)工作稱(chēng)為一個(gè)基本操作。完成一個(gè)基本操作所需要的時(shí)間稱(chēng)為機(jī)器周期。一般情況下,一個(gè)機(jī)器周期由若干個(gè)S周期(狀態(tài)周期)組成。8051系列單片機(jī)的一個(gè)機(jī)器周期同6個(gè)S周期(狀態(tài)周期)組成。前面已說(shuō)過(guò)一個(gè)時(shí)鐘周期定義為一個(gè)節(jié)拍(用P表示),二個(gè)節(jié)拍定義為一個(gè)狀態(tài)周期(用S表示),8051單片機(jī)的機(jī)器周期由6個(gè)狀態(tài)周期組成,也就是說(shuō)一個(gè)機(jī)器周期=6個(gè)狀態(tài)周期=12個(gè)時(shí)鐘周期。
指令周期
指令周期是執(zhí)行一條指令所需要的時(shí)間,一般由若干個(gè)機(jī)器周期組成。指令不同,所需的機(jī)器周期數(shù)也不同。對(duì)于一些簡(jiǎn)單的的單字節(jié)指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執(zhí)行,不再需要其它的機(jī)器周期。對(duì)于一些比較復(fù)雜的指令,例如轉(zhuǎn)移指令、乘法指令,則需要兩個(gè)或者兩個(gè)以上的機(jī)器周期。
通常含一個(gè)機(jī)器周期的指令稱(chēng)為單周期指令,包含兩個(gè)機(jī)器周期的指令稱(chēng)為雙周期指令。
2、堆棧相關(guān)
堆棧是內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域,用來(lái)保存一些臨時(shí)的數(shù)據(jù),比如,可以保存中斷指令I(lǐng)NT中的標(biāo)志寄存器值、代碼段寄存器CS值、指令指針寄存器IP值;還可以用以RET指令從中可以得到返回的地址;堆棧還可以保存其他的數(shù)據(jù)等等。
在匯編語(yǔ)言中堆棧操作由PUSH、POP兩條指令來(lái)完成。它的操作數(shù)均為子類(lèi)型[兩個(gè)字節(jié)]進(jìn)行操作。
程序內(nèi)存可以分為:堆區(qū)、棧區(qū)、全局區(qū)、程序代碼區(qū)、文字常亮區(qū)。在一個(gè)程序編譯完后,已經(jīng)為全局變量、靜態(tài)變量分配好內(nèi)存空間,所以在函數(shù)運(yùn)行的時(shí)候,程序內(nèi)存要為局部變量非配好棧空間,當(dāng)中斷來(lái)時(shí),也需要把函數(shù)指針入棧,用來(lái)保護(hù)當(dāng)前的情況(保護(hù)現(xiàn)場(chǎng)),以便于中斷處理完之后可以再回到之前的函數(shù)。
棧是從高到低的分配或者說(shuō)先進(jìn)后出(就像子彈夾),堆是從低到高的分配(就是先到先買(mǎi),后到后買(mǎi))。在一般的交談中我們所說(shuō)的堆棧默認(rèn)為棧(子彈夾)。然而,堆棧可以分為硬堆棧和軟堆棧,硬堆棧就是SP(stack pointer棧頂元素的下一個(gè)位置,所以數(shù)據(jù)入棧的時(shí)候,SP先加1,再壓入數(shù)據(jù),出棧時(shí),數(shù)據(jù)先出,然后SP再減1),軟堆棧就是在硬堆棧和全局變量區(qū)之間的空間。
3、臨界區(qū)你應(yīng)該知道的一切
1.臨界段代碼,也叫臨界區(qū),是指那些必須完整連續(xù)運(yùn)行,不可被打斷的代碼段。
2. 讀取或者修改變量(特別是用于任務(wù)間通信的全局變量)的代碼,一般來(lái)說(shuō)這是常見(jiàn)的臨界代碼。
調(diào)用公共函數(shù)的代碼,特別是不可重入的函數(shù),如果多個(gè)任務(wù)都訪問(wèn)這個(gè)函數(shù),結(jié)果是可想而知的??傊?,對(duì)于臨界段要做到執(zhí)行時(shí)間越短越好,否則會(huì)影響系統(tǒng)的實(shí)時(shí)性。
3.中斷處理程序和任務(wù)都會(huì)訪問(wèn)的臨界段代碼,需要使用關(guān)中斷的方法加以保護(hù);僅由任務(wù)訪問(wèn)的臨界段代碼,可以通過(guò)給調(diào)度器上鎖的方法來(lái)保護(hù)。