Cortex M3 任務切換函式例項

2021-09-02 21:25:32 字數 1825 閱讀 9600

---------------------------------------------

-- 建立人: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...