电子发烧友网 > 嵌入式技术 > 正文

嵌入式世界里,堆栈的作用和意义

2020年02月06日 15:57 次阅读

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

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

C语言基础 之 第7章 指针

0 课程大纲介绍和IDE安装1 指针:地址的外号&2 指针与变量3 指针就是一个数4 如何使用一个数据5 一级指针的类型
发烧友学院发表于 2018-12-09 00:00 3105次阅读
C语言基础 之 第7章 指针

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

栈这种结构在嵌入式里其实是非常常用的,比如函数调用与返回就是典型的栈应用,虽然很多时候栈都是CPU系....
发表于 2020-02-06 16:23 24次阅读
嵌入式里堆栈原理是怎么样的如何进行纯C实现

微控制器功耗管理模式:降低功耗的方式

便携式医疗设备的设计人员正面临着一些独特的挑战。医疗照护领域对电子产品的审查控管相当严格,尤其在产品设计的寿命...
发表于 2020-02-06 07:00 132次阅读
微控制器功耗管理模式:降低功耗的方式

Python如此受欢迎的原因是什么

Python带有许多数据可视化的包。Matplotlib 是最为常用的库,可以生成基本的图形和图表。
发表于 2020-02-05 18:37 39次阅读
Python如此受欢迎的原因是什么

嵌入式的CPU自定义指令有什么特点

Arm的自定义指令最早将在2020年上半年在ArmCortex®M33CPU中开展,而新的和现有的被....
发表于 2020-02-05 17:32 506次阅读
嵌入式的CPU自定义指令有什么特点

搞嵌入式,为啥要有uboot?

搞嵌入式的,为啥要有uboot?
发表于 2020-02-05 12:00 213次阅读
搞嵌入式,为啥要有uboot?

#define的高级用法简介

#define的高级用法
发表于 2020-02-05 11:50 59次阅读
#define的高级用法简介

C语言到底是不是真的过时了吗

现在说到编程,大家提得更多的似乎永远是前端、后端、小程序、Android App、iOS App,但....
发表于 2020-02-05 11:02 150次阅读
C语言到底是不是真的过时了吗

第三版HBM2存储标准发布,环比提升33%

按照设计规范,单Die最大2GB、单堆栈12 Die(无标准高度限制),也就是24GB容量,匹配10....
发表于 2020-02-04 17:34 262次阅读
第三版HBM2存储标准发布,环比提升33%

基于RapidIO互连构架实现双主机节点通信系统...

随着嵌入式系统对信号处理性能和数据传输性能的不断提高,单纯依靠提高处理器性能来改善系统性能的方法已无....
发表于 2020-02-04 11:55 69次阅读
基于RapidIO互连构架实现双主机节点通信系统...

嵌入式和互联网行业应该如何选择

我的看法是:首先考虑自己个人的兴趣,这两个行业的模式、思维、市场还是有较大不同。
发表于 2020-02-03 14:49 218次阅读
嵌入式和互联网行业应该如何选择

基于嵌入式Internet技术实现网络打印服务器...

随着信息技术的发展和网络时代的到来,基于TCP/IP协议的嵌入式Internet技术越来越受到人们的....
发表于 2020-01-22 10:47 151次阅读
基于嵌入式Internet技术实现网络打印服务器...

基于排爆机器人PBJ-1的嵌入式控制系统的设计与...

但是国外的排爆机器人价格过高,出现故障后维修特别不方便。因此国家863专家组已经将高性能排爆机器人的....
发表于 2020-01-22 10:36 192次阅读
基于排爆机器人PBJ-1的嵌入式控制系统的设计与...

基于ARM9、Linux与CAN总线实现应用于橡...

橡塑机械是现代制造技术中一类重要工具,是一种由数控装置、伺服驱动装置、机床主体和其他辅助装置构成的机....
发表于 2020-01-22 10:20 413次阅读
基于ARM9、Linux与CAN总线实现应用于橡...

嵌入式系统的物联网存在什么价值

嵌入式系统在物联网应用中,已经扮演着越来越重要的角色。
发表于 2020-01-21 17:51 47次阅读
嵌入式系统的物联网存在什么价值

关于嵌入式系统中USB主机方式的应用

USB 就是指通用串行总线(Universal Serial Bus),是计算机外围设备通讯的总线标....
发表于 2020-01-21 10:07 51次阅读
关于嵌入式系统中USB主机方式的应用

德承P2100系列嵌入式系统问市 搭载模块化设计...

德承是专业的嵌入式计算机制造商,推出了P2100系列嵌入式计算机(含P2102 和P2102E)。P....
发表于 2020-01-21 00:42 304次阅读
德承P2100系列嵌入式系统问市 搭载模块化设计...

通过利用UART与若干器件进行连接解决通信问题

在各种外围的设备中,使用了通用的异步接收和发送(UART)接口。例如,一个基于微控制的系统有四个这样....
发表于 2020-01-20 17:17 336次阅读
通过利用UART与若干器件进行连接解决通信问题

如何实现嵌入式应用的人机界面交互性设计

用户界面设计是屏幕产品的重要组成部分,它为人机交互构建了一个沟通环境。其中交互性设 计是用户界面设计....
发表于 2020-01-19 10:46 106次阅读
如何实现嵌入式应用的人机界面交互性设计

设计嵌入式驱动程序有哪些小窍门

每一个嵌入式应用软件都会在某些时候访问最底层的固件和进行一些硬件控制。 驱动的设计和实施是确保一个系....
发表于 2020-01-18 12:07 312次阅读
设计嵌入式驱动程序有哪些小窍门

增加嵌入式存储交换技术可靠性的解决方案

嵌入式存储交换技术还是比较常用的,于是我研究了一下如何增加嵌入式存储交换技术的可靠性,在这里拿出来和....
发表于 2020-01-18 09:06 278次阅读
增加嵌入式存储交换技术可靠性的解决方案

实现低功耗嵌入式设计的多种优化方式

不是所有便携式系统都像图1(参见本系列文章的第二部分)所示的系统这么简单。图3给出了可穿戴电子设备的典型方框图。由...
发表于 2020-01-17 08:00 906次阅读
实现低功耗嵌入式设计的多种优化方式

ARM cortex-A53是否支持硬件预取、整型流水线的个数等相关参数

已经查阅了A53的手册没有找到相关的答案,自己有刚刚接触这方面,老大给的任务,希望有大佬帮忙指点一下,或是有相关...
发表于 2020-01-16 20:32 359次阅读
ARM cortex-A53是否支持硬件预取、整型流水线的个数等相关参数

Orange Pi Zero开发板在Armbian系统下如何使用声卡功能

在使用Orange Pi Zero开发板时,安装Armbian的系统,有开发者反馈找不到声卡,这是因为声卡的功能是在Zero的转接...
发表于 2020-01-16 19:42 3365次阅读
Orange Pi Zero开发板在Armbian系统下如何使用声卡功能

嵌入式串口网关怎样实现多串口转换

TCP/IP 协议由应用层、UDP 层、IP 层和数据链路层组成。为了实现透明传输,增加应用进程协议....
发表于 2020-01-16 17:43 112次阅读
嵌入式串口网关怎样实现多串口转换

采用PC/104嵌入式模块与1553B总线卡实现...

随着我国航空事业的迅速发展,各种新型飞机和发控设备相继研制成功,以往一些测控设备在功能和性能上已无法....
发表于 2020-01-16 10:17 373次阅读
采用PC/104嵌入式模块与1553B总线卡实现...

利用W3150A+芯片和LPC2292微控制器实...

通过以太网进行传输已经成为一种经济、有效的数据传输方式。越来越多的工业测控设备需要配置网络接入功能,....
发表于 2020-01-16 10:14 297次阅读
利用W3150A+芯片和LPC2292微控制器实...

IDRS分布式网络远程监控系统的特点性能及应用设...

视频工作站是监控中心的核心监控设备,即“网络监控录像主机”,负责具体连接前端网络摄像机,提供所有远程....
发表于 2020-01-16 09:53 201次阅读
IDRS分布式网络远程监控系统的特点性能及应用设...

利用嵌入式系统与Internet相连接实现Web...

在硬件系统的设计中,本文采用了ATMEL公司开发的高性能8位AVR(Advanced RISC)单片....
发表于 2020-01-16 09:47 188次阅读
利用嵌入式系统与Internet相连接实现Web...

利用嵌入式网络模块实现计算机实验平台设计

《计算机网络》课程是大学计算机及相关专业开设的一门计算机与通信的专业课程。本课程具有很强的实践性,很....
发表于 2020-01-16 09:46 346次阅读
利用嵌入式网络模块实现计算机实验平台设计

嵌入式DVR的应用技术方案及发展趋势

目前,DVR的技术发展方向有三个,即智能化、集成化、网络化。要预测嵌入式DVR的技术发展趋势,首先要....
发表于 2020-01-16 09:45 276次阅读
嵌入式DVR的应用技术方案及发展趋势

基于VxWorks嵌入式实现多串口驱动的开发与通...

VxWorks操作系统是美国Wind River公司于1983年设计开发的一种嵌入式实时操作系统(R....
发表于 2020-01-16 09:37 346次阅读
基于VxWorks嵌入式实现多串口驱动的开发与通...

嵌入式DVR技术方案的组成及发展分析

二十世纪九十年代末,伴随着电脑技术、图像处理技术和网路技术的发展与普及,兴起了数字化监控浪潮,而PC....
发表于 2020-01-16 09:36 230次阅读
嵌入式DVR技术方案的组成及发展分析

在Linux操作系统上实现无线接入点AP的设计

20世纪90年代以来,随着个人数据通信的发展,为了实现任何人在任何时间,任何地点均能实现数据通信的目....
发表于 2020-01-16 09:34 390次阅读
在Linux操作系统上实现无线接入点AP的设计

基于ARM嵌入式系统与Internet网络技术实...

基于Internet网络的在线监控模式,一方面运行在Web服务器上的CGI程序根据客户端浏览器的请求....
发表于 2020-01-16 09:25 124次阅读
基于ARM嵌入式系统与Internet网络技术实...

多通道数字硬盘录像机结构及系统特点分析

随着现代电子技术的发展,尤其是近年来编解码技术、多媒体通信技术以及嵌入式技术的日趋成熟,一大批有着崭....
发表于 2020-01-16 09:22 244次阅读