大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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]

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主页知乎主页微信公众号 平台上。

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

痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间的更多相关文章

  1. 痞子衡嵌入式:嵌入式Cortex-M系统中断延迟及其测量方法简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是Cortex-M系统中断延迟及其测量方法. 在嵌入式领域里,实时性是个经常被我们挂在嘴边的概念,这里的实时性主要强调得是当外界事件发生时 ...

  2. 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是以i.MXRT的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程. 在痞子衡旧文 <串口(UART)自动波特率识 ...

  3. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  4. 痞子衡嵌入式:再测i.MXRT1060,1170上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060/1170上的普通GPIO与高速GPIO极限翻转频率. 按照上一篇文章 <实测i.MXRT1010上的普通GP ...

  5. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

  6. 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...

  7. 痞子衡嵌入式:利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache. 关于i.MXRT1xxx系列内部通用数据协处 ...

  8. 痞子衡嵌入式:聊聊i.MXRT1xxx上的普通GPIO与高速GPIO差异及其用法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上的普通GPIO与高速GPIO差异. GPIO 可以说是 MCU 上最简单最常用的外设模块了,当一些原生功能外设接口模块不能 ...

  9. 痞子衡嵌入式:聊聊i.MXRT1170双核下不同GPIO组的访问以及中断设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170双核下不同GPIO组的访问以及中断设计. 在双核 i.MXRT1170 下设计应用程序,有一个比较重要的考虑点就是外 ...

随机推荐

  1. linux Segmentation faults 段错误详解

    什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular err ...

  2. 查看VCS版本的指令

    以本人电脑的安装目录为例:在任意path下打开terminal执行命令行/usr/local/vcs2018/bin/vlogan -ID -full64 /usr/local/vcs2018为VCS ...

  3. js 在浏览器中的event loop事件队列

    目录 前言 认识一个栈两个队列 执行过程 异步任务怎么分配 简单例子 难一点的例子 前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意. 都说js是单线程的,不过它本身其 ...

  4. VNC服务器的搭建(带图形化支持)

    环境:centos7.6最小化安装 图形化支持 如果希望安装简单的图形支持的话,仅包含gnome的最最最最基础的包的话可以使用以下命令 yum groups install "X Windo ...

  5. Haar小波的理解

    1. 首先理解L^2(R)的概念 L^2(R) 是一个内积空间的概念,表示两个无限长的向量做内积,张成的空间问题.也就是两个函数分别作为一个向量,这两个函数要是平方可积的.L^2(a,b)=<f ...

  6. Linux常用命令和快捷键整理:(1)常用命令

    前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ...

  7. OpenXml SDK学习笔记(1):Word的基本结构

    能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...

  8. Part 32 AngularJS controller as syntax

    So far in this video series we have been using $scope to expose the members from the controller to t ...

  9. [loj3246]Cave Paintings

    题中所给的判定条件似乎比较神奇,那么用严谨的话来说就是对于两个格子(x,y)和(x',y'),如果满足:1.$x\le x'$:2.从(x,y)通过x,x+1,--,n行,允许向四个方向走,不允许经过 ...

  10. 八、hive3.1.2 安装及其配置(本地模式和远程模式)

    目录 前文 hive3.1.2 安装及其配置(本地模式和远程模式) 1.下载hive包 2.修改其环境变量 3.MySQL配置 Centos7 MySQL安装步骤: 1.设置MySQL源 2.安装My ...