zoukankan      html  css  js  c++  java
  • 痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间


      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx的系统中断延迟时间

      在 《Cortex-M系统中断延迟及其测量方法简介》 一文里,痞子衡介绍了 Cortex-M 中断延迟的基本概念及一种用 GPIO 模块来测量中断延迟时间的方法,今天我们就在 i.MXRT1xxx 系列芯片上用这种方法实测一下中断延迟:

    一、官方指标

      恩智浦 i.MXRT1xxx 系列目前有很多型号,都是基于 Cortex-M7 内核,主频从 500MHz 到 1GHz 不等。拿该系列第一款型号 i.MXRT1050 来说,在其官方主页可以看到其标称中断延迟时间低至 20ns。

      在 《Cortex-M系统中断延迟》 一文第一小节里我们知道 Cortex-M7 的标准中断延迟是 12 - 14 个内核时钟周期,i.MXRT1050 主频是 600MHz ,理论计算可得 (1s / 600MHz) * 12 = 20ns,所以 i.MXRT1050 上这 20ns 的中断延迟是符合 ARM 标准的。

    二、测试代码

      现在我们在芯片上实测一下,痞子衡把 i.MXRT1011/1021/1052/1062/1176 这五个型号均测了一遍,测试代码可以基于其各自 SDK 包。

      以 i.MXRT1052 为例,选用 \SDK_2.10.0_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\gpio\input_interrupt 例程为模板(注意选择 debug build,即代码链接在 TCM 里,满足零等待内存的测试需求),按 《Cortex-M系统中断延迟》 一文第二小节设计思想修改主函数如下(关于 GPIO 中断使用可以参考 《以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程》 一文):

    • Note1: 为了结果的准确性,痞子衡同时测试了多个不同类型的 GPIO 中断,因为部分 i.MXRT 型号中包含普通 GPIO 和 HSGPIO,并且有些 GPIO 事件既可以触发 Combined 型中断,也可以触发独立的中断。
    • Note2: 输出信号用的 GPIO 类型对于本次测试不重要,无论选择普通 GPIO 还是 HSGPIO 去翻转,其翻转时长不影响最终测试结果。
    uint32_t s_pin_low  = 0x000000;
    uint32_t s_pin_high = 0x800000;
    
    ////////////////////////////////////////////////////////////////////////////////
    // User Button SW8 - Pin4 in RT1050-EVKB
    void GPIO5_Combined_0_15_IRQHandler(void)
    {
        GPIO2->DR = s_pin_low;
        GPIO2->DR = s_pin_high;
        GPIO_PortClearInterruptFlags(GPIO5, 1U << 0);
        __DSB();
    }
    
    void init_gpio5_0(void)
    {
        gpio_pin_config_t din_config = {kGPIO_DigitalInput, 0, kGPIO_IntFallingEdge};       
        IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U); 
        GPIO_PinInit(GPIO5, 0, &din_config);
        NVIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);
        GPIO_PortEnableInterrupts(GPIO5, 1U << 0);    
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    // Arduino Interface, J24-2 in RT1050-EVKB
    void GPIO1_Combined_0_15_IRQHandler(void)
    {
        GPIO2->DR = s_pin_low;
        GPIO2->DR = s_pin_high;
        GPIO_PortClearInterruptFlags(GPIO1, 1U << 2);
        __DSB();
    }
    
    void GPIO1_INT2_IRQHandler(void)
    {
        GPIO2->DR = s_pin_low;
        GPIO2->DR = s_pin_high;
        GPIO_PortClearInterruptFlags(GPIO1, 1U << 2);
        __DSB();
    }
    
    void init_gpio1_2(void)
    {
        gpio_pin_config_t din_config = {kGPIO_DigitalInput, 0, kGPIO_IntFallingEdge};
        IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0U); 
        GPIO_PinInit(GPIO1, 2, &din_config);
        NVIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);
        //NVIC_EnableIRQ(GPIO1_INT2_IRQn);
        GPIO_PortEnableInterrupts(GPIO1, 1U << 2);    
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    // TP26
    void init_gpio2_23(void)
    {
        gpio_pin_config_t dout_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_GPIO2_IO23, 0U); 
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_07_GPIO2_IO23, 0x70F9U); 
        GPIO_PinInit(GPIO2, 23, &dout_config);
        GPIO2->DR |= 0x800000;
    }
    
    int main(void)
    {
        BOARD_ConfigMPU();
        BOARD_InitBootClocks();
        CLOCK_EnableClock(kCLOCK_Iomuxc);           
        CLOCK_EnableClock(kCLOCK_IomuxcSnvs);     
        
        init_gpio5_0();
        init_gpio1_2();
        init_gpio2_23();
    
        while (1);
    }
    

    三、测试结果

      现在我们来看 5 个 i.MXRT 型号的详细测试结果,根据测试结果,我们得出如下结论:

    • 结论1: 不同类型 GPIO(普通GPIO/HSGPIO)或者不同类型的 GPIO 中断(Combined 型/独立型),其中断延迟结果几乎是一样的(但是 i.MXRT1170 除外)。
    • 结论2: i.MXRT1020/1050 上测出的 GPIO 中断延迟接近 ARM 标准值,但是 i.MXRT1010/1060/1170 上测出的 GPIO 中断延迟大于 ARM 标准值(猜测是 GPIO 模块设计导致的延迟较大,并不是内核本身延迟大)。
    • 结论3: 本次方法测出的 GPIO 中断延迟不是一个固定值,存在约 3 个内核时钟周期的波动(多次测量观测到),原因可能是 PAD 信号跳变与 NVIC IRQ 信号置起的同步时机差异。

    3.1 实测i.MXRT1011

    系统时钟配置 PAD GPIO IRQ t1 t2 td 中断延迟时钟数
    Core: 500MHz
    IPG: 125MHz
    GPIO_01 GPIO1[1] GPIO1_Combined_0_15_IRQn 74 - 78ns 33ns 41 - 45ns 20 - 23 cycles
    GPIO2[1] GPIO2_Combined_0_15_IRQn
    GPIO_SD_05 GPIO2[5]

      i.MXRT1011 的 GPIO5[0] 因与 PMIC_ON_REQ 引脚复用,该引脚在 MIMRT1011-EVK 上需要保持拉高给外部 PMIC,因此无法用于测量中断延迟。

    3.2 实测i.MXRT102x

    系统时钟配置 PAD GPIO IRQ t1 t2 td 中断延迟时钟数
    Core: 500MHz
    IPG: 125MHz
    GPIO_AD_B0_06 GPIO1[6] GPIO1_Combined_0_15_IRQn 92 - 96ns 64ns 28 - 32ns 14 - 16 cycles
    GPIO1_INT6_IRQn
    SNVS_WAKEUP GPIO5[0] GPIO5_Combined_0_15_IRQn

    3.3 实测i.MXRT105x

    系统时钟配置 PAD GPIO IRQ t1 t2 td 中断延迟时钟数
    Core: 600MHz
    IPG: 150MHz
    GPIO_AD_B0_02 GPIO1[2] GPIO1_Combined_0_15_IRQn 78 - 82ns 54ns 24 - 28ns 14 - 17 cycles
    GPIO1_INT2_IRQn
    SNVS_WAKEUP GPIO5[0] GPIO5_Combined_0_15_IRQn

    3.4 实测i.MXRT106x

    系统时钟配置 PAD GPIO IRQ t1 t2 td 中断延迟时钟数
    Core: 600MHz
    IPG: 150MHz
    GPIO_AD_B0_02 GPIO1[2] GPIO1_Combined_0_15_IRQn 62 - 66ns 27ns 35 - 39ns 21 - 24 cycles
    GPIO1_INT2_IRQn
    GPIO6[2] GPIO6_7_8_9_IRQn
    SNVS_WAKEUP GPIO5[0] GPIO5_Combined_0_15_IRQn

    3.5 实测i.MXRT117x

    系统时钟配置 PAD GPIO IRQ t1 t2 td 中断延迟时钟数
    Core: 996MHz
    BUS: 240MHz
    GPIO_AD_01 GPIO2[31] GPIO2_Combined_16_31_IRQn 52 - 54ns 29ns 23 - 25ns 23 - 25 cycles
    CM7_GPIO2[31] CM7_GPIO2_3_IRQn
    WAKEUP_DIG GPIO13[0] GPIO13_Combined_0_31_IRQn 47 - 50ns 18 - 21ns 18 - 21 cycles

      至此,i.MXRT1xxx的系统中断延迟时间痞子衡便介绍完毕了,掌声在哪里~~~

    欢迎订阅

    文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

    微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

      最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

    痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

      衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

      专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

      与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

      可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

      关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

      痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


  • 相关阅读:
    对字符串进行编码解码
    C#重新启动时,关闭较早的进程
    JS给HTML5页面<Select></Select>绑定选中项
    获取该项目路径下的文件路径
    IE浏览器从页面向后台Controller传中文值出现乱码问题
    委托
    win10激活命令
    判断窗口是否已经被打开
    JS之对象数组遍历?
    JS之arguments属性解读函数传参?
  • 原文地址:https://www.cnblogs.com/henjay724/p/15640166.html
Copyright © 2011-2022 走看看