[計(jì)算機(jī)]綜述+任務(wù)堆棧初始化過(guò)程分析_第1頁(yè)
[計(jì)算機(jī)]綜述+任務(wù)堆棧初始化過(guò)程分析_第2頁(yè)
[計(jì)算機(jī)]綜述+任務(wù)堆棧初始化過(guò)程分析_第3頁(yè)
[計(jì)算機(jī)]綜述+任務(wù)堆棧初始化過(guò)程分析_第4頁(yè)
[計(jì)算機(jī)]綜述+任務(wù)堆棧初始化過(guò)程分析_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、. 窗體頂端 綜述+任務(wù)堆棧初始化過(guò)程分析2010-10-27 03:40轉(zhuǎn)載自 likunyuan最終編輯 chiefsniper首先在看本文時(shí)有以下幾個(gè)知識(shí)點(diǎn)需要了解:1、為什么我要把工作模式切換在管理模式呢?答:根據(jù)第二版的ARM體系結(jié)構(gòu)參考手冊(cè),我們可以查看到在用戶模式和系統(tǒng)模式下,使用LDM指令時(shí),會(huì)導(dǎo)致對(duì)不可預(yù)知的錯(cuò)誤。但是在IAREWARM環(huán)境下,對(duì)系統(tǒng)初始化時(shí),是默認(rèn)將ARM切換到系統(tǒng)模式的,因此在uCOS-II啟動(dòng)時(shí),我們默認(rèn)的將系統(tǒng)切換到管理模式下工作。這樣就可以避免了在使用LDM指令時(shí)產(chǎn)生不可預(yù)知的錯(cuò)誤了。2、著重強(qiáng)調(diào)一下在OS_CPU_A.A中匯編指令中的BX指令,為什

2、么要強(qiáng)調(diào)呢?答:根據(jù)第二版的ARM體系結(jié)構(gòu)參考手冊(cè),在ARM體系的T變種版本4、ARM體系版本5及其以上版本。BX指令把通用寄存器Rm中的值拷貝到PC,同時(shí)判斷拷貝后的PC寄存器的第0位值是否是1,如果第0位的值是1,則將當(dāng)前處理器切換到Thumd指令集下進(jìn)行執(zhí)行。3、此處再講解一下向PC寄存器寫(xiě)操作的注意事項(xiàng),為什么要強(qiáng)調(diào)呢?答:根據(jù)第二版的ARM體系結(jié)構(gòu)參考手冊(cè),我們可知,在向該寄存器進(jìn)行寫(xiě)操作時(shí)會(huì)導(dǎo)致程序跳轉(zhuǎn)到寫(xiě)入PC寄存器的地址處進(jìn)行執(zhí)行。在ARM指令集必須要求是字對(duì)齊的,那么寫(xiě)入PC寄存器的值得最低2位就必須為0;在Thumd指令集下必須是半字對(duì)齊的,那么寫(xiě)入PC寄存器的值得最低1位

3、就必須是0;ARM體系的版本較多,在ARM體系版本3及其以下版本,在ARM指令下寫(xiě)入PC寄存器的最低2位是被忽略了的(也就是說(shuō)是由硬件實(shí)現(xiàn)PC = PC&0xFFFFFFFC操作)在ARM體系版本4及其以上版本,在ARM指令下寫(xiě)入PC寄存器的最低2位值是必須為0的,這部分是必須軟件完成的,即:在將地址寫(xiě)入PC之前,必須將地址的值與0xFFFFFFFC進(jìn)行與操作,再將操作的結(jié)果傳遞給PC寄存去。在Thumd指令集下要求所有指令為半字對(duì)齊,因此寫(xiě)入PC寄存器的值必須先與0xFFFFFFFE進(jìn)行與操作,然后再將與操作的結(jié)果傳遞給PC寄存器。4、特別提到大家注意一下LDM指令。為什么呢?答:該

4、指令只能在ARM指令集中,在Thumd指令集中是沒(méi)有該指令的。在查看到ARM+Architecture+Reference+Manual(2nd+Edition)手冊(cè)后,會(huì)發(fā)現(xiàn)對(duì)于LDM的操作有如下操作,用示意性代碼表示如下:If 條件滿足Address = start_addressFor( I = 0 ; I <= 14 ; i+)If (register_list = 1)Ri = Memoryaddress,4;Address += 4 ;If(register_list15 = 1)value = memoryaddress,4;If( ARM體系5版本及其以上版本)PC =

5、value & 0xFFFFFFFET bit = Value0 ;ElsePC = value&0xFFFFFFFCAddress = address + 4 ;上面的示意性代碼意思就是說(shuō),如果LDM的目的操作數(shù)包含PC寄存器的話,寫(xiě)入PC寄存器的值得最后一位路過(guò)時(shí)1的話,執(zhí)行完畢LDM指令后,處理器就會(huì)切換到Thumd模式。本次分析所使用到的資料或書(shū)籍如下:1、ARM+Architecture+Reference+Manual(2nd+Edition)2、ARM體系結(jié)構(gòu)與編程-杜春蕾3、嵌入式實(shí)時(shí)操作系統(tǒng)COS-II(第二版)-邵貝貝翻譯4、ARM® IAR As

6、sembler Reference Guide5、IAR Embedded Workbench IDE User Guide6、IAR C/C+ Development Guide Compiling and linking 7、LPC2103的datasheet8、ARM and Thumb-2 Instruction Set Quick Reference Card9、Thumb 16-bit Instruction Set Quick Reference Card10、ARM7TDMI-S Technical Reference Manual轉(zhuǎn)自Tony嵌入式論壇,地址:文中所示代碼下載

7、:(稍后提供)下面先探討一下LPC2103這個(gè)芯片的堆??臻g。我們?cè)诮⒃擁?xiàng)目之前,就對(duì)編譯器設(shè)置了該工程的endian mode為little。Endian模式不清楚的就去查查ARM體系結(jié)構(gòu)與編程,這里就不多說(shuō)了。在以ARM7TDMI-S為內(nèi)核的ARM芯片,其堆棧增長(zhǎng)方向是由高地址向低地址增長(zhǎng)。因此我們給每個(gè)任務(wù)分配的堆棧也必須按照這樣的方式進(jìn)行“push”和“pop”操作。即可這樣理解:1、當(dāng)我們?cè)谌蝿?wù)堆棧上執(zhí)行類似的“push”操作時(shí),首先將所需保存的數(shù)據(jù)壓入到堆棧中,然后再對(duì)“任務(wù)的SP寄存器的值“-4。(這里-4的偏移量是因?yàn)槲业恼麄€(gè)移植代碼都是在ARM指令集下進(jìn)行的所以偏移量的設(shè)置

8、是4);2、當(dāng)我們?cè)谌蝿?wù)堆棧上執(zhí)行類似的“pop“操作時(shí),首先將堆棧中的數(shù)據(jù)彈出堆棧,然后再對(duì)”任務(wù)的SP寄存器的值“+4。(這里+4的偏移量是因?yàn)槲业恼麄€(gè)移植代碼都是放在ARM指令集下進(jìn)行的,所以偏移量的設(shè)置是4);任務(wù)堆棧的初始化過(guò)程分析一、OSTaskStkInit函數(shù)好了,現(xiàn)在就可以進(jìn)行我們的代碼移植分析了。首先是對(duì)任務(wù)堆棧的初始化工作,代碼如下:#define ARM_MODE_ARM 0x00000000#define ARM_MODE_THUMB 0x00000020#define ARM_SVC_MODE_THUMB (0x00000013L + ARM_MODE_THUMB)

9、#define ARM_SVC_MODE_ARM (0x00000013L + ARM_MODE_ARM)OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)OS_STK *stk;INT32U task_addr;opt= opt;stk= ptos;task_addr = (INT32U)task & 1;*(stk)= (INT32U)task_addr;/PC*(-stk)= (INT32U)0x14141414L;/R14*(-stk)= (INT32U

10、)0x12121212L;/R12*(-stk)= (INT32U)0x11111111L;/R11*(-stk)= (INT32U)0x10101010L;/R10*(-stk)= (INT32U)0x09090909L;/R9*(-stk)= (INT32U)0x08080808L;/R8*(-stk)= (INT32U)0x07070707L;/R7*(-stk)= (INT32U)0x06060606L;/R6*(-stk)= (INT32U)0x05050505L;/R5*(-stk)= (INT32U)0x04040404L;/R4*(-stk)= (INT32U)0x030303

11、03L;/R3*(-stk)= (INT32U)0x02020202L;/R2*(-stk)= (INT32U)0x01010101L;/R1*(-stk)= (INT32U)p_arg;/R0if (INT32U)task & 0x01) *(-stk) = (INT32U)ARM_SVC_MODE_THUMB; else *(-stk) = (INT32U)ARM_SVC_MODE_ARM;return (stk);現(xiàn)在一句一句來(lái)分析:1、opt= opt;stk= ptos;這兩句放到這里是沒(méi)有任何實(shí)際意義,只是為了防止編譯器報(bào)警;2、task_addr = (INT32U)ta

12、sk & 1;這一句可能很多人都不理解,干嘛還要對(duì)任務(wù)的地址&1呢?答:實(shí)際上任務(wù)的地址(就是調(diào)用函數(shù)的起始地址)是要在LDMFD寫(xiě)入到PC的,而對(duì)于LDM的操作,寫(xiě)入PC的最后1bit會(huì)影響到處理器是否切換到Thumd模式下的,我在這里將任務(wù)地址的最后1bit清0,是為了保證任務(wù)在ARM模式下進(jìn)行工作的。因?yàn)樵诓糠諥RM指令和Thumd指令混合編譯的情況下,可能會(huì)導(dǎo)致整個(gè)uCOS系統(tǒng)崩潰的。加上這一句就能很好的保證系統(tǒng)在進(jìn)行任務(wù)切換的時(shí)候,所有指令均能在ARM指令系統(tǒng)下工作。我說(shuō)了是不是大家就很清楚了呢?3、*(-stk)= (INT32U)0x14141414L;/R14很

13、多朋友可能會(huì)在這一句上有非常大的疑問(wèn)了,R14寄存器不是LR寄存器么?這個(gè)可以存儲(chǔ)子程序的返回地址或者是存儲(chǔ)分子語(yǔ)句的返回地址啊?怎么這里會(huì)對(duì)R14賦值成(INT32U)0x14141414L。這樣做會(huì)不會(huì)讓整個(gè)系統(tǒng)工作不正常???答:回答這個(gè)問(wèn)題,就要用uCOS對(duì)于任務(wù)的定義了,在uCOS處理機(jī)制中,所有的任務(wù)都是一個(gè)包含死循環(huán)的函數(shù),死循環(huán)中是根本就不會(huì)有返回地址的了,所以這里隨便寫(xiě)入一個(gè)值都不會(huì)影響到任務(wù)的正常運(yùn)行的。4、對(duì)R12和R1的初始化,大家可能又要問(wèn)了,干嘛這樣賦值啊?答:實(shí)際上對(duì)任務(wù)的初始化時(shí)在任務(wù)運(yùn)行之前進(jìn)行的,一個(gè)任務(wù)都還沒(méi)有運(yùn)行,他有怎么可能有影響R1到R12的值了,對(duì)于

14、這點(diǎn)大家可以想象一下一個(gè)前后臺(tái)的系統(tǒng)在程序剛開(kāi)始執(zhí)行的時(shí)候是否會(huì)需要使用到這些寄存器呢?所以初始化這些寄存器根本就不會(huì)對(duì)任務(wù)運(yùn)行有任何影響。5、*(-stk)= (INT32U)p_arg;這個(gè)是對(duì)R0寄存器的初始化。為什么要這樣做呢?相信熟悉IAREWARM的朋友可能會(huì)知道(當(dāng)然不知道的話,建議去做一個(gè)簡(jiǎn)單的測(cè)試程序),所有函數(shù)的第一個(gè)形式參數(shù)都是傳遞給R0的。P_arg就是我們建立的任務(wù)的第一個(gè)形參,盡管很多朋友在這個(gè)形參的設(shè)計(jì)上沒(méi)有使用到。注意:實(shí)際上MDK也是用R0作為函數(shù)的第一個(gè)形參壓棧處理的。6、對(duì)于最后的最后一個(gè)參數(shù)的初始化時(shí)對(duì)當(dāng)前任務(wù)運(yùn)行的異常模式和ARM或Thumd模式的一個(gè)壓入堆棧的操作。7、還有的朋友可能會(huì)問(wèn)道,怎么沒(méi)有看到對(duì)SP寄存器的保存呢?答:SP寄存器的保存實(shí)際是將SP寄存器的值保存到TCB的數(shù)據(jù)結(jié)構(gòu)中了,所以這里就不再需要對(duì)SP進(jìn)行重復(fù)保存了。在這個(gè)函數(shù)完成以后,任務(wù)的任務(wù)堆棧就像下面的方式建立了:低地址CPSRARM_SVC_MODE_ARM|R

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論