《Cortex-M0權(quán)威指南》之體系結(jié)構(gòu)---??臻g操作
掃描二維碼
隨時(shí)隨地手機(jī)看文章
??臻g作為一種存儲(chǔ)器使用機(jī)制,是“先入先出”的結(jié)構(gòu),在系統(tǒng)空間中用作臨時(shí)數(shù)據(jù)的存儲(chǔ)。棧空間操作的關(guān)鍵之一為棧指針寄存器,每次執(zhí)行棧操作時(shí),棧指針的內(nèi)容會(huì)自動(dòng)移動(dòng)。在M0處理器中,棧指針為R13(SP),而且物理上存在兩個(gè)棧指針,MSP,PSP,但每次只會(huì)使用一個(gè),由CONTROL寄存器以及處理器的運(yùn)行狀態(tài)決定。
向棧中存入數(shù)據(jù)叫“壓棧”(使用PUSH指令),回復(fù)數(shù)據(jù)叫“出?!保ㄊ褂肞OP指令)。根據(jù)架構(gòu)不同,有些處理器壓棧后地址增加,有些地址減小。Cortex-M0操作基于“滿遞減”的棧模型,意味著棧指針始終指向??臻g最后一個(gè)數(shù)據(jù),在執(zhí)行存儲(chǔ)數(shù)據(jù)PUSH前,棧指針先減小。
PUSH和POP通常用在函數(shù)或子程序的開(kāi)始和結(jié)尾處。在函數(shù)開(kāi)始執(zhí)行時(shí),PUSH操作將寄存器的當(dāng)前內(nèi)容存入棧,執(zhí)行結(jié)束前,POP又將棧空間的數(shù)據(jù)恢復(fù)。一般來(lái)說(shuō)執(zhí)行PUSH操作也要執(zhí)行POP操作,否則恢復(fù)的數(shù)據(jù)可能無(wú)法對(duì)應(yīng)之前的寄存器,這樣導(dǎo)致無(wú)法預(yù)測(cè)的結(jié)果,比如棧溢出。
棧操作的最小單位是4字節(jié)(32位),Cortex-M0的??臻g被設(shè)計(jì)位字對(duì)齊,地址必須是4的整數(shù)倍。由于這個(gè)原因,棧指針的最低兩位BITS[1:0]在硬件上被置為0,因此讀書(shū)也為0.
MSP用于普通程序,在由操作系統(tǒng)時(shí),內(nèi)核使用主棧指針MSP,用戶使用進(jìn)程棧指針PSP。
MSP的初始化位于程序空間的開(kāi)頭部分,PSP沒(méi)有進(jìn)行初始化定義,它需要通過(guò)軟件初始化。