几乎所有编程语言都有异常,可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题,下面给大家分享一下。

一、Arm的中断。
1.触发异常
2.保存现场
3.cpu进入异常工作模式,程序指针(pc)跳入异常入口(处理异常的代码地址)
a.分辨中断源
b.进行逻辑处理
c.清理工作
4.恢复现场
流程图(来源于《2440数据手册》)如下:

这里的工作模式,其实就是不同情况下,cpu有一组不同的寄存器。正是有了不同的寄存器,程序在可以在不同的状态下来回切换。如下图:

中断例子的汇编代码如下:

b Reset

@******************一堆设置代码已省略************************************************* Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
msr cpsr_c, #0xd2 @ 进入中断模式,d的前两位是11,意思是关闭所有的中断
ldr sp, =3072 @ 设置中断模式栈指针
msr cpsr_c, #0xd3 @ 进入管理模式
ldr sp, =4096 @ 设置管理模式栈指针,
@ 其实复位之后,CPU就处于管理模式,
@ 前面的“ldr sp, =4096”完成同样的功能,此句可省略
bl init_led @ 初始化LED的GPIO管脚
bl init_irq @ 调用中断初始化函数,在init.c中
msr cpsr_c, #0x53 @ 设置I-bit=0,开IRQ中断
ldr lr, =halt_loop @ 设置返回地址
ldr pc, =main @ 调用main函数
halt_loop:
b halt_loop
@中断函数
HandleIRQ:
sub lr, lr, #4 @ 计算返回地址,arm架构规定的
stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器,保存现场
@ 注意,此时的sp是中断模式的sp
@ 初始值是上面设置的3072
ldr lr, =int_return @ 设置调用ISR即EINT_Handle函数后的返回地址
ldr pc, =EINT_Handle @ 调用中断服务函数,在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr

EINT_Handle 函数的实现就是判断是那个按钮然后点相应的灯,我这里就不复制代码了。
msr cpsr_c指令值的来源如下图(来源于《嵌入式Linux应用开发完全手册》):


二、java中的异常,很简单。
try{
}catch(Exception e){
}finally{
}
不用关心什么工作模式,catch中代码命中就执行,finally里的代码一定会执行。根据自己的逻辑来写就行了。

java中的中断,Thread有个interrupt方法,但调用这个方法并不知道线程会在什么状态下中断,我没有用过这种方式。需要中断的话,我一般自己写个状态变量,在while里判断中断状态做下处理。

三、硬件实现中断。
用继电器就可以实现开关,如下图:

给线圈一点电压就能切换这个开关,也就能触发工作模式的切换了。

转载于:https://www.cnblogs.com/chengzhong/p/7658417.html

智能小车37:异常在ARM、JAVA、硬件里的实现相关推荐

  1. 基于Arduino和Blynk平台的远程控制智能小车

    /------转载请附上本文链接 https://www.cnblogs.com/blogs-192-168-9-222/p/11506638.html -------啦啦啦我是快乐的分割线- --- ...

  2. qt5 tcp服务器编程 多固定客户_如何编程实现电脑与智能小车通信?

    51智能小车编程 最近在做智能小车,需要实现编写上位机控制智能小车行驶方向与运行速度.因此首先需要解决的问题就是需要考虑如何实现计算机与智能小车进行通信.所使用硬件设备主要包括51单片机开发板.ESP ...

  3. 自动跟随小车c语言,智能小车跟随系统的设计与制作.doc

    本科毕业论文(设计) 题目: 智能小车跟随系统的设计与制作 学院: 物理与电子科学学院 班级: 姓名: 指导教师: 职称: 完成日期: 年 月 日 PAGE \* MERGEFORMAT PAGE \ ...

  4. 动手做一个简单的智能小车

    动手做一个简单的智能小车 来到CNDN一年了,看到了许多大佬的杰出作品.也该写点什么来回馈给大家了前不久接触了单片机,想提前进行实践一下所以有想法做一个实体出来,想来想去难的怕自己搞不定,但是还好找到 ...

  5. 无线wifi智能小车项目java,项目案例:智能小车

    1.智能小车项目案例演示 2.智能小车项目背景 所谓智能汽车,主要指在普通汽车的基础上增加了先进的传感器(雷达.摄像).控制器.执行器等装置,通过车载传感系统和信息终端实现与人.车.路之间的智能信息交 ...

  6. 备赛电赛学习硬件篇(七):智能小车底板设计,暂时停更该系列

    一.智能小车底板 亚克力板和铝合金板直接用相对应的建模软件去设计然后发给厂商就行,设计方法和pcb大同小异,车的底板需要整体对于车有一个良好的了解,即需要知道这个车需要什么样的模块,每个模块之间的关系 ...

  7. 用java制作一个软件控制小车_Android手机控制智能小车的手机端程序(完整版)...

    [实例简介] 本程序是我写的Android手机控制智能小车的手机端的全部的源程序,下载后直接就能用. [实例截图] [核心代码] 624ba65e-a75e-4ba0-8e72-6dbc0823fcb ...

  8. 【记录】本科毕设:基于树莓派的智能小车设计(使用Tensorflow + Keras 搭建CNN卷积神经网络 使用端到端的学习方法训练CNN)

    0 申明 这是本人2020年的本科毕业设计,内容多为毕设论文和答辩内容中挑选.最初的灵感来自于早前看过的一些项目(抱歉时间久远,只记录了这一个,见下),才让我萌生了做个机电(小车动力与驱动)和控制(树 ...

  9. 智能小车 + 机械臂——华为嵌入式精英挑战赛

    文章目录 选题说明 选题方向 竞赛开发平台 创新点描述 成果展示 选题说明 利用智能小车与机械臂结合,在智能小车自身能够实现的功能的基础上,拓宽功能,使之得到最大化的利用,提高其利用价值. 智能小车可 ...

最新文章

  1. 基于RDP开源许可rdesktop基本介绍
  2. SSL 握手协议详解
  3. python常用异常处理
  4. python.re模块
  5. Hadoop入门经典:WordCount
  6. 美国影视演员协会选择了Windows Azure
  7. Android免费短信验证
  8. easyExcel实现Excel导出功能
  9. ide 两个模块的jdk版本不一样_Java平台模块系统(3)- JDK工具
  10. python机器学习彩票_Python机器学习及实战kaggle从零到竞赛PDF电子版分享
  11. 官网jquery压缩版引用地址
  12. redis 8种淘汰策略
  13. 教你如何显示出文本文档的后缀名
  14. Ubuntu环境下读取罗技G29方向盘信息
  15. 应用密码学(张仕斌)第四章
  16. 【论文写作】使用overleaf撰写你的会议论文
  17. 【直线检测】基于LSD实现直线检测含Matlab源码
  18. 总结:IP地址、网络地址与子网掩码的理解
  19. 苹果手机该如何拍摄证件照
  20. 一张关系图助你清晰认识各种O。PO、BO、DTO、VO关系图,够直观

热门文章

  1. Codeforces 999F Cards and Joy 【dp】【性质】
  2. 程序员应该多逛的几个技术网站
  3. Jmeter调试工具---HTTP Mirror Server
  4. Ubuntu各大分支版本功能介绍及下载地址
  5. sql查询结果字段名与字段值倒过来了
  6. 对Group_concaT函数利用剖析 (转)
  7. wchar_t 的输出问题
  8. VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题
  9. java 11:数组作为函数参数,数组做为函数返回值
  10. 用python实现远程复制 (scp + expect )