浅谈嵌⼊式软件开发之影响嵌⼊式MCU中断延迟(InterruptLatency)的因素总结
内容提要
引⾔(何为中断延迟)
1. 存储中断向量表和中断ISR代码的存储器访问速度
有道日语在线翻译2. CPU内核Cache命中(hit)与否
boolean3. 中断ISR代码的复杂程度(是否需要压栈)
4. 中断ISR代码的编译效率(⼯具链编译器的优化设置)
5. 中断识别时间(外设中断事件发⽣到中断标志位置位)
6. 中断优先级设置与中断嵌套配置
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也是⼀个不错的选择。什么是因特网
2. CPU内核Cache命中(hit)与否
若CPU内核有指令和数据缓存(I/D Cache)且配置使能了,则第⼀次执⾏外设中断ISR和当前Cache中未命中即将执⾏的中断ISR 函数代码时,内核将先从Flash中加载ISR函数代码到内核Cache中,然后再执⾏,这⼀过程也会引⼊⼏个内核时钟周期的延迟。
Tips:若已将中断ISR重定向到TCM中,则不受内核Cache的影响。
3. 中断ISR代码的复杂程度(是否需要压栈)
若中断ISR函数函数中使⽤了过多的局部变量或者需要调⽤其他函数时,则需要在中断ISR函数最开始进⾏压栈操作,也会带来若⼲内核时钟周期的延迟。同时,中断退出之前也会增加相应的出栈开销。
Tips:这也是为什么中断ISR要尽量简单的原因。
4. 中断ISR代码的编译效率(⼯具链编译器的优化设置)
应⽤⼯程设置不同的编译优化等级,编译的效率不同,相应地中断ISR函数代码的编译结果执⾏速度也不同,不开任何优化与配置优化的编译结果相⽐,实现相同功能的中断ISR代码编译结果更⼤,对应的指令更多,肯定也会增加⼀定的延迟。experiment是什么意思
5. 中断识别时间(外设中断事件发⽣到中断标志位置位)
horizontally不同的外设⼯作频率不同,或者相同的外设配置使⽤不同频率的功能时钟(functional clock),中断识别时间(外设中断事件发⽣到中断标志位置位)也会有所不同,从应⽤的⾓度看,这也会造成不同的中断延迟。
美国水牛大学6. 中断优先级设置与中断嵌套配置
若中断发⽣时,相同优先级或者更⾼优先级的其他中断正在被CPU内核响应(即执⾏器中断ISR函数),则该中断必须等待其执⾏完才能被CPU内核响应,因此带来的中断延迟取决于当前正在被响应的同等优先级或更⾼优先级中断ISR函数的执⾏时间长短;
还有⼀种⽐较特殊的情况是,当前中断刚被CPU内核响应,执⾏了部分中断ISR代码,但是还未执⾏应⽤功能的改变代码(⽐如改变PWM输出占空⽐)时就被更⾼优先级的中断抢占了,嵌套执⾏相应的中
断ISR函数,从⽽造成中断延迟。
point
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.