中断和异常

  • 课后问老师的部分:

  1、SRAM是占了0.5GB的地址,但是由于其较为昂贵,所以只用了这些地址里面的48KB

  2、位带区在片内周边外设和RAM中存在。

  3、中断、异常和C语言实现的函数的最大区别是,执行的时间是否是确定的。函数调用的地方是确定的,但是中断的执行往往受到GPIO口的上下脉冲控制,调用的时间和次数是不确定的。也正是因为这个原因,我们的中断和异常的代码里面并没有任何返回值(假设有返回值了,那这个返回给谁?)。

  4、晚到异常:是说现有一个低优先级的异常请求执行,若是在硬件电路对这个异常进行框架保存和按照中断向量表寻址的很短时间内,又来了一个优先级较高的异常,那么处理器开始执行这个高优先级异常,并且不改变先到异常的待决状态(它的框架压入栈内了)。等高优先级的异常处理完毕之后,再处理低优先级的异常。

  5、框架保存在栈里面。

  • PPT及笔记本上的知识点整理
  1. 异常的类型:需要了解的是——复位、NMI非可屏蔽中断、硬故障(后面老师讲了将这些异常分为好几块的内容)
  2. 异常的状态:
    1.      非活动——{异常没有发出请求,可能是上下沿没有触发}The exception is not active and not pending.

    2.     待决——{异常已经发出请求,但是还未开始执行}The exception is waiting to be serviced by the processor. An interrupt request (中断请求)from a peripheral or from software of the         corresponding interrupt to pending. 外设和软件都可以发出中断请求,想想那几个不同功能的寄存器,就可以理解这句话了。

    3.     活动——{异常正在执行但未完成}

    4.     活动并待决——{前面的异常还没有执行完,后面的同源异常已经来了}

  3. 异步的异常处理的含义:{异步也就是说异常请求来了,要稍微等一小段时间之后,才开始处理异常,在这个期间处理器可以继续往下执行一段程序}   对于异步的异常处理,如PendSV、SysTick、IRQ{可能是规定好了的:哪些异常是异步、哪些异常是同步},在异常触发和处理器进入异常处理程序之间,处理器可以执行另一条指令{只能执行一条指令吗?}
  4. 中断屏蔽的概念:{有一些代码的执行不能受到突然来的中断的影响,这时就需要中断屏蔽,但是有一些中断是不能屏蔽的,比如说复位} 特权软件{只有特权软件可以吗?一般用户操作难道不能够使用中断屏蔽?}可以禁用某些异常处理,除了Reset、NMI、Hard fault之外。有一些用于实现这个功能的寄存器,如System handler control and state register,Interrupt clear-enable registers。
  5. 异常处理程序:最常用的是Interrupt service routines (ISR)中断服务过程{这里是指:中断向量表中指示的那段程序吗?}
  6. 向量表:{有一个基地址,向量里面每一个中断的名称都对应一段代码}系统复位时,向量表定位在地址0x00000000,特权软件可以修改。向量表的第0项是sp的初值,第1项是pc的初值{?怎么理解这句话}    向量表包含栈指针复位时的值{干啥用?}和所有异常程序的起始地址。
  7. 异常的优先级:最高——Reset、NMI;次高——Fault一大类;再次——系统一大类;最后——IRQ0-67{这是个什么东西?}
  8. 中断控制器如何管理{这个是什么意思?中断控制器是哪几个寄存器吗?},笔记上面写着:设置门槛——异常屏蔽寄存器{这块是怎么工作的,或的逻辑:高的抢占低的},高优先级的可以过去。
  9. 异常处理的进入{这个是什么个意思,异常发请求?还是一个异常正在执行的时候,又来了一个更高级别的异常?——应该是说一个带判据的异常大于异常屏蔽寄存器里设定的优先级后,就可以进入active状态}:发生在一个在有一个具有足够高优先级的正在待决的异常,并且:处理器处于线程模式。若新的异常比正在处理的异常的优先级更高,在这种情况下新的异常抢占原来的异常处理。异常处理是嵌套的。
  10. 处理器接受异常之后会发生——先去掉一些情况:异常是尾链的异常或是晚到的异常{晚到的异常难道不需要处理器将信息压入当前栈中吗?}——处理器将信息压入当前的栈中,简称入栈,且每次压入8个字,这8个字的结构称为栈框架。
  11. 栈框架包含的信息:通用寄存器R0-3,R12{这些个寄存器是可改变值的寄存器,它们经常用于传递函数返回值。而其他的Rn寄存器,在之前使用这些寄存器时,必须把它们原来的值压入栈,用完之后再pop出来}{因为异常处理完之后所有的这些寄存器都不允许改动,改动也没啥意义,因为中断执行时也并没有什么返回值要传递给主函数,所以在处理器接受异常之后,先要将这些寄存器里面的值保存下来}、pc(返回地址)、状态寄存器PSR{这些寄存器是些啥寄存器?}、链接寄存器LR{它和pc的作用区别是个啥,需要配合起来使用吗?}   {关于为何不要保存sp,是因为返回和进来的值始终是一样的,压进去在哪里,返回的也在哪里,所以无需多此一举将它压进去}——好好看PPT待补充
  12. C函数和中断的区别:待补充
  13. 异常的返回:{LR中放了第4到31位均为1的EXC_RETURN,中断执行到最后时,会将LR放到pc中去,处理器就知道你要返回了。但不是直接跳到主程序中去,而是执行了一段代码,在这段代码里进行了一些特殊情况的考虑,比如说出现尾链的时候——有低优先级的中断在pending寄存器中,这段代码规定不是先返回主程序再执行低优先级的中断,而是直接执行低优先级的中断,之后再跳回主程序,这样可以提高效率}
  14. 标准的返回格式和用pc、lr构成的返回格式待补充

   

原文地址:https://www.cnblogs.com/dadidelearning/p/9873623.html