Cortex-M3 任务切换函数实例
一、聲明
本人在“網易云課堂”報名了李述銅老師的《自己動手從0到1寫嵌入式操作系統》課程,《內核編程實踐》這堂課中講解了任務切換的基本方法。對于核心函數“PendSV_Handler”的自己的理解我將記錄在下面,由于該課程是付費課程,該工程的源碼我覺得不能隨便貼上,故只在這里粘貼必要的“PendSV_Handler”的源碼,以供自己記錄和該課程的學員參考,本人不會將該博客用于商業用途。如若我有侵權行為請告知,我會及時刪除該篇文章。
二、源碼
三、功能
1、該函數的功能是初步理解任務切換的本質,即:保存當前任務所使用的寄存器(R4~R11)的值到內存,中斷或者異常服務例程執行完之后,再恢復中斷或者異常之前任務的寄存器的值,從而繼續執行該任務。
2、第8行~第13行代碼是當前任務所使用的寄存器保存到內存。
3、第16行~第18行代碼,功能是更新棧指針,即:R1。這里的R1相當于SP。
四、解釋
1、開始執行該函數時,各個變量的地址及內容如下:
blockPtr? ? ? ? ? ? ? ? ? ?地址:0x2000 0000? ,?內容 : 0x2000 0008
blockPtr->stackPtr? 地址 :0x2000 0008? ,?內容 :0x2000 1018
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行:STMDB ? R0!, {R4-R11}
該代碼的含義是將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!, {R4-R11}
將R0所執行的內存中的數據依次壓入R4~R11中。
過程如下:
將*R0中的內容壓入R4中,R0 = R0 + 4;
將*R0中的內容壓入R5中,R0 = R0 + 4;?
……
將*R0中的內容壓入R11中,R0 = R0 + 4;
執行完之后,R0中的內容恢復到0x2000 1018,即:指向了stackBuffer[1024]。過程同STMDB相反
10、第28行:BX ? ? ?LR
異常返回。
?
整個函數執行完成之后,實現了保存寄存器入棧,執行其他任務,彈棧恢復寄存器的值,從而完成任務切換功能。
?
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的Cortex-M3 任务切换函数实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用SVD求最小二乘刚性转置
- 下一篇: 使用strcat_s函数的注意事项