91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式里堆棧原理是怎么樣的如何進行純C實現

Wildesbeast ? 來源:與非網 ? 作者:與非網 ? 2020-02-06 16:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

棧這種結構在嵌入式里其實是非常常用的,比如函數調用與返回就是典型的棧應用,雖然很多時候棧都是CPU系統在自動管理,我們只需要在鏈接文件里分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于我們去理解嵌入式代碼執行機制,以及幫助我們進一步去調試。

1. 何為堆棧?

堆 HEAP與棧 STACK 是兩個不同概念,其本質上都是一種數據結構。

棧是一種按數據項排列的數據結構,只能在一端(棧頂 top)對數據項進行插入和刪除,其符合后進先出(Last-In / First-Out)原則。棧(os)一般是由編譯器自動分配釋放,其使用的是一級緩存。

堆也是一種分配方式類似于鏈表的數據結構,其可以在任意位置對數據項進行操作。堆(os)一般由程序員手動分配釋放,其使用的是二級緩存。

在嵌入式世界里,堆棧一般指的僅是棧。

2. 作用與意義

MCU 中,棧這種結構一般被 cpu 和 os 所使用。

在 cpu 裸機中使用情況分兩種:一、主動進行函數調用時,STACK 用以暫存下一條指令地址、函數參數、函數中定義的局部變量;二、硬中斷來臨時,暫存當前執行的現場數據(下一條指令地址、各種緩存數據),中斷結束后,用以恢復。

在 os 中使用時,硬棧的使用同 cpu 裸機;但 os 一般會為每個任務額外分配一個軟棧,在任務調度時,可用軟中斷打斷當前正在執行的任務,棧則用以保存各自任務以恢復。

3. 軟硬之分

硬件堆棧:是通過寄存器 SP 作為索引指針的地址,是調用了 BL 等函數調用指令后硬件自動填充的堆棧。

軟件堆棧:是編譯器為了處理一些參數傳遞而做的堆棧,會由編譯器自動產生和處理,可以通過相應的編譯選項對其進行編輯。

簡單一點說,硬件堆棧主要做為地址堆棧用,而軟件堆棧主要會被分配成數據堆棧。或看其棧頂指針是否和 CPU 具有特殊的關聯,有關聯者(如 SP)“硬”,而無關聯者“軟”。

4. 棧的純 C 實現

基本的抽象數據類型(ADT)是編寫 C 程序必要的過程,這類 ADT 有鏈表、堆棧、隊列和樹等,本節主要講解下堆棧的幾種實現方法以及他們的優缺點。

堆棧(stack)的顯著特點是后進先出(Last-In First-Out, LIFO),其實現的方法有三種可選方案:靜態數組、動態分配的數組、動態分配的鏈式結構。

靜態數組:特點是要求結構的長度固定,而且長度在編譯時候就得確定。其優點是結構簡單,實現起來方便而不容易出錯。而缺點就是不夠靈活以及固定長度不容易控制,適用于知道明確長度的場合。

動態數組:特點是長度可以在運行時候才確定以及可以更改原來數組的長度。優點是靈活,缺點是由此會增加程序的復雜性。

鏈式結構:特點是無長度上線,需要的時候再申請分配內存空間,可最大程度上實現靈活性。缺點是鏈式結構的鏈接字段需要消耗一定的內存,在鏈式結構中訪問一個特定元素的效率不如數組。

首先先確定一個堆棧接口的頭文件,里面包含了各個方案下的函數原型,放在一起是為了實現程序的模塊化以及便于修改。然后再接著分別介紹各個方案的具體實施方法。

堆棧接口 stack.h 文件代碼:

4.1 靜態數組

在靜態數組堆棧中,STACK_SIZE 表示堆棧所能存儲的元素的最大值,用 top_element 作為數組下標來表示堆棧里面的元素,當 top_element == -1 的時候表示堆棧為空;當 top_element == STACK_SIZE - 1 的時候表示堆棧為滿。push 的時候 top_element 加 1,top_element == 0 時表示第一個堆棧元素;pop 的時候 top_element 減 1。

a_stack.c 源代碼如下:

4.2 動態數組

頭文件還是用 stack.h,改動的并不是很多,增加了 stack_size 變量取代 STACK_SIZE 來保存堆棧的長度,數組由一個指針來代替,在全局變量下缺省為 0。

create_stack 函數首先檢查堆棧是否已經創建,然后才分配所需數量的內存并檢查分配是否成功。destroy_stack 函數首先檢查堆棧是否存在,已經釋放內存之后把長度和指針變量重新設置為零。is_empty 和 is_full 函數中添加了一條斷言,防止任何堆棧函數在堆棧被創建之前就被調用。

d_stack.c 源代碼如下:

4.3 鏈式結構

由于只有堆棧頂部元素才可以被訪問,因此適用單鏈表可以很好實現鏈式堆棧,而且無長度限制。把一個元素壓入堆棧是通過在鏈表頭部添加一個元素實現。彈出一個元素是通過刪除鏈表頭部第一個元素實現。由于沒有長度限制,故不需要 create_stack 函數,需要 destroy_stack 進行釋放內存以避免內存泄漏。

l_stack.c 源代碼如下:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5152

    文章

    19675

    瀏覽量

    317579
  • 寄存器
    +關注

    關注

    31

    文章

    5434

    瀏覽量

    124504
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11080

    瀏覽量

    217094
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    [分享]如何進嵌入式開發的世界?

    何進嵌入式開發的世界?我們認為,首先掌握C語言的指針和內存管理等高級技術,然后掌握一些硬件知識,最后可以通過最容易找到的嵌入式Linux進行
    發表于 05-22 11:03

    何進行嵌入式實時PLC設計?

    基于 VxWorks 操作系統,探討如何進行嵌入式實時PLC設計?利用VxWorks 的開放性、模塊化和可擴展性的系統結構特性以及多線程/多任務的系統環境來達到高實時要求的PLC 控制,在保證實時性的同時,實現多點位、復雜功能的
    發表于 07-31 06:02

    常用知識:嵌入式堆棧原理及其C實現

    常用知識:嵌入式堆棧原理及其C實現  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大
    發表于 04-13 17:20

    常用知識:嵌入式堆棧原理及其C實現

    常用知識:嵌入式堆棧原理及其C實現 大家好,我是正經搞技術的痞子。今天給大家講的是
    發表于 04-17 10:19

    嵌入式學習手冊——堆棧結構與編程

    可以在任意位置對數據項進行操作。堆(os)一般由程序員手動分配釋放,其使用的是二級緩存。  在嵌入式世界堆棧一般指的僅是棧。2. 作用與意義在 MCU 中,棧這種結構一般被 cpu
    發表于 04-20 07:00

    軟件和嵌入式軟件區別

      軟件和嵌入式軟件區別為:  1、定義不同  ①嵌入式軟件就是嵌入在硬件中的操作系統和開發工具軟件,包括軟件部分和硬件部分;  ②軟件
    發表于 06-28 11:36

    嵌入式堆棧原理及其C實現方法

    嵌入式堆棧原理及其C實現  
    發表于 12-28 06:30

    嵌入式系統使用的存儲器是如何進行劃分的

    嵌入式最小硬件系統是由哪些部分組成的?嵌入式系統使用的存儲器是如何進行劃分的?可分為哪幾類?
    發表于 10-22 07:18

    嵌入式C語言應用工程中堆棧的相關資料分享

    堆棧的定義和作用2. 嵌入式 C 語言應用工程的棧大小確定3. 嵌入式 C 語言應用工程的堆棧
    發表于 11-04 06:10

    嵌入式產品如何進行安全防護

    上期提到了嵌入式MCU破解技術,雖不全面,但足夠起到警示作用。本期主要講述嵌入式產品如何進行安全防護。 因為MCU端的程序很容易被獲取到,所以MCU端的程序和數據都是不安全的。最直接的加密防護,就是
    發表于 11-04 07:33

    應用熱更新如何進行嵌入式設備開發調試?

    應用熱更新如何進行嵌入式設備開發調試?
    發表于 12-23 06:02

    何進嵌入式行業發展

    何進嵌入式行業發展,帶你進入嵌入式行業,提高收入。
    發表于 03-15 15:48 ?2次下載

    嵌入式堆棧的原理介紹和如何實現C實現

    棧這種結構在嵌入式其實是非常常用的,比如函數調用與返回就是典型的棧應用,雖然很多時候棧都是CPU系統在自動管理,我們只需要在鏈接文件分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于我們去理解
    的頭像 發表于 04-06 10:10 ?5001次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>里</b><b class='flag-5'>堆棧</b>的原理介紹和如何<b class='flag-5'>實現</b><b class='flag-5'>純</b><b class='flag-5'>C</b><b class='flag-5'>實現</b>

    高性能嵌入式堆棧Azure PTOS USBX概述

    Azure RTOS USBX 是一種高性能的 USB 主機、設備和移動 (OTG) 嵌入式堆棧。 Azure RTOS USBX 與 Azure RTOS ThreadX 完全集成,適用于所有支持
    發表于 05-24 10:55 ?10次下載

    為什么嵌入式系統需要堆棧分析?如何進行監控堆棧分析呢?

    隨著代碼行數從幾千到上百萬不等,嵌入式軟件變得日益復雜,但總體目標依然是實現穩健、正確且快速執行的軟件。
    的頭像 發表于 03-28 10:23 ?1392次閱讀
    主站蜘蛛池模板: 五月天激情丁香 | 国产午夜免费视频片夜色 | 日韩高清性爽一级毛片免费 | 欧美一级色视频 | 黑人一区二区三区中文字幕 | brazzers在线| 一区二区三区网站 | 日本五十交尾在线观看 | 日韩欧美黄色 | 大黄一级片 | 天天爱天天做天天爽 | 日韩高清在线日韩大片观看网址 | 免费看片免 | 在线播放真实国产乱子伦 | 高清性色生活片欧美在线 | 欧美色视频网 | 日本亚洲高清乱码中文在线观看 | 综合色久七七综合七七蜜芽 | 台湾三级毛片 | 另类free性欧美护士 | 老师办公室高h文小说 | 狠狠干激情| 五月开心六月伊人色婷婷 | 天天躁狠狠躁夜躁2021 | 午夜精品久久久久久久99 | 亚洲国产第一区二区香蕉 | 成人伊人亚洲人综合网站222 | 中文字幕在线看精品乱码 | 四虎国产精品免费久久影院 | 速度与激情10 | 亚洲欧美日韩特级毛片 | 色婷婷影院在线视频免费播放 | 92香蕉视频 | 久久午夜精品 | 丁香六月在线 | 一级毛片在线看在线播放 | 国产精品va一区二区三区 | 91精品国产91久久久久久青草 | 黄色刺激网站 | 国产精品视频第一区二区三区 | 国产h在线观看 |