智能小车37:异常在ARM、JAVA、硬件里的实现
来源:互联网 发布:网络足球解说招聘 编辑:程序博客网 时间:2024/05/22 06:09
几乎所有编程语言都有异常,可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题,下面给大家分享一下。
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里判断中断状态做下处理。
三、硬件实现中断。
用继电器就可以实现开关,如下图:
给线圈一点电压就能切换这个开关,也就能触发工作模式的切换了。
阅读全文
0 0
- 智能小车37:异常在ARM、JAVA、硬件里的实现
- 智能小车34:arduino与arm的汇编程序开发
- 51单片机实现智能小车的寻轨避障功能
- [FPGA][硬件课设]基于Nexys 4的智能小车系统
- 树莓派智能监控小车(QT+树莓派)------视频流的获取及硬件
- 【java】java实现运动的小车
- 智能小车制作过程全纪录:一、硬件平台
- 智能小车
- 【转】采用Linux2.6的智能小车
- 智能小车WIFI模块的设置
- 基于51单片机的智能小车
- 我的智能安防小车
- 智能寻迹小车的代码
- 智能小车的制作(一)
- 智能小车的制作(二)
- 智能小车的制作(三)
- 智能小车的设计(四)
- 智能小车的制作(五)
- Python3.5.2爬虫框架库Scrapy安装,Twisted安装
- 第二日总结
- 深入理解where 1=1的用处
- C语言中数组名和指针的关系
- c++学习之特殊形式的函数
- 智能小车37:异常在ARM、JAVA、硬件里的实现
- canvas基础
- CentOS 7 安装 TinyProxy 代理服务器
- 网络编程概述及实例练习
- unity 利用Android Studio实时查看打印日志
- Python中的optparse模块
- 随机产生,排序,合并,逆序
- HTML5新增的常用元素
- poj 3169 Layout (差分约束)