您的位置 首页 解答

嵌入式国际里,仓库的效果和含义

嵌入式世界里,堆栈的作用和意义-头文件还是用 stack.h,改动的并不是很多,增加了 stack_size 变量取代 STACK_SIZE 来保存堆栈的长度,数组由一个指针来代替,在全局变量下缺省为 0。

栈这种结构在嵌入式里其实是十分常用的,比方函数调用与回来便是典型的栈运用,尽管许多时分栈都是 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 源代码如下:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/97377.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部