中断的控制器太多,内容太多复杂,另起一片文章来专门收集。
1. 触发以及CUP的处理流程:产生中断--->mov VICxADDRESS(x=0,1,2,3) VICxVECTADDRy(x=0,1,2,3,y=0-31)--->excute VICxADDRESS(x=0,1,2,3)
2. 各种寄存器直接的关系:
3.
其他外部中断编程参考资料:
1).中断源的相关寄存器:
当需要开启中断时,则需要对中断源进行相应的配置,这里主要记录常用的外部中断的配置。外部中断的配置主要是对引脚的配置,涉及的寄存器主要分为两组。
一组是EINT0~16,涉及的寄存器主要是EXT_INT_x_CON,EXT_INT_xMASK,EXT_INT_PEND:
EXT_INT_x_CON---是外部中断的的配置寄存器,主要配置中断的触发方式;
EXT_INT_xMASK---是外部中断的屏蔽寄存器,配置引脚的中断是否屏蔽;
EXT_INT_PEND ---是外部中断的中断未决寄存器,当中断发生,中断源对应的PEND寄存器会被置1,中断结束时必须清除相应位,否则会持续引发中断。
另一组的则是其余的GPIO的中断,他们复用一个中断线路,涉及的寄存器主要是GPxx_INT_CON,GPxx_INT_MASK,GPxx_INT_PEND。各寄存器功能跟第一组的类似。
2).中断控制器的相关寄存器:
VICxINTSELECT——中断类型选择寄存器,通过此寄存器选择是IRQ还是FIQ。
VICxINTENABLE——中断使能寄存器,通过此寄存器使能相应的中断线路。
VICxINTENCLEAR——中断使能清除寄存器(即失能),在控制器禁止某路中断在该寄存器设置。
VICxIRQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的IRQ中断请求状态。
VICxFIQSTATUS——普通中断请求状态寄存器,记录了经VICxINTENABLE和VICxINTSELECT过滤后的FIQ中断请求状态。
VICxRAMINTR——原始中断请求寄存器,记录了未经VICxINTENABLE和VICxINTSELECT过滤后的中断请求状态。
VICxSOFINT——软件中断寄存器,通过该寄存器可使控制器产生相应线路的中断信号,该信号未经过优先级,VICxINTENABLE和VICxINTSELECT等寄存器的过滤。
VICxSOFINTCLEAR——软中断清除寄存器,在ISR(中断服务程序)结束时要清除该寄存器相应位来清除中断,否则该中断会持续触发。
VICxVECTADDRx——向量地址寄存器,该寄存器保存的是相应线路的ISR的地址。
VICxVECTPRIORITYx——保存相应相应线路的优先级,有16个优先级,0的优先级最高,当多个相同优先级的线路同时请求中断时,按硬件优先级排序,同一组中断,中断好越低优先级越高,如VIC0中,EINT0优先级;
如正在执行某ISR时,又一同软件优先级的但硬件优先级高的线路请求中断,此时该中断被屏蔽,要当前ISR执行完毕才可受理。
VICxSWPRIORITYMASK——软件优先级屏蔽,可设置屏蔽相应的优先级,屏蔽后则相应优先级的中断被屏蔽。
VICxADDRESS——保存当前活跃的中断线路的ISR地址,读取一次该寄存器意味着当前活跃的中断请求已被标志为已服务,此操作只能在进入中断处理时执行;向该寄存器写如任意值表示清楚控制器中该路中断状态,此操作只能在ISR结尾处执行。
VICxPROTECTION——控制器保护模式配置寄存器,配置为保护模式时,中断控制器的寄存器只能在特权模式下被访问;非保护模式时,用户模式和特权模式都可以访问中断控制器的寄存器。VICxPROTECTION只能在特权模式下访问。
3).处理器内核配置主要是配置CPSR寄存器,配置相应中断控制位为允许中断。
符:VICxINTENABLE与VICxINTENCLEAR的区别联系:
答:VICxINTENABLE与VICxINTENCLEAR,这两者是一对的,配合使用
VICxINTENABLE——系统中断使能寄存器,可读可写,对该寄存器的读操作可以获得当前各中断源的使能状态,
写1-中断使能,一般只能用来使能中断,不能用来写0禁止中断,禁止中断使用VIC0INTENCLEAR。大家注意
VICxINTENCLEAR---为只写寄存器,写0无效,写1-禁止中断。
4)请看 朱有鹏老师 课件也有说明
5)
ARM保存中断时,为什么使用“sub lr, lr, #4”
答:http://blog.csdn.net/comwise/article/details/10490203
**************************************************************JAVA异常************************************************************************************
https://mp.weixin.qq.com/s/8XiwZGn8djtO7TvtonAe8w
return代表正常退出,throw代表异常退出,return的返回位置是确定的,就是上一级调用者;而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定:异常处理机制会从当前函数开始查找看谁"捕获"了这个异常,当前函数没有就查看上一层,直到主函数,如果主函数也没有,就使用默认机制,即输出异常栈信息并退出,这正是我们在屏幕输出中看到的。
我们使用try/catch捕获并处理了异常,try后面的大括号{}内包含可能抛出异常的代码,括号后的catch语句包含能捕获的异常和处理代码,catch后面括号内是异常信息,包括异常类型和变量名,这里是NumberFormatException e,通过它可以获取更多异常信息,大括号{}内是处理代码,这里输出了一个更为友好的提示信息。
捕获异常后,程序就不会异常退出了,但try语句内异常点之后的其他代码就不会执行了,执行完catch内的语句后,程序会继续执行catch大括号外的代码。