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
    +关注

    关注

    134

    文章

    9040

    浏览量

    366719
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119975
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136114
  • 系统时钟
    +关注

    关注

    1

    文章

    30

    浏览量

    9293
收藏 人收藏

    评论

    相关推荐

    stm32怎样触发软件中断

    其中实现所需的功能。 触发软件中断 在STM32,您可以使用NVIC_SetPendingIRQ()函数来触发软件
    的头像 发表于 09-02 09:32 612次阅读

    PLC中断功能的作用及使用方法

    在工业自动化控制系统,PLC(Programmable Logic Controller,可编程逻辑控制器)作为核心的控制单元,承担着处理各种控制逻辑、实现自动化操作的重要任务。中断
    的头像 发表于 06-15 17:54 1795次阅读

    请问tim2中断函数里怎么触发tim1的中断

    tim2中断函数里怎么触发tim1的中断
    发表于 04-10 06:37

    STM32中断分组及外部中断的配置过程分享

    STM32中断分组   STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0
    发表于 04-08 08:05

    如何实现SysTick中断的嵌套自身?

    中断直接退出到我想要执行的调度函数RTTaskSchedule ,执行完调度函数RTTaskSchedule 后再执行函数IrqReturn返回到main。但是这段代码并不能实现我想
    发表于 03-25 06:20

    STM32F103RCT6 uart1中断方式接收后不返回主程序了,但新的中断还能进来是怎么回事?

    uart1中断方式接收后不返回主程序了,但新的中断还能进来,芯片型号STM32F103RCT6 void HAL_UART_RxCpltCallback(UART_HandleTypeDef
    发表于 03-22 07:01

    单片机中断功能及其应用

    单片机中断功能及其应用  单片机中断是指在程序执行过程,根据特定的条件或事件自动暂时中断当前程序的执行,转而执行特定的
    的头像 发表于 01-30 14:45 4932次阅读

    N76E003开了一个定时器0中断和串口0中断,两个中断打开后,串口发送数据无法进入中断的原因?

    N76E003开了一个定时器0中断和串口0中断,两个中断打开后,串口发送数据无法进入中断,单独使用没有什么问题,还望各位指教
    发表于 01-17 06:44

    s3c2410中断控制模块的中断状态寄存器是?

    事件的寄存器。 中断是计算机系统中一种重要的机制,它可以中断当前的程序执行,转而执行一个与当前事件相关的特定程序,然后再返回原来的程序继续执行。S3C2410
    的头像 发表于 01-05 17:28 653次阅读

    arm中断是怎么实现

    ARM中断实现是通过中断控制器和异常模式实现的。ARM处理器通过
    的头像 发表于 01-05 15:18 828次阅读

    stm32中断怎么处理的

    STM32是一款非常强大的微控制器系列,具有丰富的外设和功能中断是STM32非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细介绍STM32中断的处理方法。 一、
    的头像 发表于 01-02 17:35 2451次阅读

    ADE7753开启了过零中断和线周期中断,可是没有过零中断产生只有周期中断产生是为什么?

    开启了过零中断和线周期中断,可是没有过零中断产生,只有周期中断产生,用示波器测了channel2的两个管脚的波形是周期为20ms的正弦波。
    发表于 12-27 07:05

    深入解析中断处理在MCU开发的关键步骤

    中断向量表都是链接到代码的最前面,比如一般 ARM 处理器都是从地址 0X00000000 开始执行指令的,那么中断向量表就是从 0X00000000 开始存放的。代码第 1 行
    发表于 12-15 16:34 1481次阅读
    深入解析<b class='flag-5'>中断</b>处理在MCU开发<b class='flag-5'>中</b>的关键步骤

    8051单片机中断系统过程

    一个特定的中断服务程序(Interrupt Service Routine ISR),处理完中断请求后再返回中断
    发表于 12-05 09:15 0次下载

    中断相关知识和运用

    中断返回实现上述中断功能的部件称为中断系统(中断
    发表于 12-05 08:48