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

几乎所有编程语言都有异常,可以说有程序就有异常。今天学习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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受,从提高幅度上来讲,而不是重要性上来讲一、自锁起码提高你50%的速度,我不用自锁和别人一起走AVS25就很辛苦了,用了自锁&#xff0…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号,欢迎您!穿越十年的一个ZEMAX光学设计案例作者:窗台小绿萝CAD,这个词已经深入到学习、工作很多年,翻译过来就是Computer Aided Design,计算机辅助设计。随着…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP,但又不清楚 PHP 基础学什么,那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前,首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后,能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些?生鲜电商特点:1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性;2,生鲜食品需要保鲜、冷藏、冷冻;3,生鲜食品保质期比较短;保存不易、对物流配送的条件要求极高;4,生鲜商品…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 ,在阅读了该文章之后,我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类,其中ActionListener是规范示例。 这些“…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位,一个字节可以存放0~255共256个数字;有符号位存放-128~127共256个数字; 2、无符号全都表示为正数;有符号位则首位表示正负数,正数首位为0,负数首位为1(因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合,包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900,和一款面向5G网络处理的结构化ASIC,一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)canvas 离屏技术与放大镜实现。 更多讨论或者错误提交,也请移步。 利用canvas除了可以实现滤镜,还可以利用离屏技术放大镜功能。为了方…

使用Ajax的Spring MVC REST调用

这篇文章提供了对Spring MVC Web应用程序的REST调用的简单示例。 它基于在Spring MVC上下文示例中使用Spring MVC服务静态资源和使用Ajax获取JSON 。 该代码可在GitHub的Spring-REST-With-Ajax目录中找到。 主页 我们的主页包含与执行Ajax调用的Javascript函数链接的四个按钮…

linux7系统如何配置网卡,Linux 7 配置网卡(nmcli)

操作系统版本:[rootcjcos01 network-scripts]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.5 (Maipo)查看网卡、IP等信息:[rootcjcos01 ~]# ifconfigenp0s3: flags4163 mtu 1500inet 192.168.1.90 netmask 255.255.255.0 bro…

学以致用深入浅出数字信号处理 pdf_数字阵列雷达--相控阵专题讲座之三

数字阵列雷达-相控阵专题讲座之三https://www.zhihu.com/video/1218562626877583360从名词上看,数字阵列雷达,肯定是阵列雷达了,那么数字阵列与传统的相控阵雷达又有什么区别呢?传统的相控阵雷达,是依靠移相器、衰减器…

Ubuntu中右击出现终端

1 root用户 $sudo apt-get install nautilus-open-terminal 2重启 3ok 转载于:https://www.cnblogs.com/lanjianhappy/p/6761599.html

使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js

前言:前端小白一枚,刚注册博客,先发个学习过程中新碰到小问题试试水吧~ 摘要:最近在学习bootstrap,偶然碰到了一个小问题,bootstrap网站也没有做过多的解释,今天分享给大家。 问题描述&#x…

C#中的三层

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的…

研究僵局–第3部分

在本系列的前两个博客( 第1部分和第2部分)中 ,我演示了如何创建一段死锁的不良代码,然后使用该代码展示了进行线程转储的三种方式。 在这个博客中,我将分析线程转储以找出错误的原因。 下面的讨论同时涉及本系列第1部…

qq2009显ip版怎么用_毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑

脸上毛孔粗大怎么破?超级烦恼尤其是一到秋季脸上经常油腻腻的为什么会毛孔粗大呢?毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑 当皮肤老旧角质积聚越多,会使肌肤变厚、变粗糙,毛孔变粗大,肌肤也…

hello程序的运行过程-从计算机系统角度

hello程序的运行过程-从计算机系统角度 1、gcc编译器驱动程序读取源程序文件hello.c,并将它翻译成一个可执行目标文件hello。翻译过程分为四个阶段:预处理阶段,编译阶段,汇编阶段,链接阶段。 2、初始时,she…

Eclipse对类固醇的重构

在上一篇有关常见Java违规的文章中 ,我列出了Java开发人员容易犯的一系列错误。 在重构Java项目以解决这些违规问题的同时,我广泛使用了Eclipse的重构功能来快速更改代码。 下面是这种重构技术的汇编。 1.在块级语句周围添加花括号 用{curly braces}包装…

微服务发展的历史_“美丽新羌 光照未来” 新羌社区开展微视频宣传片拍摄活动...

见圳客户端、深圳新闻网讯(记者 王志明 通讯员 甘力宇)为记录新羌社区的历史变迁,弘扬新羌人与时俱进、开拓进取的创新精神,宣传社区党委、社区一线工作者及社区居民的感人事迹和精神,展现深圳社区发展新风貌,2020年10月&#xff…