0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式里堆栈的原理介绍和如何实现纯C实现

Wildesbeast 来源:网络整理 作者:与非网 2020-04-06 10:10 次阅读

栈这种结构在嵌入式里其实是非常常用的,比如函数调用与返回就是典型的栈应用,虽然很多时候栈都是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 源代码如下:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303226
  • 寄存器
    +关注

    关注

    31

    文章

    5317

    浏览量

    120001
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211131
收藏 人收藏

    评论

    相关推荐

    嵌入式通用微秒计时函数框架设计与实现

    今天给大家分享的是嵌入式通用微秒(microseconds)计时函数框架设计与实现
    的头像 发表于 10-14 12:41 1844次阅读

    常用知识:嵌入式堆栈原理及其C实现

    )72.{73. return FALSE;74.}  至此,嵌入式堆栈原理及其C实现痞子衡
    发表于 04-13 17:20

    常用知识:嵌入式堆栈原理及其C实现

    */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.}  至此,嵌入式
    发表于 04-17 10:19

    嵌入式学习手册——堆栈结构与编程

    可以在任意位置对数据项进行操作。堆(os)一般由程序员手动分配释放,其使用的是二级缓存。  在嵌入式世界堆栈一般指的仅是栈。2. 作用与意义在 MCU 中,栈这种结构一般被 cpu 和 os 所
    发表于 04-20 07:00

    嵌入式堆栈原理及其C实现方法

    嵌入式堆栈原理及其C实现  
    发表于 12-28 06:30

    电梯嵌入式监控终端的设计与实现

    介绍了一种网络化电梯远程监测系统,重点讨论了其中嵌入式监控终端硬件和软件的设计与实现。该嵌入式监控终端基于32 位高性能嵌入式微处理器和
    发表于 01-07 20:11 9次下载

    EPA 通信协议在μC/OS-II嵌入式系统中的设计与实现

    本文提出了一种基于μC/OS-II 嵌入式系统的EPA 通信协议的实现方案。简要介绍了 EPA 通信协议和模型,针对在以μC/
    发表于 05-25 15:02 18次下载

    嵌入式Internet技术及其实现方案

    嵌入式Internet技术在各行业中应用日益广泛,文章介绍嵌入式Internet技术的原理和几种实现方案。并讨论了嵌入式TCP/IP协议的
    发表于 08-15 11:39 17次下载

    嵌入式定位系统的实用设计与软件算法实现

    提出一种嵌入式的定位系统设计,在S3C2410的基础上运用MiniGUI实现图形界面的通用化。在简要说明硬件选型基础上,详细介绍嵌入式系统的
    发表于 07-10 15:19 13次下载

    基于Chirp函数的Nios Ⅱ嵌入式实现

    分析Chirp函数在频域上的一般特性,提出利用FPGA的嵌入式软核NiosⅡ处理器在嵌入式操作系统μC/OS-Ⅱ上实现Chirp的方法
    发表于 06-15 11:02 1147次阅读
    基于Chirp函数的Nios Ⅱ<b class='flag-5'>嵌入式</b><b class='flag-5'>实现</b>

    嵌入式C编程

    嵌入式C编程,非常有用的资料,介绍嵌入式C语言编程
    发表于 12-29 17:29 0次下载

    基于μC/OS-Ⅱ的嵌入式洗碗机控制器的设计与实现

    关于嵌入式的 基于μC/OS-Ⅱ的嵌入式洗碗机控制器的设计与实现 的学术论文
    发表于 04-20 09:58 12次下载

    嵌入式C实现延时程序的不同变量的区别 几种Linux嵌入式开发环境的简单介绍

    嵌入式C实现延时程序的不同变量的区别 几种Linux嵌入式开发环境的简单介绍 ARM嵌入式开发基
    发表于 04-14 07:24 1622次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>实现</b>延时程序的不同变量的区别 几种Linux<b class='flag-5'>嵌入式</b>开发环境的简单<b class='flag-5'>介绍</b>

    嵌入式堆栈原理是怎么样的如何进行C实现

    栈这种结构在嵌入式其实是非常常用的,比如函数调用与返回就是典型的栈应用,虽然很多时候栈都是CPU系统在自动管理,我们只需要在链接文件分配栈大小以及栈存放位置,但稍微了解一下栈的原理会更加利于我们去理解
    的头像 发表于 02-06 16:23 2841次阅读
    <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>

    FPGA实现嵌入式系统

    FPGA实现嵌入式系统(嵌入式开发报班哪个好)-该文档为FPGA实现嵌入式系统原理资料,讲解的还不错,感兴趣的可以下载看看………………………
    发表于 07-30 09:13 12次下载
    FPGA<b class='flag-5'>实现</b><b class='flag-5'>嵌入式</b>系统