处理器(中)_中断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理器(中)_中断相关的知识,希望对你有一定的参考价值。

专题1—深入浅出处理器

2.处理器(中)_中断

2.1中断的概念和意义:

中断时一种处理器与外设进行通信的机制,用于通知处理器外部有“重要事件”发生,一般情况下中断需要被处理器响应。

2.2中断服务程序(ISR)

1.从外设中读取中断寄存器的值,以便了解中断的类型
2.根据中断类型具体设计处理逻辑
3.清除外设状态寄存器中的中断标志位
4.清理处理器中的中断标识位
整个处理器过程如下所示:
技术分享图片
软件工程师眼中的中断服务程序:
— 不能有返回值,不能有参数传递
— 必须短小而高效,避免浮点运算
错误示例:
__interrupt double compute_area(double radius)
{
double area = PI radius radius;
printf (“\n area = %f”, area);
return area;
}

2.3中断的意义:

—中断的意义在于应用程序不必关心中断的发生与处理
—中断服务程序不必关系应用程序的执行状态
—中断是“上层应用”与“底层代码”的分割边界。

技术分享图片

2.4中断的类型

—硬中断:通过处理器中断信号线产生的中断
CPU和外部设备是分别独立的硬件执行单元,CPU对全部设备进行管理和资源调度处理,CPU要想知道外部设备的运行状态,要么CPU定时的去查看外部设备特定寄存器,要么让外部设备在出现需要CPU干涉处理时“打断”CPU,让它来处理外部设备的请求,毫无疑问第二种方式更合理,可以让CPU“专心”去工作,这里的“打断”操作就叫做中断请求,根据请求的紧急情况,中断请求分一般中断和快速中断,快速中断具有最高中断优先级和最小的中断延迟,通常用于处理高速数据传输及通道的中数据恢复处理,如DMA等,绝大部分外设使用一般中断请求。
—软中断:通过非法指令或者特殊指令出发的中断(或者称为异常)
异常是应用程序自己调用时产生的,用于用户程序申请访问硬件资源时,例如:printf()打 印函数,要将用户数据打印到显示器上,用户程序要想实现打印必须申请使用显示器,而用户程序又没有外设硬件的使用权,只能通过使用软件中断指令切换到内核态,通过操作系统内核代码来访问外设硬件,内核态是工作在特权模式下,操作系统在特权模式下完成将用户数据打印到显示器上。这样做的目的无非是为了保护操 作系统的安全和硬件资源的合理使用,该异常在管理模式下处理。

2.5中断优先级

多个中断同时出现时,处理器会优先响应高优先级的中断,低优先级的中断ISR执行时可以被高优先级的中断打断。
思考:CPU如何保证fiq比irq快?有2个原因:
第一,fiq模式有专用的r8~r12,因此在fiq的isr中可以直接使用r8-r12而不用保存,这就能节省时间;
第二,异常向量表中fiq是最后一个异常向量入口。因此fiq的isr不需要跳转,可以直接写在原地,这样就比其他异常少跳转一次,省了些时间。

2.6中断的应用_程序断点

A.断点指的是调试工具用于暂停代码执行的指令位置、
B.断点的实现为处理器的中断支持
软件断点:利用非法指令异常产生中断实现(软中断)
硬件中断:利用中断寄存器的特定产生中断实现
断点程序的原理:
1.获取源程序制定行对应的代码地址
2.把代码地址中的指令替换为中断触发指令
3.在中断服务程序中将控制权交给调试程序
4.调试程序读取源程序上下文信息
5.调试程序将代码中的指令还原
6.源程序从断点处继续向下执行
上述过程和中断的处理过程完全一致,图解如下:
技术分享图片

2.7中断调试的工程应用

背景:嵌入式产品的实时性要求很高,各个task 有严格的时间要求,断点调试不可用,只能依赖于打印调试(日志调试发),但是打印调试,打印的数据分布于产品各个角落,难以分析和定位,同时打印操作设计到IO操作,会影响产品效率
解决思路:结合日志调试发和断点调试法的优点,使得实时系统调试时,能够任意查看制定代码行上下文信息;并且不增加打印语句,不暂停执行。
最终方案:
1.获取原程序制定行对应的代码地址
2.把代码地址中的指令替换为中断触发指令
3.在中断服务程序中抓取全局信息和栈信息
4.抓取的信息发送会调试程序解析并输出
技术分享图片
本文参考自狄泰课程,特此致谢。

以上是关于处理器(中)_中断的主要内容,如果未能解决你的问题,请参考以下文章

非常好!!!Linux源代码阅读——中断

两类中断控制器处理流程_链式和层级

13.linux中断处理程序

是否有在单个活动中处理多个片段的 Android 设计模式?

STM 32 中断服务函数中加延时的处理

Linux x86_64内核中断初始化