浅谈嵌入式软件开发之影响嵌入式MCU中断延迟(Interrupt Latency)的因素总结

内容提要

引言(何为中断延迟)
1. 存储中断向量表和中断ISR代码的存储器访问速度
2. CPU内核Cache命中(hit)与否
3. 中断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代码编译结果更大,对应的指令更多,肯定也会增加一定的延迟。
5. 中断识别时间(外设中断事件发生到中断标志位置位)
不同的外设工作频率不同,或者相同的外设配置使用不同频率的功能时钟(functional clock),中断识别时间(外设中断事件发生到中断标志位置位)也会有所不同,从应用的角度看,这也会造成不同的中断延迟。
6. 中断优先级设置与中断嵌套配置
若中断发生时,相同优先级或者更高优先级的其他中断正在被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.

(0)

相关推荐

  • 浅谈嵌入式MCU软件开发之将应用程序代码重定向到系统栈(stack)上运行的实现原理和方法详解

    内容提要 引言 1. 将应用程序代码重定向到stack运行的实现原理 1.1 C语言的堆栈(stack)工作原理和特性 1.2 C语言局部变量分配和初始化 1.3 基于C语言的结构体局部变量初始化特性 ...

  • RTOS中的任务是线程、进程、还是协程?

    今天为大家讲解讲解OS中的线程.进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种. 1.三者整体关系图 很多小伙伴在学习OS的过程中会遇到各种程序形态,比如说进程.线程.协程.管程. ...

  • ARM Cortex-M 启动代码的使用

    Cortex-M 启动代码的使用     上一篇扯了一些关于启动代码的原理,了解了额原理不去使用意义就没有那么大了,了解了启动代码不是终极目的,我们的目的是深入理解Cortex-M系列MCU的底层原理 ...

  • Nucleo-F413ZH 工程版测评(中): 浮点计算, 频率计

    浮点计算单元(FPU)的测试.先还是用前面那个程序,修改了一下,避免了中间的double/single类型转换:uint32_t test(int32_t *data, uint32_t size){ ...

  • 操作系统中抢占式和非抢占式内核的区别

    操作系统分为抢占式内核和非抢占式内核,通常RTOS都是抢占式内核. 下面就来讲讲抢占式内核和非抢占式内核的内容. 非抢占式内核 非抢占式内核要求每个任务(线程)都做一些事情来明确放弃对 CPU 的控制 ...

  • 汽车是怎么开发出来的?浅谈汽车开发流程

    许良  汽车话题下的优秀答主你知道汽车是怎么开发出来的吗?你的脑海中很可能浮现出来这样一个画面:一个非常有艺术气息的设计师,在草图上帅气的描绘着看起来非常犀利的线条.对,但不全对.对于汽车工程师的我而 ...

  • 经济知识:浅谈人民币汇率变化及其影响

    如果大家关注近期的经济新闻,大家会发现近期人民币对美元.英镑.欧元的汇率都大幅上升,在此背景之下,却是几家欢喜几家忧.热爱海淘的小伙伴表示喜闻乐见,可那些搞出口贸易的企业却叫苦不迭,这让我们不禁发问为 ...

  • 浅谈树莓派与嵌入式开发的关系

    描述 树莓派应该算是一个微型台式机,属于一种硬件的范畴.它用的虽然是arm的CPU,不过支持通用的操作系统,而不是嵌入式的操作系统.当然也可以安装android之类的操作系统. 实际上树莓派上完成的项 ...

  • 浅谈陈洪绶对日本浮世绘的影响

    陈洪绶(1598-1652),字章侯,号老莲,晚年又名悔迟.老迟等,浙江诸暨人,明末清初画家.陈洪绶一生创作了大量绘画作品,人物画与仕女画尤其值得关注,其人物风格"高古奇骇,俱非耳目近玩&q ...

  • 清朝统一新疆的意义,浅谈清朝对新疆的开发,开辟新疆的繁荣

    新疆,古称:西域.自汉朝设置西域都护府时,这里就成了中原王朝管辖地区,汉朝之后的盛唐,在西域设置了安西都护府和北庭都护府,并在之下设有军.镇.守捉等军事机构,唐朝在这里有驻军,开元中期,唐朝在西域有驻 ...

  • 【纺织技术】浅谈色纺纱的生产开发

    文/张梅英 山东华兴纺织集团有限公司 随着生产技术的不断发展及有色化纤的大量使用,色纺纱因织物的色彩更加绚丽多彩.朦胧感与立体感共存而形成了与坯纱染色截然不同的布面风格而深得广大消费者的喜爱.但色纺纱 ...

  • 浅谈COB产品荧光粉沉淀工艺对光型的影响

    随着国内LED产业链的日益成熟,产品原物料性能不断优化,各LED封装厂家产品性能差异逐步减小,为争夺市场份额,价格战持续上演,产品降价不断刷新记录.产品物料最优组合,设备规模化生产等成为行业赚取利润的 ...

  • 浅谈担保司法解释中抵押担保新规定对银行信贷业务的影响

    作者 中国工商银行宁夏分行法律事务部 陈福录 为正确适用民法典有关担保制度的规定,最高人民法院结合民事审判实践,在深入研判.公开征求意见的基础上,并经分析论证,于2020年12月31日发布了<关 ...