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

原创 2017年10月12日 21:57:25

几乎所有编程语言都有异常,可以说有程序就有异常。今天学习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里判断中断状态做下处理。

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

给线圈一点电压就能切换这个开关,也就能触发工作模式的切换了。
版权声明:本文为博主原创文章,未经博主允许不得转载。

未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 system.data.dll 中。

未处理的“System.Data.SqlClient.SqlException”类型的异常出现在 system.data.dll 中。其他信息: 系统错误。修改SQL数据库时出现有关调用实时(JIT)...
  • CRSUN
  • CRSUN
  • 2004年12月08日 14:18
  • 9756

“System.TypeInitializationException”类型的异常在 EntityFramework.dll 中发生,但未在用户代码中进行处理

断点查看是无法打开configSource内的文件 在使用 配置文件分离写法时,出现错误 要将configSource内分离的所有config文件属性 设置为 始终复制输出就可以了...
  • qq_36535245
  • qq_36535245
  • 2017年11月14日 18:29
  • 801

System.Data.Entity.Core.MetadataException类型的异常在EntityFramework.dll中发生

...但未在用户代码中进行处理。 其他信息:无法加载指定的元数据资源
  • hangyejiadao
  • hangyejiadao
  • 2016年11月17日 20:45
  • 3572

System.BadImageFormatException”类型的未经处理的异常在 xx.exe 中发生

在做身份证读卡器读取数据时, 导入Dll 调用 API, 运行时 报错  “System.BadImageFormatException”类型的未经处理的异常在 WindowsFormsAp...
  • Sherry_710
  • Sherry_710
  • 2015年09月15日 16:00
  • 14894

System.UnauthorizedAccessException”类型的异常解决方法

前几天做一个WP8项目时,抛出了一个System.UnauthorizedAccessException”类型的异常在 System.Windows.ni.dll 中发生,但未在用户代码中进行处理,调...
  • u011626294
  • u011626294
  • 2013年09月04日 09:41
  • 2272

未处理的“System.Runtime.InteropServices.COMException”类型的异常出现在 comlayout.exe 中。其他信息: 检索 COM 类工厂中 CLSID 为 {0EC8CCC8-EBED-495E-9A9F-313

VS2005中用C++代码,调用COM组件时(已经将DLL文件通过“项目->引用”添加了进来),出现以下错误:未处理的“System.Runtime.InteropServices.COMExcept...
  • ljg888
  • ljg888
  • 2011年05月24日 11:42
  • 14077

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

发生此问题“ ‘System.AccessViolationException’ 类型的未经处理的异常在 System.Data.dll 中发生”,可能是安装了VS2013后对系统中的winsock接...
  • huyuyang6688
  • huyuyang6688
  • 2014年06月04日 15:25
  • 5597

智能小车制作过程全纪录: 三、软件平台--- Java 平台串口通信

嵌入式Linux上大部分都是有C/C++来做开发的,主要的原因还是为了效率,但本人最近几年用Java比较多所以决定用Java比较多所以决定还是用Java来开发,再者个人认为现在硬件的发展,对于实时性没...
  • mwlwlm
  • mwlwlm
  • 2016年09月29日 18:03
  • 1494

异常处理--“System.BadImageFormatException”类型的未经处理的异常在 DataTest.exe 中发生

今天写了一个测试的控制台应用程序,需要引用一个第三方dll,结果程序运行到要创建第三方dll中的一个类的实例的时候,总是报异常,“System.BadImageFormatException”类型的未...
  • shouhou_Bingo
  • shouhou_Bingo
  • 2016年11月25日 17:01
  • 5350

“System.AccessViolationException”类型的未经处理的异常在 未知模块。

Windown任务栏搜索框输入netsh winsock reset并执行、如果依然无效,则以管理员权限执行。...
  • qq285679784
  • qq285679784
  • 2017年05月02日 15:28
  • 1004
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:智能小车37:异常在ARM、JAVA、硬件里的实现
举报原因:
原因补充:

(最多只允许输入30个字)