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

    文章

    8653

    浏览量

    361831
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117746
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128790
  • 系统时钟
    +关注

    关注

    1

    文章

    30

    浏览量

    9014
收藏 人收藏

    评论

    相关推荐

    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

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

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

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

    S3C2410是一款由三星电子公司设计的具有多种功能的嵌入式处理器。其中的中断控制模块用于管理系统的中断请求和中断服务程序。在S3C2410中,中断
    的头像 发表于 01-05 17:28 228次阅读

    arm中断是怎么实现

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

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

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

    中断ARM体系中对中断的处理

    今天来看一下中断ARM体系中对中断的处理,直接进入正题。 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又
    的头像 发表于 11-07 17:11 267次阅读
    <b class='flag-5'>中断</b>及<b class='flag-5'>ARM</b>体系中对<b class='flag-5'>中断</b>的处理

    如何配置GPIO为中断功能

    Manual_V1.0(Draft).pdf》的<10.6 port control>小节。另外,不是所有引脚都有中断功能中断
    发表于 10-26 17:38

    ARM中的异常中断是如何实现进入中断程序的?如何进入呢?

    ARM中的异常中断是如何实现进入中断程序的?如何进入呢? 在计算机系统中,异常和中断是两个常见的概念。 在
    的头像 发表于 10-19 16:36 566次阅读

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程  ARM处理器是一种广泛使用的嵌入式处理器,运行着各种不同类型的应用程序。为了保
    的头像 发表于 10-19 16:35 820次阅读

    C51中断函数和汇编语言中断服务程序在用法上有什么不同?

    C51中断函数和汇编语言中断服务程序在用法上有何不同?
    发表于 10-17 08:31

    arm中断是怎么实现

    arm中断是怎么实现的  首先,了解什么是中断中断是指在CPU执行某个程序时,突然发生的一些事件需要CPU立即停止正在执行的程序并去执行该
    的头像 发表于 09-05 16:22 672次阅读

    8051中断的编号系统应用说明

    我们接到许多客户打来的电话,他们对8051中断的编号系统感到困惑。本应用程序说明说明了如何在程序声明中断,以及中断编号的来源。
    发表于 09-04 07:29

    ARM C语言扩展规范

    的应用程序程序员  系统程序员需要对ARM目标的低级访问,不是C/C++所提供的访问权限  编译器
    发表于 08-02 06:27