91视频丝瓜-91视频完整版高清-91视频网-91视频网店-91视频网或将从此无大神-91视频网入口

您好,歡迎訪問上海現易電子元器件有限公司網站!

021-51870898
021-51870898   18019251567
4新聞資訊
您的位置: 首頁 ->  新聞資訊 -> 嵌入式

?高手帶你深入理解ucos任務堆棧

文章出處:嵌入式 責任編輯:上海現易電子元器件有限公司 發表時間:2020-11-10

首先,我們來理解一下兩個概念:


1、堆棧就是一段連續的空間。用于存儲數據的,在c計算機中有很多應用,比如發生中斷時保存現場,c語言函數調用時保存現場和臨時變量。


2、堆棧指針就是一個數據指針。有時候計算機自己更改其指針指向的位置來保存數據,如中斷時,有時候我們程序員更改其值,比如ucos操作系統做任務切換時。


堆棧作用的就是用來保存局部變量,從實質上講也就是將CPU寄存器的值保存到RAM中。在uCOS中,每一個任務都有一個獨立的任務堆棧。為了深入理解任務堆棧的作用,不妨分析任務從“出生”到“消亡”的整個過程,具體就是分析任務的建立,運行,掛起幾種狀態中任務堆棧的變化情況。


目前假設系統運行著一個由用戶創建的用以完成打印工作的任務TPrint。TPrint最初通過OSTaskCreate()函數創建,在該函數中與任務堆棧有關的第一段代碼是大家比較熟悉的函數OSTaskStkInit(),這個函數是在uCOS移植過程中必須實現的,其作用是“初始化堆棧”,其實就是預先在RAM中的一塊區域中把任務將來運行開始時CPU寄存器應處的狀態(正確值)準備好,之后,任務第一次被內核調度器調度運行時,將這些準備好的數據(寄存器的值)推到CPU的寄存器中,如果數據設計的合理,CPU便會按照我們預先設計好的思路運行。


所以,“初始化堆棧”實際上是做了一個“未雨綢繆”的工作。這個過程中有兩點是必須慎重考慮的,一是PC該如何定位,二是CPU的其它寄存器(除PC之外)該怎么處理。先說第一點,因為任務是第一次運行,而任務從實質上將就是一段代碼,所以PC指針應該定位到這段代碼的第一行處,即所謂的入口地址(Entry Point)處,這個地址由任務指針保存著,所以把該指針值賦給PC即可。第二,這段代碼還未被履行過,所以代碼中的變量與CPU的其它寄存器一點關系也沒有,因此R0-R12,R14可隨便給值,或者不賦值也可,讓這些寄存器保持原來的值,顯然后者更為簡單。最后再給CPSR賦值,用戶可以根據實際需要使系統運行于系統模式或管理模式。經過入棧和出棧,此時SP指向任務堆棧的最底端(就是已經定義好的任務堆棧數組的最后一個元素)。


之后任務代碼開始正式運行,因為CPU的寄存器是有限的,所以在運行時不可避免地要把一些臨時變量暫時保存到堆棧中。具體應保存到哪個地址呢,不用擔心,SP知道(任務第一次運行時,這個地址就是任務堆棧數組的最后一個元素的地址)。任務堆棧的大小和任務代碼中臨時變量的數目有關,如果這段代碼臨變量分外多,堆棧就應設計的大一些。


然后,TPrint任務由于某種理由將要被掛起,所以應把任務的運行現場放到堆棧里保護起來,TPrint任務再次運行時再把這個現場還原,任務就能從上次斷點處緊接著運行。


那么,這個現場是什么呢?從本質上講,TPrint任務的運行過程就是CPU在履行一段特定的代碼,所以這個現場就是CPU的現場,也就是寄存器的值。這些寄存器的值包含了代碼履行時的所有消息,包括當前運行到了這段代碼的哪個位置處(由PC值指明)。因此,把CPU的寄存器的值推入堆棧,然后記住棧頂指針的位置(SP由OSTCBCur->OSTCBStkPtr保存),當任務再次將要運行前,從SP指向的地址處依次把先前保存的CPU寄存器的值放到CPU的寄存器中,任務就可以從上次中斷的地方準確無誤地履行。這個過程就像突然把任務凍結了,與任務有關的任何東西都不能動了,一段時間之后又把任務解凍,與它有關的東西又變得可用,于是任務又可以活蹦亂跳地跑起來了。


從以上分析可以看出,任務堆棧至始至終伴隨著任務,與之生死與共,它的作用可以概括為兩點:


第一,當任務運行時,它用來保存一些局部變量;


第二,當任務掛起時,它負責保存任務的運行現場,也就是CPU寄存器的值。


有些良友正是忽視了第一點,產生了“任務堆棧大小應是固定值的疑問”。感覺,這也許與對函數OSTaskStkInit()的理解有關,我們都稱之為堆棧初始化函數,但此處的“初始化”與我們理解的初始化不太一樣,平時講的(變量的)初始化似乎指的是將變量的所有成員都一一初始化。而此處的堆棧的初始化僅僅是初始化了很大一個堆棧的一小部分,因為當前只有這部分是有用的,而剩余的大部分用不到,所以不用初始化,就像有些變量不用初始化一樣(有默認值或隨機值)。更深入一點考慮,當任務掛起時,任務堆棧中保存任務掛起前CPU寄存器的這一連續的區域確定在整個堆棧的最上面;當任務重新開始運行時,SP彈出寄存器的值,這段區域變成空白的區域。而且,任務每次掛起前用來保存當前CPU寄存器這一連續區域在整個任務堆棧空間中是浮動的。

上海現易電子元器件有限公司 版權所有 未經授權禁止復制或鏡像

CopyRight 2020-2025 www.urqm.cn All rights reserved   滬ICP備2020031792號

友情鏈接:

電話

易經理

18019251567

微信

易經理

易經理

頂部

咨詢
主站蜘蛛池模板: 国内精品一卡二卡三卡 | 草草国产| 四虎综合网| 国产黄色免费看 | 精品国精品国产自在久国产应用 | 双性受高H公车地铁公交 | 2024免费视频真人直播 | 午夜影院啊啊啊 | 经典强奷系列人妻 | 亚洲 欧美 影音先锋 | 欧美午夜福利1000集2019年 | 日韩精品第1页 | 最近最新中文字幕在线手机版 | 欧美一级在线免费观看 | 日韩精品射精管理在线观看 | 在线无码中文字幕一区 | 九九九精品午夜在线观看 | 警察锅哥40集电视剧免费完整版 | 亚洲精品久久片久久久久 | 翁公又大又粗挺进了我 | 中文国产成人精品久久下载 | 无码人妻精品一区二区三区蜜臀 | 最新日韩中文字幕 | 久久综合桃花 | 亚洲日本激情 | 国语对白清晰好大好白在线 | 波多野结衣家庭教师诱惑 | 精品一卡2卡三卡4卡乱码免费 | 丁香花在线影院观看在线播放 | 欧美又硬又粗进去好爽A片 欧美在线视频一区 | 国产精品色情国产三级在线观 | 狠狠色噜噜狠狠狠狠2021天天 | 黄色搞逼 | 久久精品久久久 | 骚妇的水真多让我插她 | 人成午夜免费视频在线观看 | 无码欧美黑人又大又 | 高清无码国内自拍视频 | 亚洲丁香婷婷综合久久六月 | 国产欧美三级 | 丁香花在线观看视频在线 |