日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cortex-M3 任务切换函数实例

發布時間:2024/10/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cortex-M3 任务切换函数实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
--------------------------------------------- -- 時間:2018-12-09 -- 創建人:Ruo_Xiao -- 郵箱:xclsoftware@163.com ---------------------------------------------

一、聲明

本人在“網易云課堂”報名了李述銅老師的《自己動手從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 任务切换函数实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。