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

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

3天内不再提示

ARM9中断中(C语言)如何实现复位功能,而不是返回中断前的状态?

工程师邓生 来源:未知 作者:刘芹 2023-10-19 16:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

ARM9中断中(C语言)如何实现复位功能,而不是返回中断前的状态?

在ARM9处理器的中断中,当系统发生异常时,处理器会暂停正在执行的指令并处理中断请求。处理中断的方式有两种,一种是通过向处理器发送中断请求信号,触发处理器中断程序的执行;另一种是通过异常处理器,由处理器检测异常事件并自动触发中断程序的执行。

CPU进入中断程序时,它会先保存当前现场的寄存器状态,并将中断的处理程序指针指向中断程序的入口地址。在中断程序的执行过程中,通常会完成一系列的操作,如访问状态寄存器、中断触发寄存器、中断向量表等。而针对本文讨论的问题,我们需要实现复位功能,即当CPU进入中断程序后,不再返回到中断前的状态,而是彻底地进行复位操作。

实现复位功能需要我们进行如下的步骤:

1. 设置复位向量

在ARM9中,复位向量被定义为地址为0x0000 0000的位置。在处理器执行复位操作时,会跳转至该地址,执行复位向量指针所指向的程序代码。在安装复位函数之前,需要先确保复位向量指针正确地指向我们的复位程序。

2. 编写复位函数

复位函数是我们实现彻底复位操作的代码。在该函数中,我们需要清除系统的所有状态和寄存器信息,使其恢复至初始状态。具体而言,我们需要执行如下操作:

- 清除所有CPU寄存器
- 复位所有系统寄存器和状态寄存器
- 清除所有外设寄存器
- 复位系统时钟
- 清除所有中断向量和中断状态寄存器

在完成上述所有操作后,我们需要修改复位向量指针,使其指向我们需要执行的下一条指令地址。通常情况下,这个地址应该是程序的入口地址,以启动系统的正常工作状态。

3. 在中断程序中调用复位函数

在中断处理程序中,我们需要手动调用复位函数,并防止系统返回中断前的状态。具体而言,我们可以在复位函数中修改系统状态寄存器,以防止中断返回执行。例如,对于ARM9,可以使用以下代码:

```
void reset(void) __attribute__((naked));
void reset(void) {
__asm__("cpsid i"); // 禁止中断
__asm__("ldr r0, =0x00000000"); // 设置复位向量指针
__asm__("ldr r1, [r0]"); // 读取复位向量指针
__asm__("mov sp, r1"); // 更新栈指针
__asm__("ldr r0, =SystemInit"); // 加载复位函数
__asm__("bx r0"); // 跳转至复位函数
}
```

在上述函数中,我们首先禁止了中断服务。然后,我们设置了复位向量指针,并用该指针更新了栈指针。接着,我们加载复位函数并跳转至其执行。在函数执行完毕后,我们可以根据需要选择是否启用中断服务。

总之,实现ARM9中断的彻底复位操作需要我们进行复位向量的设置、编写复位函数,并在中断程序中调用该函数并防止中断返回执行。这样可以保证系统处于一个完全初始化和安全的状态,使其能够愉快地进行下一轮的工作!

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

    关注

    135

    文章

    9499

    浏览量

    388555
  • 寄存器
    +关注

    关注

    31

    文章

    5588

    浏览量

    129035
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144556
  • 系统时钟
    +关注

    关注

    1

    文章

    31

    浏览量

    10089
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯源MCU中断相关寄存器

    。 5.5.2 NVIC 中断挂起和清除挂起 在中断发生时,如果系统正在处理与之相同优先级或更高优先级的中断,系统将不会立即处理此中断,而是将
    发表于 11-27 07:23

    C语言在嵌入式开发的应用

    稳定性控制系统(VSC)等关键部件的开发,C 语言都发挥着至关重要的作用。 以工业自动化生产线的运动控制系统为例,C 语言可以编写高效可靠
    发表于 11-21 08:09

    资源状态感知是如何实现对网络链路状态的实时感知的?

    LAN8720A)通过硬件中断机制实时检测链路物理状态: 链路通检测:当网线插拔或交换机端口状态变化时,PHY 芯片的 INT 引脚触发低电平
    的头像 发表于 11-06 14:49 320次阅读

    浅析riscv的plic与eclic

    1.PLIC中断处理 在RISC V体系架构,对中断有着一些定义,下面来分析一下这种定义的实现策略。 在riscv中一共定义了三种状态
    发表于 10-31 07:23

    优比施UPS电源:为关键设备构筑电力“零中断”防线

    1KVA-3KVA在线式UPS电源,以“在线双转换+超宽输入+智能监控”三大核心技术,重新定义了中小机房的电力保护标准。零中断的“电力心脏”:在线双转换技术传统UP
    的头像 发表于 09-18 08:35 331次阅读
    优比施UPS电源:为关键设备构筑电力“零<b class='flag-5'>中断</b>”防线

    STM32G474进入Fault3中断没办法设置成周期性触发吗?

    到最低也不行。想请教下,进入Fault3中断没办法设置成周期性触发吗?这种持续触发中断的方式使程序在中断里出不来怎么办呢?即使把Fault3中断优先级设置到最低15
    发表于 08-01 07:23

    第十章 W55MH32中断应用概览

    本章讲述了W55MH32中断应用,涵盖异常类型、NVIC介绍、优先级定义与分组,阐述中断编程三要点(使能中断、配置 NVIC、编写服务函数),并强调优先级分组设置注意事项。
    的头像 发表于 05-22 17:07 1575次阅读
    第十章 W55MH32<b class='flag-5'>中断</b>应用概览

    STM32中断如此简单(可下载)

    下面我们先来了解一些基本概念:中断中断是什么?举个例子来说,当我们正在工作时,突然电话响了,这时你会把手里的工作先停下来,然后去接电话,当接完电话后,电话里的人安排你马上做一件事,这时你需要立刻去
    发表于 03-24 14:27 1次下载

    单片机中断技术详解

    在现代电子设备,单片机作为控制核心发挥着举足轻重的作用。而在其高效运作的背后,中断机制是推动单片机实现实时响应与高效执行的关键因素。本文将深入探讨单片机
    的头像 发表于 02-02 15:57 1424次阅读

    串口中断是内部中断还是外部中断,串口中断是怎么触发的

    串口中断通常被视为外部中断。虽然串口控制器(如USART、UART等)可能集成在微控制器或处理器的内部,但从中断的角度来看,串口中断是由处理器外部的通信事件触发的。这些事件包括数据的接
    的头像 发表于 01-29 15:03 2619次阅读

    程序中断的100种写法

    在编程实现程序中断的方式取决于所使用的编程语言、硬件平台以及具体的应用需求。虽然没有100种独立的中断
    发表于 01-28 08:25

    STM32串口接受中断使用C++STL的queue导致所有中断失效

    ,FreeRTOS的heap设置为8k 有两个中断,1s触发的定时器中断和串口接收中断 遇到问题 串口发送是没有问题的,如果不是使用STL的queue,所有
    发表于 01-24 10:21

    EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统

    电子发烧友网站提供《EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统.pdf》资料免费下载
    发表于 01-15 16:06 0次下载
    EE-188:使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>在ADSP-219x DSP上<b class='flag-5'>实现</b><b class='flag-5'>中断</b>驱动系统

    让ADS7864的BUSY脚接DSP的外部中断INT0,DSP通过中断来读取采样数据,要不要先关INT0中断呢?

    我让ADS7864的BUSY脚接DSP的外部中断INT0,DSP通过中断来读取采样数据。请问在中断服务程序,要不要先关INT0中断呢?如
    发表于 01-13 06:11

    EE-192:使用C语言在Blackfin处理器上创建中断驱动系统

    电子发烧友网站提供《EE-192:使用C语言在Blackfin处理器上创建中断驱动系统.pdf》资料免费下载
    发表于 01-03 15:03 0次下载
    EE-192:使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>在Blackfin处理器上创建<b class='flag-5'>中断</b>驱动系统