内容提要
1. 存储中断向量表和中断ISR代码的存储器访问速度4. 中断ISR代码的编译效率(工具链编译器的优化设置)5. 中断识别时间(外设中断事件发生到中断标志位置位)7. CPU内核是否正使能硬件浮点数单元(FPU)经常有客户和公众号的读者问我关于嵌入式MCU中断延迟(Interrupt Latency)相关的问题。所谓嵌入式MCU的中断延迟,是指MCU外设发生中断事件(比如定时器溢出,CAN报文接收完成,DMA传输错误等),到CPU内核执行相应中断事件中断服务程序(ISR)第一条指令/做出相应事件的响应动作所花费的时间。下面,本文就此问题,结合作者多年的嵌入式MCU开发经验,对影响嵌入式MCU中断延迟(Interrupt Latency)的因素进行了一个全面的归纳和总结,希望对大家有所启发和帮助。1. 存储中断向量表和中断ISR代码的存储器访问速度当外设中断被内核的中断控制器(比如KEA/S32K系列MCU使用的ARM Cortex-M的NVIC和Qorivva MPC56/57xx效率MCU使用的Power e200系列内核的INTC中断控制器)识别后,CPU内核会首先从中断向量表中读取相应中断的中断向量(即中断ISR函数地址)到内核PC指针,从而快速跳转到中断ISR函数执行。若存储中断向量表和中断ISR的存储器,比如Flash访问速度不够快,则CPU内核需要等待若干内核时钟周期才能拿到中断向量和中断ISR函数代码指令,从而将增加MCU的中断延迟时间。因此,将MCU的CPU内核中断向量表重定向(remap/relocate)到SRAM中,并将关键(频繁发生)的内核异常和外设中断ISR拷贝到SRAM中执行,可以避免此类中断延迟。Tips:对应配备了TCM(Tightly Couple Memory,紧耦合存储器,零等待访问,性能比SRAM更好)的MCU,将中断向量表和外设ISR重定向到TCM也是一个不错的选择。若CPU内核有指令和数据缓存(I/D Cache)且配置使能了,则第一次执行外设中断ISR和当前Cache中未命中即将执行的中断ISR 函数代码时, 内核将先从Flash中加载ISR函数代码到内核Cache中,然后再执行,这一过程也会引入几个内核时钟周期的延迟。Tips:若已将中断ISR重定向到TCM中,则不受内核Cache的影响。若中断ISR函数函数中使用了过多的局部变量或者需要调用其他函数时,则需要在中断ISR函数最开始进行压栈操作,也会带来若干内核时钟周期的延迟。同时,中断退出之前也会增加相应的出栈开销。Tips:这也是为什么中断ISR要尽量简单的原因。4. 中断ISR代码的编译效率(工具链编译器的优化设置)应用工程设置不同的编译优化等级,编译的效率不同,相应地中断ISR函数代码的编译结果执行速度也不同,不开任何优化与配置优化的编译结果相比,实现相同功能的中断ISR代码编译结果更大,对应的指令更多,肯定也会增加一定的延迟。5. 中断识别时间(外设中断事件发生到中断标志位置位)不同的外设工作频率不同,或者相同的外设配置使用不同频率的功能时钟(functional clock),中断识别时间(外设中断事件发生到中断标志位置位)也会有所不同,从应用的角度看,这也会造成不同的中断延迟。若中断发生时,相同优先级或者更高优先级的其他中断正在被CPU内核响应(即执行器中断ISR函数),则该中断必须等待其执行完才能被CPU内核响应,因此带来的中断延迟取决于当前正在被响应的同等优先级或更高优先级中断ISR函数的执行时间长短;还有一种比较特殊的情况是,当前中断刚被CPU内核响应,执行了部分中断ISR代码,但是还未执行应用功能的改变代码(比如改变PWM输出占空比)时就被更高优先级的中断抢占了,嵌套执行相应的中断ISR函数,从而造成中断延迟。7. CPU内核是否正使能硬件浮点数单元(FPU)对于支持硬件浮点数处理单元(FPU)的CPU内核,则在外设中断响应时,除了压栈CPU的通用寄存器和状态寄存器之外,还需要将FPU的数据寄存器和状态寄存器也压栈,保护其执行的上下文(context),从而也将引入若干内核时钟周期的延迟。
ARM Cortex-M系列内核的“懒惰”堆栈(lazy stack)功能,能够根据CPU和FPU的程序状态寄存器,判断中断ISR中是否会执行FPU指令,若执行才对FPU的寄存器进行压栈,否则,不压栈FPU寄存器,从而缩短中断延迟。Tips:ARM Cortex-M内核的Lazy Stack功能默认是关闭的,用户可以在MCU的startup代码中,配置FPCCR[LSPEN] = 1使能该功能:
以上就是今天想要给大家分享的知识点,希望对大家有所帮助。
本公众号近期文章精选推荐(点击文章标题即可直接跳转阅读):
1.