请选择 进入手机版 | 继续访问电脑版
查看: 1576|回复: 1

[痞子衡]Cortex-M系统中断延迟及其测量方法

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31998
    最后登录
    2024-4-9
    发表于 2021-11-26 09:36:03 | 显示全部楼层 |阅读模式
    Cortex-M系统中断延迟及其测量方法
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是Cortex-M系统中断延迟及其测量方法。


    在嵌入式领域里,实时性是个经常被我们挂在嘴边的概念,这里的实时性主要强调得是当外界事件发生时,系统是否能在规定的时间范围内予以响应处理,这个时间阈值越小,系统的实时性就越高。当然关于这个实时性,也有软硬之分,硬实时要求的是设定的时间阈值内必须完成响应,而软实时则仅需根据任务的优先级尽可能快地完成响应即可。


    无论是 RTOS 环境还是裸机环境下,系统最原始的实时性保障其实来自于 MCU 内核的中断响应能力,关于中断响应能力有一个重要指标叫中断延迟时间,今天我们就来聊一聊 Cortex-M 内核的中断延迟及其测量方法:


    一、什么是系统中断延迟?
    所谓中断延迟,即从中断请求 IRQ 信号置起开始到内核进入执行该中断 ISR 第一条指令时的间隔,如下图所示, 箭头范围内的 11 个周期就是中断延迟时间。关于这个概念,ARM 公司专家 Joseph Yiu 的一篇博客 《Cortex-M内核系统中断延迟入门指南》 介绍得很详细。
    13.png
    为什么会有中断延迟?其实这是无法避免的,当内核在执行 main thread 代码时,来了中断事件,NVIC 里对应 IRQ 信号被置起,内核接到 NVIC 通知后压栈保存现场(以便中断 ISR 处理完成时回到被打断的 main thread 地方),然后再从中断向量表里取出对应中断 ISR 来执行,这一系列动作是需要时间的。


    Cortex-M 家族发展至今,已有 M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55 等多款内核,这些内核的中断延迟时间不一,如下表所示。注意表中的数值单位是内核的时钟周期,并且是在零等待内存系统条件下结果(即代码链接在零等待内存里)。


    Note1: 一般来说 MCU 内部与内核同频的 SRAM 是标准的零等待内存。
    Note2: 许多运行频率超过 100MHz 的微控制器会搭配非常慢的 Flash 存储器(例如 30 - 50MHz),虽然可以使用 Flash 访问加速硬件来提高性能,但中断延迟仍然受到 Flash 存储系统等待状态的影响。
    14.png
    二、如何测量系统中断延迟?
    测量 Cortex-M 的中断延迟方法有很多,任何一个带中断的 MCU 外设模块都可以用来测中断延迟,Cortex-M 中断延迟时间跟触发中断的具体外设模块类型基本上是无关的(最多受一点该外设中断信号同步周期的影响)。


    利用 GPIO 模块来测量 Cortex-M 的中断延迟是最简单的方法,选择两个 GPIO,一个配置为输入(GPIO_IN),另一个配置为上拉输出(GPIO_OUT,初态设为高),开启 GPIO_IN 的边沿中断(比如下降沿),在 GPIO_IN 边沿中断 ISR 里翻转两次 GPIO_OUT,然后用示波器测量两个 GPIO 信号边沿间隔得出中断延迟时间。
    1. uint32_t s_pin_low  = 0x0;
    2. uint32_t s_pin_high = 0x1;

    3. void GPIO_IN_IRQHandler(void)
    4. {
    5.     GPIO_OUT->DR = s_pin_low;
    6.     GPIO_OUT->DR = s_pin_high;

    7.     ClearInterruptFlag(GPIO_IN);
    8.     __DSB();
    9. }
    复制代码
    需要注意的是在如上 GPIO_IN_IRQHandler 函数伪代码里,我们对 GPIO_OUT 做了两次翻转,这是有必要的。我们随便选择一个 CM7 芯片去实际编译(IAR环境下,无优化)可以看到如下汇编代码,每一次翻转实际上由四条指令组成,我们作为计时基准的 GPIO_OUT 第一个边沿其实是 ISR 里执行了第一句翻转代码后的时刻,而中断延迟是不包含第一句翻转代码执行时间的。因为指令流水线优化等复杂情况,我们就不从理论上计算四条指令实际消耗时钟周期数,直接再翻转一次 GPIO_OUT,测量 GPIO_OUT 低电平时间即认为是这四条指令执行时间。
    15.png
    因此最终中断延迟时间 td = t1 - t2,其中 t1、t2 是我们可以测量出来的时间。此外,td 时间内包含了 tx,这个 tx 是 I/O 跳变信号到芯片内部 IRQ 置起的时间,这个时间是芯片系统所需的同步时间,因芯片设计而异,本应不被计算在系统中断延迟内,但因为这个时间无法测量,故而就放在中断延迟里了,也算是一点小小误差吧。


    下一篇我们将在实际 Cortex-M 芯片上用这种方法去实测中断延迟,敬请期待。
    16.png
    至此,Cortex-M系统中断延迟及其测量方法痞子衡便介绍完毕了,掌声在哪里~~~


    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    7 天前
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92608
    最后登录
    2024-4-9
    发表于 2021-11-26 13:53:35 | 显示全部楼层
    沙发,支持,一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-16 16:34 , Processed in 0.134303 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表