堆與棧的概念(RTOS)

目錄

? ? ? ?

#堆在RTOS的概念

#相關代碼表示

#堆相關特點

#棧在RTOS中的概念

#棧的代碼表示

#棧的相關特點

#為什么每個RTOS任務都要有自己的棧


? ? ? ?

前言:本篇參考韋東山老師的RTOS,連接放在最后

#堆在RTOS的概念

? ? ? ?本文所指的堆與棧并不是數據結構中,的堆與棧,實時操作系統(RTOS)中,堆(Heap)是一個動態內存分配區域,用于存儲程序運行過程中大小未知或可變的數據結構。堆內存不像棧內存那樣由操作系統自動管理,它是由程序員申請和釋放的。用戶可以根據需要請求一段連續的內存空間,并在程序執行過程中隨著數據的變化而增長或減小。

?????????堆與棧經常混著用,而棧是RTOS的基礎,所為堆就是一塊內存,我們可以管理內存,從內存中使用一部分,用完之后在把他釋放回去。

#相關代碼表示

? ? ? ? 代碼里定義了heap_buf[1024]數組,作為內存空間,定義void *my_malloc(int size);這個函數在main()里面去使用,數組的內存空間,這個過程就是申請內存空間的堆,使用堆作為存儲數據的存在,同樣可以使用函數,對已經定義使用的,內存空間去進行釋放。

char heap_buf[1024];//這里定義一個堆
int pos = 0;
void *my_malloc(int size);
int main()//主函數
{char ch = 65;char *buf = my_malloc(100);//調用函數占用內存unsigned char uch = 200;for(i = 0; i<26;i++)buf[i] = 'A'+i;return 0;
}
void *my_malloc(int size)//定義函數使用堆
{int old_pos = pos;pos+=size;return &heap_buf[old_pos];
}
#堆相關特點

動態分配進程可以在運行時根據需要動態地向堆中申請內存,不需要預先指定固定大小。

無預定義大小堆的大小沒有固定限制,直到系統內存不足或者達到預設的內存閾值才會停止分配。

內存管理程序員負責堆內存的分配和釋放,如果忘記釋放已不再使用的內存,可能導致內存泄漏。

性能開銷由于堆內存管理通常比棧內存復雜,可能會引入一定的性能開銷,尤其是在頻繁大塊分配或回收時。

? ? ? ? 總結:堆是程序中的內存分配區域,用于存儲變量等,這個空間由代碼申請或者釋放。

#棧在RTOS中的概念

? ? ? ? 棧在RTOS中非常重要,RTOS操作系統,沒有文件功能,因為只有內核,僅支持多任務的要求,而棧也是一塊內存空間,CPU的SP寄存器指向棧,可以用于函數調用·,局部變量,多任務系統保存現場空間。

#棧的代碼表示

void a_func(volatile int a);//定義函數聲明
void b_func(volatile int a);//定義函數聲明
void c_func(volatile int a);//定義函數功能
int g_cnt = 0;//定義變量聲明
int main()//主函數
{char ch = 65;char *buf = my_malloc(100);//調用函數占用內存unsigned char uch = 200;volatile int i = 99;for(i = 0; i<26;i++)buf[i] = 'A'+i;a_funct(i);return 0;
}
void a_func(volatile int a)//定義函數功能
{g_cnt =  b_funct(a);c_funct(g_cnt);
}
void b_func(volatile int a)//定義函數功能
{a+=2;return a;
}
void c_func(volatile int a)//定義函數功能
{a+=2;return a;
}
void *my_malloc(int size)//定義函數使用堆
{int old_pos = pos;pos+=size;return &heap_buf[old_pos];
}

? ? ? ? 在這個程序里面,main()里面調用a_func? ,a_func里面調用了b_func和c_func,這里面有一個層層調用的關系,對應的匯編代碼如下。

? ? ? ? main()里面a_func?,調用指令。在使用BL匯編指令,進行函數調用的時候,BL指令的功能是,LR=0x8000154,同時PC=0x8000154,這個地址就是調用函數a_func在寄存器中的地址,同時調用,在執行調用函數的時候,會保存返回地址,PUSH {r0,r1}? 所以C語言調用函數的本質是使用BL指令main()函數中轉跳執行函數的時候,下面一些語句還沒有執行,需要執行,在執行完調用函數的時候就需要返回,轉跳位置,重新進行執行。

? ? ? ? 在最后調用的函數c_func(),執行完之后,lr寄存器的值,會被彈出,里面保存的是a_func()函數的地址,從而跳轉到c_func()被調用的地方,繼續執行下面的語句,同理當a_func()執行完成的時候,lr寄存器里面的值保存的是main()里面a_func()跳轉的部分,從而繼續執行下面的語句。

? ? ? ? 在main()函數/自定義函數,的匯編語言中第一條語句,通常是保存 r0? r1? r2? r3 這些寄存器? LR返回地址? 局部變量 這些數據會被保存RAM的棧中,在函數的調用結束之后,局部便令,LR在棧中分配的內存空間會被釋放。

#棧的相關特點

?????????在實時操作系統(RTOS)中,棧(Stack)是一個特殊的內存區域,主要用于存儲程序執行過程中的局部變量、函數參數和函數調用的返回地址。它是按照后進先出(Last In, First Out,LIFO)的原則工作的,類似于生活中的堆疊物品。

????????每當程序進入一個新的函數或遇到遞歸調用時,系統會在棧頂分配空間來保存這些信息。當函數執行完畢并返回時,相關的數據會被彈出棧,以便讓控制權回到調用該函數的地方。棧的空間大小通常是有限的,如果棧溢出(超過其預設的最大限制),可能會導致嚴重的運行時錯誤,甚至影響系統的穩定性。

????????RTOS中的任務調度和中斷處理也常常利用棧,因為它們涉及快速響應和切換。每個任務或中斷服務都會有自己的私有棧,這樣即使在中斷處理過程中,主任務的執行不會被打斷,保證了操作的連續性和實時性。

#為什么每個RTOS任務都要有自己的棧

? ? ? ? 在RTOS環境下,有任務A和任務B,在多任務系統下,A與B切換運行,由定時器發生中斷進行切換任務。

? ? ? ? 每次函數進行切換的時候,需要保存現場,恢復現場,指的是保存A函數的寄存器,恢復保存B函數的寄存器,這里(A函數切換B函數為例)反之,則相反。

? ? ? ? 這些保存的現場,保存的就是函數使用的寄存器,局部變量,LR,等等。這些數據會被保存在內存的的位置,所以說每一個任務都需要有自己的棧。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 歡迎指正,最后希望對你有所幫助!!!

[3-3-2]_棧的概念_函數調用_嗶哩嗶哩_bilibili

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39770.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【unity實戰】在Unity中使用有限狀態機制作一個敵人AI

最終效果 文章目錄 最終效果前言有限狀態機的主要作用和意義素材下載邏輯圖敵人動畫配置優雅的代碼文件目錄狀態機代碼定義敵人不同狀態切換創建敵人效果更多的敵人參考源碼完結 前言 有限狀態機以前的我嗤之以鼻&#xff0c;現在的我逐幀分析。其實之前我就了解過有限狀態機&…

2.(vue3.x+vite)調用iframe的方法(vue編碼)

1、效果預覽 2.編寫代碼 (1)主頁面 <template><div><button @click="sendMessage">調用iframe,并發送信息

【udp報文】udp報文未自動分片,報文過長被攔截問題定位

問題現象 某局點出現一個奇怪的現象&#xff0c;客戶端給服務端發送消息&#xff0c;服務端僅能收到小部分消息&#xff0c;大部分消息從客戶端發出后&#xff0c;服務端都未收到。 問題定位 初步分析 根據現象初步分析&#xff0c;有可能是網絡原因導致消息到服務端不可達&a…

【C語言】文件的順序讀寫

©作者:末央&#xff06; ©系列:C語言初階(適合小白入門) ©說明:以凡人之筆墨&#xff0c;書寫未來之大夢 目錄 前言字符輸入輸出函數 - fgetc和fputc文本行輸入輸出函數 - fgets和fputs格式化輸入輸出函數 - fscanf和fprintf 前言 對文件數據的讀寫可以分為順序…

Unity3D 打造基于AStar的尋路與導航詳解

在游戲開發中&#xff0c;尋路與導航是一個至關重要的功能&#xff0c;它能夠使游戲角色自動找到最優路徑&#xff0c;避開障礙物&#xff0c;實現自動導航&#xff0c;從而提升游戲體驗。AStar&#xff08;A*&#xff09;算法作為一種廣泛應用的尋路算法&#xff0c;因其高效性…

關于多線程的使用方法

多線程在python中應用比較廣泛&#xff0c;但是因為python中有GIL鎖的緣故&#xff0c;在多線程中看起來是并發的執行的&#xff0c;在宏觀上是并發執行的&#xff0c;但是在微觀上是一個接著一個執行。 在python中使用多線程比較簡單&#xff0c;是一套固定的模版。 from qu…

PHP利用GD庫實現圖片合成功能方法

在程序項目開發的過程中我們免不了要實現一種功能。例如海報的生成&#xff0c;照片和文字合成一張新的圖片。php中怎么實現 實現功能 文字和照片合成一張新的照片&#xff0c;并且自適應換行并加上簽名和日期&#xff0c;加上字體樣式&#xff0c;下面我們就開實現該功能 實現…

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》

Seal^_^【送書活動第8期】——《ChatGLM3大模型本地化部署、應用開發與微調》 一、參與方式二、本期推薦圖書2.1 作者建語2.2 編輯推建2.3 圖書簡介2.4 前 言2.5 目 錄 三、正版購買 大模型領域 既是繁星點點的未知宇宙&#xff0c;也是蘊含無數可能的廣闊天地&#xff0c; 正…

深入理解 Linux 內核架構

目錄 引言內核概念Linux 內核的基本組成 進程管理內存管理文件系統設備驅動網絡棧內核結構 內核態與用戶態內核模塊系統調用中斷與異常處理內核同步機制Linux 內核使用場景常用的內核命令與工具內核調試與性能優化總結 1. 引言 Linux 內核是現代計算機系統的核心組件之一&am…

python--基礎知識點--協程

協程由用戶態控制&#xff0c;不由內核控制1個線程中可以開很多協程協程切換是在用戶態控制不由內核控制&#xff0c;切換時資源開銷小使用方式&#xff1a;async def、await可等待對象(協程對象、Future對象、task對象(是Future對象的子類)->io等待)、事件循環使用場景&…

idea創建自定義的maven spark scala archetype腳手架

一&#xff1a;先創建一個Maven項目net.alchim31.maven&#xff08;選該模板&#xff0c;得要等一會兒才能加載出來&#xff09; 之后將自己的目錄結構建立好&#xff0c;最好不要有空目錄&#xff0c;可能會因為沒有文件在install的時候編譯不進去 pom中內容也按照自己的需要改…

Stable Diffusion web UI 插件

2024.7.3更新&#xff0c;持續更新中 如果需要在linux上自己安裝sd&#xff0c;參考&#xff1a;stable diffusion linux安裝 插件復制到 /stable-diffusion-webui/extensions 目錄下&#xff0c;然后重新啟動sd即可 一、插件安裝方法 每種插件的安裝方法可能略有不同&#xf…

蘋果p12證書最簡單最新申請流程

使用uniapp打包&#xff0c;在ios上打正式包需要蘋果的p12證書和證書profile文件&#xff0c;點進去uniapp的ios證書申請教程&#xff0c;通篇就是使用mac電腦申請的教程&#xff0c;假如沒有mac電腦就無法繼續了。 因此&#xff0c;假如沒有mac電腦的同志們&#xff0c;可以參…

高薪程序員必修課-Java中為什么不建議使用Executors來創建線程池?

目錄 前言 原因分析 1. newFixedThreadPool 和 newSingleThreadExecutor 示例&#xff1a; 2. newCachedThreadPool 示例&#xff1a; 建議的替代方法 示例&#xff1a; 解釋&#xff1a; 總結 前言 在Java中&#xff0c;Executors 類提供了幾個工廠方法來創建不同類型…

RAG開源項目Qanything源碼閱讀3-在線推理

原文&#xff1a;前沿重器[47] | RAG開源項目Qanything源碼閱讀3-在線推理 項目&#xff1a;https://github.com/netease-youdao/QAnything 第一篇&#xff1a;RAG開源項目Qanything源碼閱讀1-概述服務 第二篇&#xff1a;RAG開源項目Qanything源碼閱讀2-離線文件處理 0&#x…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自動化(五)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主機搭建&#xff09; 拉取GitLab(服務器)代碼到在Jenkins工作空間本地運行并生成Allure測試報告 二、框架改動點 框架主運行程序需要先注釋掉運行代碼&#xff08;可不改&#xff0c;如果運行報allure找不到就直接注釋掉&#xff09; …

中英雙語介紹美國的州:路易斯安那州(Louisiana)

中文版 路易斯安那州簡介 路易斯安那州位于美國南部&#xff0c;以其豐富的歷史文化、多樣的自然景觀和獨特的音樂和美食傳統而聞名。以下是對路易斯安那州的詳細介紹&#xff0c;包括其地理位置、人口、經濟、教育、文化和主要城市。 地理位置 路易斯安那州東臨密西西比州…

鴻蒙應用開發-時間屏幕

點擊下載源碼&#xff1a; https://download.csdn.net/download/liuhaikang/89509449 做一個時間屏幕&#xff0c;可以點擊切換白色和黑色&#xff0c;有漸變效果&#xff0c;使用到了鴻蒙的動畫效果。 在這個設計中&#xff0c;我們首先引入了通用能力包&#xff0c;以實現功…

Kubernetes 離線安裝的坑我采了

Kubernetes 離線安裝的坑我采了 一、Error from server: Get "https://xx.xx.xx.xx:10250/containerLogs/kube-system/calico-node-8dnvs/calico-node": tls: failed to verify certificate: x509: certificate signed by unknown authority二、calico 或 pod 啟動正…

cesium公交車軌跡漫游

個人博客&#xff1a;CSDN 博客-滿分觀察網友 z 演示地址&#xff1a;嗶哩嗶哩-滿分觀察網友 z 這是一個用 Cesium.js 做的公交車軌跡漫游&#xff0c;實現的功能有加載站點和道路軌跡點數據、監聽車輛的實時位置、車輛控制器。滾動屏等等。 文章目錄 1. 地圖初始化2. 數據渲…