---------------------------------------------
-- 建立人:ruo_xiao
1、該函式的功能是初步理解任務切換的本質,即:儲存當前任務所使用的暫存器(r4~r11)的值到記憶體,中斷或者異常服務例程執行完之後,再恢復中斷或者異常之前任務的暫存器的值,從而繼續執行該任務。
2、第8行~第13行**是當前任務所使用的暫存器儲存到記憶體。
3、第16行~第18行**,功能是更新棧指標,即:r1。這裡的r1相當於sp。
2、第8行:ldr r0, =blockptr
這裡blockptr相當於符號,該**的含義是將blockptr的位址傳給r0,即:r0 = &blockptr = 0x2000 0000 。
3、第9行:ldr r0, [r0]
該**的含義是r0 = *r0,也就是r0 = r0中的內容,即:r0 = blockptr = &(bolckptr->stackptr)= 0x2000 0008。
4、第10行:ldr r0, [r0]
該**的含義同上,即:r0 = bolckptr->stackptr = &stackbuffer[1024]= 0x20001018。
執行完該句,r0就指向了stackbuffer[1024]。
5、第13行:s***b r0!,
該**的含義是將r11~r4的值逐個儲存在stackbuffer[1023]~stackbuffer[1016]中,即:入棧。
過程如下:
r0 = r0 - 4 , 將r11壓入*r0中。
r0 = r0 - 4 , 將r10壓入*r0中。
r0 = r0 - 4, , 將r4壓入*r0中。
結果如下:
執行到這裡,就完成了將r4~r11入棧的使命。
6、第16行~17行,含義同第8行~第9行。
7、第18行: str r0, [r1]
該**的含義是將r0的值壓入*r1中,即:bolckptr->stackptr = r0 = 0x20000ff8。
這裡0x20000ff8是第13行執行完成之後,r0的值由0x2000 1018 - 0x0000 0020 (4*8的十六進製制) = 0x20000ff8。
8、第21~22行,相當於執行是其他任務,任務內容是r4 = r4 + 1,,r5 = r5 + 1。
9、第25行:ldmia r0!,
將r0所執行的記憶體中的資料依次壓入r4~r11中。
過程如下:
將*r0中的內容壓入r4中,r0 = r0 + 4;
將*r0中的內容壓入r5中,r0 = r0 + 4;
將*r0中的內容壓入r11中,r0 = r0 + 4;
執行完之後,r0中的內容恢復到0x2000 1018,即:指向了stackbuffer[1024]。過程同s***b相反
10、第28行:bx lr
異常返回。
整個函式執行完成之後,實現了儲存暫存器入棧,執行其他任務,彈棧恢復暫存器的值,從而完成任務切換功能。
(saw:game over!)
linux0 11任務切換switch to
define switch to n tmp asm cmpl ecx,current n t je 1f n t movw dx,1 n t xchgl ecx,current n t ljmp 0 n t cmpl ecx,last task used math n t jne 1f n t c...
第6周任務3
include include cmath using namespace std enum symmetricstyle 分別表示按x軸,y軸,原點對稱 class cpoint void distance cpoint p const 兩點之間的距離 一點是當前點,另一點為引數p void di...
第13周任務3
include using namespace std class shape class circle public shape virtual float area const private float radii float circle area const class rectangle...