哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式里堆棧的原理介紹和如何實(shí)現(xiàn)純C實(shí)現(xiàn)

Wildesbeast ? 來源:網(wǎng)絡(luò)整理 ? 作者:與非網(wǎng) ? 2020-04-06 10:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

棧這種結(jié)構(gòu)在嵌入式里其實(shí)是非常常用的,比如函數(shù)調(diào)用與返回就是典型的棧應(yīng)用,雖然很多時(shí)候棧都是CPU系統(tǒng)在自動(dòng)管理,我們只需要在鏈接文件里分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于我們?nèi)ダ斫馇度胧酱a執(zhí)行機(jī)制,以及幫助我們進(jìn)一步去調(diào)試。

1. 何為堆棧?

堆 HEAP與棧 STACK 是兩個(gè)不同概念,其本質(zhì)上都是一種數(shù)據(jù)結(jié)構(gòu)。

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

堆也是一種分配方式類似于鏈表的數(shù)據(jù)結(jié)構(gòu),其可以在任意位置對數(shù)據(jù)項(xiàng)進(jìn)行操作。堆(os)一般由程序員手動(dòng)分配釋放,其使用的是二級緩存。

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

2. 作用與意義

MCU 中,棧這種結(jié)構(gòu)一般被 cpu 和 os 所使用。

在 cpu 裸機(jī)中使用情況分兩種:一、主動(dòng)進(jìn)行函數(shù)調(diào)用時(shí),STACK 用以暫存下一條指令地址、函數(shù)參數(shù)、函數(shù)中定義的局部變量;二、硬中斷來臨時(shí),暫存當(dāng)前執(zhí)行的現(xiàn)場數(shù)據(jù)(下一條指令地址、各種緩存數(shù)據(jù)),中斷結(jié)束后,用以恢復(fù)。

在 os 中使用時(shí),硬棧的使用同 cpu 裸機(jī);但 os 一般會為每個(gè)任務(wù)額外分配一個(gè)軟棧,在任務(wù)調(diào)度時(shí),可用軟中斷打斷當(dāng)前正在執(zhí)行的任務(wù),棧則用以保存各自任務(wù)以恢復(fù)。

3. 軟硬之分

硬件堆棧:是通過寄存器 SP 作為索引指針的地址,是調(diào)用了 BL 等函數(shù)調(diào)用指令后硬件自動(dòng)填充的堆棧。

軟件堆棧:是編譯器為了處理一些參數(shù)傳遞而做的堆棧,會由編譯器自動(dòng)產(chǎn)生和處理,可以通過相應(yīng)的編譯選項(xiàng)對其進(jìn)行編輯。

簡單一點(diǎn)說,硬件堆棧主要做為地址堆棧用,而軟件堆棧主要會被分配成數(shù)據(jù)堆棧?;蚩雌錀m斨羔樖欠窈?CPU 具有特殊的關(guān)聯(lián),有關(guān)聯(lián)者(如 SP)“硬”,而無關(guān)聯(lián)者“軟”。

4. 棧的純 C 實(shí)現(xiàn)

基本的抽象數(shù)據(jù)類型(ADT)是編寫 C 程序必要的過程,這類 ADT 有鏈表、堆棧、隊(duì)列和樹等,本節(jié)主要講解下堆棧的幾種實(shí)現(xiàn)方法以及他們的優(yōu)缺點(diǎn)。

堆棧(stack)的顯著特點(diǎn)是后進(jìn)先出(Last-In First-Out, LIFO),其實(shí)現(xiàn)的方法有三種可選方案:靜態(tài)數(shù)組、動(dòng)態(tài)分配的數(shù)組、動(dòng)態(tài)分配的鏈?zhǔn)浇Y(jié)構(gòu)。

靜態(tài)數(shù)組:特點(diǎn)是要求結(jié)構(gòu)的長度固定,而且長度在編譯時(shí)候就得確定。其優(yōu)點(diǎn)是結(jié)構(gòu)簡單,實(shí)現(xiàn)起來方便而不容易出錯(cuò)。而缺點(diǎn)就是不夠靈活以及固定長度不容易控制,適用于知道明確長度的場合。

動(dòng)態(tài)數(shù)組:特點(diǎn)是長度可以在運(yùn)行時(shí)候才確定以及可以更改原來數(shù)組的長度。優(yōu)點(diǎn)是靈活,缺點(diǎn)是由此會增加程序的復(fù)雜性。

鏈?zhǔn)浇Y(jié)構(gòu):特點(diǎn)是無長度上線,需要的時(shí)候再申請分配內(nèi)存空間,可最大程度上實(shí)現(xiàn)靈活性。缺點(diǎn)是鏈?zhǔn)浇Y(jié)構(gòu)的鏈接字段需要消耗一定的內(nèi)存,在鏈?zhǔn)浇Y(jié)構(gòu)中訪問一個(gè)特定元素的效率不如數(shù)組。

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

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

4.1 靜態(tài)數(shù)組

在靜態(tài)數(shù)組堆棧中,STACK_SIZE 表示堆棧所能存儲的元素的最大值,用 top_element 作為數(shù)組下標(biāo)來表示堆棧里面的元素,當(dāng) top_element == -1 的時(shí)候表示堆棧為空;當(dāng) top_element == STACK_SIZE - 1 的時(shí)候表示堆棧為滿。push 的時(shí)候 top_element 加 1,top_element == 0 時(shí)表示第一個(gè)堆棧元素;pop 的時(shí)候 top_element 減 1。

a_stack.c 源代碼如下:

4.2 動(dòng)態(tài)數(shù)組

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

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

d_stack.c 源代碼如下:

4.3 鏈?zhǔn)浇Y(jié)構(gòu)

由于只有堆棧頂部元素才可以被訪問,因此適用單鏈表可以很好實(shí)現(xiàn)鏈?zhǔn)蕉褩?,而且無長度限制。把一個(gè)元素壓入堆棧是通過在鏈表頭部添加一個(gè)元素實(shí)現(xiàn)。彈出一個(gè)元素是通過刪除鏈表頭部第一個(gè)元素實(shí)現(xiàn)。由于沒有長度限制,故不需要 create_stack 函數(shù),需要 destroy_stack 進(jìn)行釋放內(nèi)存以避免內(nèi)存泄漏。

l_stack.c 源代碼如下:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5208

    文章

    20620

    瀏覽量

    336637
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5617

    瀏覽量

    130368
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11320

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式通用微秒計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

    今天給大家分享的是嵌入式通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)。
    的頭像 發(fā)表于 10-14 12:41 ?2889次閱讀

    常用知識:嵌入式堆棧原理及其C實(shí)現(xiàn)

    )72.{73. return FALSE;74.}  至此,嵌入式堆棧原理及其C實(shí)現(xiàn)痞子衡
    發(fā)表于 04-13 17:20

    常用知識:嵌入式堆棧原理及其C實(shí)現(xiàn)

    */65.int is_empty(void)66.{67. return stack == NULL;68.}69.70./* is_full */71.int is_full(void)72.{73. return FALSE;74.}  至此,嵌入式
    發(fā)表于 04-17 10:19

    嵌入式學(xué)習(xí)手冊——堆棧結(jié)構(gòu)與編程

    可以在任意位置對數(shù)據(jù)項(xiàng)進(jìn)行操作。堆(os)一般由程序員手動(dòng)分配釋放,其使用的是二級緩存。  在嵌入式世界,堆棧一般指的僅是棧。2. 作用與意義在 MCU 中,棧這種結(jié)構(gòu)一般被 cpu 和 os 所
    發(fā)表于 04-20 07:00

    嵌入式堆棧原理及其C實(shí)現(xiàn)方法

    嵌入式堆棧原理及其C實(shí)現(xiàn)  
    發(fā)表于 12-28 06:30

    電梯嵌入式監(jiān)控終端的設(shè)計(jì)與實(shí)現(xiàn)

    介紹了一種網(wǎng)絡(luò)化電梯遠(yuǎn)程監(jiān)測系統(tǒng),重點(diǎn)討論了其中嵌入式監(jiān)控終端硬件和軟件的設(shè)計(jì)與實(shí)現(xiàn)。該嵌入式監(jiān)控終端基于32 位高性能嵌入式微處理器和
    發(fā)表于 01-07 20:11 ?9次下載

    EPA 通信協(xié)議在μC/OS-II嵌入式系統(tǒng)中的設(shè)計(jì)與實(shí)現(xiàn)

    本文提出了一種基于μC/OS-II 嵌入式系統(tǒng)的EPA 通信協(xié)議的實(shí)現(xiàn)方案。簡要介紹了 EPA 通信協(xié)議和模型,針對在以μC/
    發(fā)表于 05-25 15:02 ?18次下載

    嵌入式Internet技術(shù)及其實(shí)現(xiàn)方案

    嵌入式Internet技術(shù)在各行業(yè)中應(yīng)用日益廣泛,文章介紹嵌入式Internet技術(shù)的原理和幾種實(shí)現(xiàn)方案。并討論了嵌入式TCP/IP協(xié)議的
    發(fā)表于 08-15 11:39 ?17次下載

    基于Chirp函數(shù)的Nios Ⅱ嵌入式實(shí)現(xiàn)

    分析Chirp函數(shù)在頻域上的一般特性,提出利用FPGA的嵌入式軟核NiosⅡ處理器在嵌入式操作系統(tǒng)μC/OS-Ⅱ上實(shí)現(xiàn)Chirp的方法
    發(fā)表于 06-15 11:02 ?1678次閱讀
    基于Chirp函數(shù)的Nios Ⅱ<b class='flag-5'>嵌入式</b><b class='flag-5'>實(shí)現(xiàn)</b>

    嵌入式C編程

    嵌入式C編程,非常有用的資料,介紹嵌入式C語言編程
    發(fā)表于 12-29 17:29 ?0次下載

    基于μC/OS-Ⅱ的嵌入式洗碗機(jī)控制器的設(shè)計(jì)與實(shí)現(xiàn)

    關(guān)于嵌入式的 基于μC/OS-Ⅱ的嵌入式洗碗機(jī)控制器的設(shè)計(jì)與實(shí)現(xiàn) 的學(xué)術(shù)論文
    發(fā)表于 04-20 09:58 ?12次下載

    嵌入式C實(shí)現(xiàn)延時(shí)程序的不同變量的區(qū)別 幾種Linux嵌入式開發(fā)環(huán)境的簡單介紹

    嵌入式C實(shí)現(xiàn)延時(shí)程序的不同變量的區(qū)別 幾種Linux嵌入式開發(fā)環(huán)境的簡單介紹 ARM嵌入式開發(fā)基
    發(fā)表于 04-14 07:24 ?2235次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>實(shí)現(xiàn)</b>延時(shí)程序的不同變量的區(qū)別 幾種Linux<b class='flag-5'>嵌入式</b>開發(fā)環(huán)境的簡單<b class='flag-5'>介紹</b>

    嵌入式堆棧原理是怎么樣的如何進(jìn)行C實(shí)現(xiàn)

    棧這種結(jié)構(gòu)在嵌入式其實(shí)是非常常用的,比如函數(shù)調(diào)用與返回就是典型的棧應(yīng)用,雖然很多時(shí)候棧都是CPU系統(tǒng)在自動(dòng)管理,我們只需要在鏈接文件分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于我們?nèi)ダ斫?/div>
    的頭像 發(fā)表于 02-06 16:23 ?3499次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>里</b><b class='flag-5'>堆棧</b>原理是怎么樣的如何進(jìn)行<b class='flag-5'>純</b><b class='flag-5'>C</b><b class='flag-5'>實(shí)現(xiàn)</b>

    FPGA實(shí)現(xiàn)嵌入式系統(tǒng)

    FPGA實(shí)現(xiàn)嵌入式系統(tǒng)(嵌入式開發(fā)報(bào)班哪個(gè)好)-該文檔為FPGA實(shí)現(xiàn)嵌入式系統(tǒng)原理資料,講解的還不錯(cuò),感興趣的可以下載看看………………………
    發(fā)表于 07-30 09:13 ?12次下載
    FPGA<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>嵌入式</b>系統(tǒng)

    痞子衡嵌入式嵌入式通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是嵌入式通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)?! ≡?b class='flag-5'>嵌入式軟件開發(fā)
    發(fā)表于 11-25 09:21 ?16次下載
    痞子衡<b class='flag-5'>嵌入式</b>:<b class='flag-5'>嵌入式</b><b class='flag-5'>里</b>通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>
    高青县| 宿松县| 思南县| 乃东县| 宁强县| 确山县| 句容市| 科技| 水富县| 许昌县| 定南县| 哈尔滨市| 乌拉特中旗| 南陵县| 博湖县| 平邑县| 赤峰市| 八宿县| 泗洪县| 简阳市| 朝阳县| 柳州市| 将乐县| 彰化市| 丹江口市| 桐城市| 延安市| 武宁县| 临夏市| 上高县| 苗栗市| 新昌县| 六盘水市| 靖江市| 全州县| 商洛市| 高平市| 莲花县| 雅安市| 阿合奇县| 临沂市|