一、异常
(1)异常类型
注意:linux中断是异常的一种,异常包含中断,有软件中断(swi svc指令触发)、快速中断、外部中断三种与中断有关的异常。
(2)IRQ中断流程
1.cpu每个指令周期检查是否发送异常;
2.若发现异常,保存CPSR(程序状态寄存器),将当前处理模式设置为ARM、IRQ模式,将被打断应用程序地址的下一个指令保存到LR寄存器,例如当前程序地址为0x6000008,LR为0x6000004,即下一个指令的地址;
3.PC指针指向0x18,程序到0x18取出指令,这个指令跳转到中断异常处理函数;
4.中断异常处理函数中,分三步处理;
①保护现场:寄存器、CPU状态入栈
②根据中断号,跳转到对应的中断处理函数中执行
③执行完毕恢复现场:寄存器、CPU状态出栈
5.恢复现场后,PC指向原来中断的地方,重新回到断点执行程序;
(3)中断处理函数原则
中断处理函数是一个特俗的函数,可以从参数、返回值、函数内部实现回答
1.参数和返回值:绝对不能传入参数,不能返回值;
2.内部实现:
①快进快出原则,中断处理函数的任务要尽可能快速完成,以免堵塞其他中断;
②根据①原则,中断处理函数不能休眠,如调用sleep;
③中断处理函数不能调用不可重入函数(记为fun),以免主函数mian正在执行;fun,中断又来执行fun,导致fun内部的全局变量和静态变量的结果出乎意料。
(4)不可重入函数的特点
1.使用了全局变量和静态变量;
2.返回了全局变量和静态变量;
3.调用了不可重入函数,这点难以防范,因为很多时候并不清除调用的第三方函数内部如何实现,是否可重入;
4.使用了标准IO函数,如调用了scanf,printf;
5.使用了malloc,free函数
linux学习记录
于 2024-09-11 23:45:30 首次发布