精华内容
下载资源
问答
  • mcu中断堆栈
    2021-12-31 10:26:01

    当mcu进入中断,堆栈指针sp会指向堆栈开始地址,寄存器ACC,B,DPH,DPL,PSW,r0-r7会被压入栈内,如果中断中有子函数,那么就会把调用子函数的地址的下一个地址压栈。如果是多个子函数按顺序运行,那么就会共用同一地址压栈,如果子函数中又有嵌入子函数,那么就会多一级地址压栈。

    更多相关内容
  • 首先介绍了多任务实时操作系统的多任务实现原理及ARM芯片的特点,在此基础上以ARM芯片为例,详细分析了在发生中断时如何实现中断现场的保护以及一般嵌入式操作系统的多任务切换过程,并列出代码给予说明。
  • UCOS操作系统堆栈浅谈

    2020-08-10 15:11:19
    在uc/os-ii操作系统的任务切换和中断处理过程中,需要保存处理器的内部寄存器和变量的值,这就要求每个任务都有自己的堆栈空间。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成,可以静态分配空间(在编译...
  • 1. 中断,异常,系统调用相同:    CPU自动压入: ... esp 运行级别提升需切换堆栈,因此多压入用户态的堆栈指针esp,  eflag  cs  eip  error code  程序压入部分压入如下寄存器:  es  ds
     1. 中断,异常,系统调用相同:
     
      CPU自动压入:

      ss            运行级别提升时需切换堆栈,因此多压入用户态的栈段ss,
      esp           运行级别提升时需切换堆栈,因此多压入用户态的堆栈指针esp,
      eflag
      cs
      eip
      error code

      程序压入部分压入如下寄存器:

      es
      ds
      ebp
      edi
      esi
      edx
      ecx
      ebx

      但是压入的方法各不相同,见entry.S。#define SAVE_ALL,和pt_reg的关系?

      a. 异常:
    ENTRY(divide_error)
        pushl$0            #no error code  Wood: 当没有硬件错误码时,在栈中垫上一个空值。
        pushl $do_divide_error    # 压入返回地址
        ALIGN
    error_code:
        pushl %ds
        pushl %eax
        xorl %eax, %eax
        pushl %ebp
        pushl %edi
        pushl %esi
        pushl %edx
        decl %eax            # eax = -1
        pushl %ecx
        pushl %ebx
        cld
        movl %es, %ecx
        movl ES(%esp),%edi        # get the functionaddress   ES = 0x20 得到异常高级处理函数地址,见 pushl $do_divide_error
        movl ORIG_EAX(%esp), %edx    # getthe error code,ORIG_EAX    = 0x24,到硬件错误码,见pushl$0,如果CPU压入,则这里不需要压入。这里是为高层函数准备第二个参数error code,因为高层函数全部是fastcall类型的函数
        movl %eax, ORIG_EAX(%esp)   # 把-1存在原来放硬件错误码的地方,这个值用来把0x80异常与其他异常隔离开。?????
        movl %ecx, ES(%esp)         #把 %es的值存入原来放异常高级处理函数地址的位置。
        movl $(__USER_DS), %ecx
        movl %ecx, %ds
        movl %ecx, %es
        movl%esp,%eax           # pt_regs pointer,当前栈指针,这里是为高层函数准备第一个参数pt_regs,因为高层函数全部是fastcall类型的函数
        call *%edi
        jmp ret_from_exception

    ENTRY(page_fault)
        pushl $do_page_fault
        jmp error_code

      b. 中断:


    2. 进程切换

    更新中:

    展开全文
  • 堆栈指针是什么_有什么作用

    千次阅读 2021-07-22 00:59:51
    描述堆栈指针总是指向栈顶位置。一般堆栈的栈底不能动,所以数据入栈前要先修改堆栈指针,使它指向新的空余空间然后再把数据存进去,出栈的时候相反。堆栈指针,随时跟踪栈顶地址,按“先进后出”的原则存取数据。...

    描述

    堆栈指针总是指向栈顶位置。一般堆栈的栈底不能动,所以数据入栈前要先修改堆栈指针,使它指向新的空余空间然后再把数据存进去,出栈的时候相反。堆栈指针,随时跟踪栈顶地址,按“先进后出”的原则存取数据。

    堆栈指针是什么

    栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。

    计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。

    堆栈指针是在栈操作过程中,有一个专门的栈指针(习惯上称它为TOP),指出栈顶元素所在的位置。

    堆栈指针总是指向栈顶元素。

    堆栈可以使向下生长的(向低地址),也可以是向上生长的。

    如果堆栈是向上生长的,数据入栈的时候,堆栈指针先加1,再压栈。出栈的时候先弹出数据,堆栈指针再减1。如果堆栈是向下生长的,数据入栈时指针将减1,数据出栈时指针将加1。

    堆栈指针有什么作用?

    堆栈指针SP在片内RAM128B中开辟栈区,并随时跟踪栈顶地址。它是按“先进后出”的原则存取数据。开机复位后,单片机栈底地址为07H。

    主要用来保存临时数据,局部变量和中断/ 自程序的返回地址。堆栈指针总是指向栈顶元素。所以数据入栈的时候,堆栈指针先加1,再压栈。向上增长方式与计算机的方式一样。

    出栈的时候先弹出数据,堆栈指针再减1。

    如果堆栈的实现是往上长的(就是说往顶的方向长,其实质是栈底是定死的不能动,入栈的东西只能不断往上叠,这就像在书桌上放书一样; 桌底是定死的,所以书只能一本一本地往上堆,往上长),计算机内部的堆栈的实现采取的就是这种模式,所以就得像你说的那样,“先修改指针,然后插入数据,出栈时刚好相反“,因为堆栈指针指向的总是栈顶元素,栈底不能动,所以数据入栈前要先修改指针使它指向新的空余空间然后再把数据存进去,出栈的时候自然相反。

    然而,如果堆栈的实现是往下长的(就是说每压一个元素入栈,栈底就自动下移一个元素的位置,其实质就是这种堆栈模型是一个“无底洞”型),这个时候,栈顶就变成了定死的,就可以先压入元素,然后再修改指针。因为栈底是无限的,压入一个元素,新的元素就取代先前的栈顶元素占据栈顶的位置,那么先前的指向栈顶元素的指针这个时候就该修改让它指向这个新的栈顶元素了。

    下面的就是对“无底洞“型堆栈的一种实现的描述:

    压栈(入栈) :将对象或者数据压入栈中,更新栈顶指针,使其指向最后入栈的对象或数据。

    弹栈(出栈) :返回栈顶指向的对象或数据,并从栈中删除该对象或数据,更新栈顶。

    话说回来,计算机内部肯定选第一种模型,不会选第二种,因为第二种模型,每压入一个新的元素,都需要把之前堆栈里的所有元素整体下移动一个元素的位置,腾出栈顶元素的位置让新的元素进来,这种平移可是一笔不小的开销啊! 但是 并不是说“无底洞”模型就没办法实现了,其实它可以通 过第一种模型来模拟的,每需要压入一个新的元素的时候,就先开辟一个空间,数据存入这个空间,然后再修改栈顶元素指针使其指向这个新的栈顶元素。

    这就意味着,如果使用的是链表的话,只要有足够的空间可开辟出来作为一个节点,那么两种堆栈模型都能实现(当然“无底洞“型还是如我上面说的那样用第一种模拟出来的,否则平移的工作量相当可观),如果用数组,由于数组在内存中是连续分配出来的空间,用第一种模型更自然一些。

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 单片机中的中断系统对电子工程师来...在发生中断时,断点地址被首先压入硬件堆栈,而现场的一些参数须用户通过软件保存,必须保存的寄存器包括W寄存器、程序寄存器的高位字节PCLATH及状态标志寄存器STATUS等,另外一些
  • ARM9 S3C2410中断程序的堆栈图解析方法.pdf
  • 本文介绍了三个查找计算堆栈的使用情况的方法。
  • 堆栈概述堆栈的基本操作堆栈指针(SP)堆栈的管理方法 概述 大家,在工作的途中急急...如果在执行主例程发生“异常处理”等,则会中断主例程,但会将此时的寄存器和程序计数器的值等暂时保存到内存区域(通常是RAM)中(P

    概述

    大家,在工作的途中急急忙忙的新工作进入的时候,到那之前做的工作的内容暂时转移到别的地方,开始新的工作,对吧?当匆忙的新工作结束后,我会重新开始刚才中断的原来的工作。此时,将“暂时转移原来的工作内容的地方”,在微型计算机的情况下称为“堆栈”。

    现在的工作是主例程,新的工作是“异常处理(中断等)”和“函数处理(子例程等)”。如果在执行主例程时发生“异常处理”等,则会中断主例程,但会将此时的寄存器和程序计数器的值等暂时保存到内存区域(通常是RAM)中(PUSH/推入)。这个存储区被称为“堆栈”或“堆栈区域”。然后,在返回主例程时,将“堆栈”的内容返回到原始寄存器(POP/流行)。

    指向“堆栈”在内存区域中的寄存器被称为“堆栈指针”。通常,“堆栈指针”指向RAM中“堆栈区域”的地址(见图1)。
    图1

    堆栈的基本操作

    在微型计算机的主例程执行过程中,如果发生异常处理(中断、错误等)或函数执行导致的子例程,则微型计算机会中断主例程,并暂时存储返回所需的信息,例如正在操作的寄存器的值和正在运行的程序计数器(以下简称PC)。它的存储位置被称为“堆栈”。堆栈需要使用快速可访问的内存,所以通常使用内置RAM。然后将表示保管地点的寄存器称为“堆栈指针(以下称为SP)”。SP通常包含存储位置的内置RAM的地址值。

    返回主例程所需的信息称为“上下文”,临时存储操作称为“PUSH(推/退)”。中断处理等结束后,微型计算机返回主例程时,恢复堆栈的内容。此操作称为“POP(流行/恢复,恢复)”。

    如果堆栈是能够高速访问的存储设备,则不需要特别是RAM,因此有些微型计算机使用寄存器组作为堆栈。

    堆栈指针(SP)

    首先,堆栈(Stack)是堆叠的意思。因此,微型计算机所说的堆栈就是一个接一个地积累和保存上下文。
    也就是说,当上下文存储在堆栈中时,它以从SP指示的地址顺序堆叠的图像存储。我说过“堆叠”,但在实际的微型计算机中,SP经常被减去,并存储在地址较少的方向上。

    与通用寄存器不同,SP被分类为特殊寄存器,例如PC和状态寄存器(通常称为CCR)。初始值由用户设置。配置方法可以通过软件进行,也可以通过硬件进行。什么方式设置取决于产品规格。

    硬件堆栈和软件堆栈

    当发生异常处理并堆叠上下文时,通常由硬件(中断控制器)执行。这被称为“硬件堆栈”。另一方面,当通过函数执行执行子例程时,软件使用PUSH指令将上下文保存在堆栈中,并在返回时使用POP指令进行POP。像这样使用软件进行堆栈的情况称为“软件堆栈”。

    展开全文
  •  中断堆栈设置和ARM体系结构紧密相关,ARM是一种支持多任务操作的系统内核,内部结构完全适应多任务应用。ARM内核支持7种中断,不同的中断处于不同的处理模式(如表1所示),具有不同的优先级,而且每个中断都有...
  • 基于arm的操作系统中断堆栈分析及实现,对于arm系统的中断和堆栈分析调试有帮助
  • 在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,...子程序调用和中断服务CPU自动将当前PC值压栈保存,返回自动将PC值弹栈。保护现场/恢复现场数据传输...
  • 中断作用

    万次阅读 2018-05-15 10:31:36
    所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务...
  • (原因:ARM Cortex M处理器在发生中断的时候,会在LR寄存器R14里保存一个特殊值,从而在使用一个普通的函数返回指令,CPU根据这个值知晓自己是一个中断返回。) 特征: ① 中断服务子程虽然会写为一个C语言函数,...
  • 如果一个中断产生任务正在用户代码中执行,那么该中断会引起CPU特权级从3到0的变化,此时CPU就会运行用户态堆栈到内核态堆栈的切换操作。CPU会从当前任务的任务状态段TSS中取得新堆栈的段选择符和偏移量。因为中断...
  • 该eCos组件提供中断堆栈信息的获取,包括堆栈基址、分配空间大小、已使用大小,主要用于中断堆栈溢出的风险评估,依据堆栈的使用情况对堆栈空间分配进行调整。 组件安装和使用请阅读...
  • 本文引用地址:http://www.eepw.com.cn/article/201611/321963.htm ... 堆栈是一种具有“后进先出”(LIFO---Last In First Out)特殊访问属性的存储结构。堆 栈一般使用RAM 物理资源作为存储体,再加上LI...
  • PIE/CPU中断响应过程

    2021-01-06 13:17:28
    I、CPU响应,进入中断服务子程序前,DSP硬件自动将IFRx清0,然后将CPU内一些关键寄存器如:ST0、ST1及IER等的内容压到堆栈保存起来,随后硬件自动将IERx清0,INTM置1,以避免中断嵌套,在中断服务子程序执行完返回后...
  • 基于arm的操作系统中断堆栈分析及实现
  • 进程在执行的时候,必然会使用到系统调用或者中断,按照SDM中的描述,中断发生,硬件会自动切换堆栈到内核堆栈: 这个切换后的堆栈的地址是存放在TSS中ESP0(或RSP0)中的: 问题是RSP0中存放的到底是哪个...
  • 子程序调用和中断服务CPU自动将当前PC值压栈保存,返回自动将PC值弹栈。 保护现场/恢复现场 数据传输 单片机堆栈原理: 堆栈区由特殊功能寄存器堆栈指针SP管理 堆栈区可以安排在 RAM区任意位置,一般不安排在...
  • 近几年来,随着后PC时代的来临,具有简洁、高效等特点的嵌入式系统得到了...中断产生,由专用的中断程序接管系统,首先把所有的CPU寄存器内容保存到堆栈里,并引导系统指向中断向量表。在中断程序执行后的一段时间
  • 如果要你讲一下中断,你会怎么去描述一个中断的触发流程呢?... 当多个中断源同时提出中断请求中断系统如何确定优先响应哪个中断请求? CPU在什么条件、什么时候、以什么方式来响应中断? ..
  • 单片机堆栈指针.doc

    2020-11-25 09:19:36
    单片机堆栈指针 堆栈指针sp在片内RAM128B中开辟栈区并随时跟踪栈顶地址它是按先进后出的原则存取数据开机复位后单片机栈底地址为07H 主要用来保存临时数据局部变量和中断/自程序的返回地址 堆栈指针总是指向栈顶元素...
  • 1、聊一聊 虽然没有第13个月,但和大家有着无数个明年,就用一首《飞鸟和蝉》告别2020年的一切吧!2、正文部分1先说几句前些日子bug交流群里的小哥调试了一个堆栈溢出的bug...
  • 中断返回指令是无条件的,并且总是执行将程序堆栈中最后一个地址重新送给程序计数器的操作。中断返回也能够恢复中断时刻(中断现场)的标志位。在该指令中包含有中断使能(ENABLE)和中断屏蔽(DISABLE)控制位,以决定...
  • FreeRTOS中的堆栈计算

    2021-10-31 15:12:52
    函数调用的现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间。 2.检测堆大小 xPortGetFreeHeapSize() 可以获取调用堆中空闲内存的大小,以字节为单位。使用它可以优化堆的大小。需要...
  • 决定栈空间的大小,不仅需要计算任务...堆栈作用的就是用来保存局部变量,从实质上讲也就是将CPU寄存器的值保存到RAM中。在uCOS中,每一个任务都有一个独立的任务堆栈。为了深入理解任务堆栈的作用,不妨分析任务...
  • 单片机堆栈解析

    千次阅读 2019-12-23 21:59:16
    堆区(HEAP):一般由程序员分配释放, 若程序员不释放,程序结束可能由OS回收。在单片机的sram中的ZI-data中。由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。在没有释放之前一直...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,387
精华内容 43,754
关键字:

中断时堆栈的作用