This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2434:AM2434 GPIO 中断延迟

Guru**** 2405920 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1122978/am2434-am2434-gpio-interrupt-latency

器件型号:AM2434

您好专家、

   客户对如何缩短中断延迟有疑问。 根据 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1097703/lp-am243-low-latency-interrupts?tisearch=e2e-sitesearch&keymatch=GPIO%252525252520latency#

中断延迟可以小于100ns。  

我们使用 nortos 修改演示代码 GPIO_INPUT_INTERRUPT。

使用 GPIO1_35作为中断触发源。

2.将 GPIO1_36连接到 GPIO1_35并从低电平切换为高电平以每秒触发一次中断。

在 ISR 中、只需切换 GPIO1_8即可指示执行 ISR 的第一行。

这是测试代码。

e2e.ti.com/.../gpio_5F00_latency_5F00_am243x_2D00_lp.zip

我们直接操作寄存器:

静态空__attribute__((section("ISR_tcma")) GPIO_bankIsrFxn (void *args)

* GPIO1_8_SET_ADDRESS = GPIO1_8_MASK;
* GPIO1_8_CLEAR_ADDRESS = GPIO1_8_MASK;
* GPIO1_35_INTSTAT_ADDRESS = GPIO1_35_INTSTAT_MASK;
gGpioIntrDone++;

ISR 设置为 FIQ 并置于 TCMA。

由于这是一个简单的测试代码、除了.sysmem、我们几乎将所有内容都放入 TCMA 和 TCMB0中。 我们不使用 malloc 函数、因此它不会出现问题

第{
text.hwi:palign (8)
.text.cache: palign (8)
text.mpu:palign (8)
text.boot:palign (8)
.text:abort:palign (8)/*这有助于在使用 XIP 模式时加载符号*/
ISR_tcma:palign (8)
}> R5F_TCMA

/*这是剩余的代码。 如果 DDR 可用且需要、可将其置于 DDR 中*
第{
.text:{}palign (8)/*这是代码所在的位置*/
rodata:{} palign (8)/*这是 const 的位置*/
}> R5F_TCMB0

/*这是其余的已初始化数据。 如果 DDR 可用且需要、可将其置于 DDR 中*
第{
.data:{} palign (8)/*这是初始化全局变量和静态 GO 的位置*/
.bss:{}palign (8)/*这是未初始化的全局变量转到的位置*/
RUN_START (_BSS_START)
RUN_END (_BSS_END)
stack:{} palign (8)/*这是 main()堆栈的位置*/
}> R5F_TCMA

/*这是剩余的未初始化数据。 如果 DDR 可用且需要、可将其置于 DDR 中*
第{
.sysmem:{} palign (8)/*这是 malloc 堆的位置*/\
}> MSRAM

/*这是不同 R5F 模式的堆栈所在的位置*/
第{
irqstack:{. =。 +_IRQ_STACK_SIZE;}对齐(8)
RUN_START (_IRQ_STACK_START)
run_end (__IRQ_STACK_END)
fiqstack:{。 =。 +__FIQ_STACK_SIZE;}对齐(8)
RUN_START (_FIQ_STACK_START)
RUN_END (_FIQ_STACK_END)
svcstack:{. =。 +_SVC_STACK_SIZE;}对齐(8)
RUN_START (_SVC_STACK_START)
RUN_END (_SVC_STACK_END)
.abortstack:{. =。 +_abort_stack_size;}align (8)
run_start (__abort_stack_start)
run_end (__abort_stack_end)
未定义的堆栈:{。 =。 +_未定义_堆栈_size;}align (8)
run_start (__undefined_stack_start)
run_end (__undefined_stack_end)
}> R5F_TCMA

/* C++项目所需的段*/
第{
arm.exidx:{}palign (8)/*需要用于 C++异常处理*
init_array:{}palign (8)/*包含 main 之前调用的函数指针*
.fini_array:{}palign (8)/*包含 main 之后调用的函数指针*
}> R5F_TCMB0

设置为释放模式、优化级别设置为快速。  

编程到器件并测量测试结果。

您可以看到 ISR 是干净的。 仍然需要309ns。  

客户希望在200ns 内切换 GPIO。 您能不能建议我们还能做些什么?

此致

Andre

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Andre

    我将与内部团队支持一起处理此主题、并尽快与您联系

    此致

    Sri Vidya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Andre、

    下面是 AM243x 开箱即用基准测试演示的屏幕截图。 它显示了大约160ns 的中断延迟数:

      

    唯一的区别是基准测试演示使用计时器和计时器计数器寄存器来计算从中断触发到第一次指令执行的时间、同时使用 GPIO 中断和 GPIO 输出。 R5F 中断使用相同的 VIM、因此我认为额外延迟与 VIM 或 Hwip 无关。 我想它来自 GPIO 输出。 您能否 使用 DPL 函数:CycleCounterP_getCount32来测量* GPIO1_8_SET_ADDRESS = GPIO1_8_MASK 的执行时间。

    实际上、您所获得的示波器捕获已得到某种程度的确认 、** GPIO1_8_CLEAR_ADDRESS = GPIO1_8_MASK"花费了大约200ns (从高到低)。

    此致、

    Ming

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

      Q1:R5F 上的 FIQ 和 IRQ 中断延迟(周期数)是多少?

      Q2:确认了~200ns GPIO 延迟?

    此致

    Andre

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Andre、

    Q1:上述测量用于 IRD 中断延迟。 我尚未测量 FIQ 中断延迟。

    Q2:我们尚未确认~200ns GPIO 延迟。 根据 AM243x 数据表、GPIO1延迟应为2P+2.6、P 是以 ns 为单位的 GPIO 功能时钟周期、应为500MHz/4 = 125MHz = 8ns、因此应为18.6ns。

    我们认为额外的延迟184ns-18.6ns = 165.4ns 最类似于中断延迟、因为 GPIO_bankIsrFxn 中的"* GPIO1_8_SET_ADDRESS = GPIO1_8_MASK"可能会导致另一个 GPIO 中断。 是否可以在未启用 GPIO 中断的情况下测试 GPIO 输出?

    此致、

    Ming  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     这是一个非常简单的测试程序:GPIO1_36每秒切换 GPIO1_35。 GPIO1_35仅是系统中的中断。 此测试程序中没有启用其他中断。 ISR 只执行一个操作来切换 GPIO1_8并清除状态。 请参阅我之前随附的源代码。

      请勿与其他讨论主题混淆。 本主题将重点介绍中断延迟。  

    您可以看到我使用了两个通道来捕获结果。 GPIO1_36和 GPIO1_35连接在一起。

    GPIO1_36在通道中上升和触发 FIQ 1.

    2.通道上的 GPIO1_8切换2.

    我们关注 GPIO1_36的上升沿到 GPIO1_8上升沿之间的时间。 需要309ns。

    掩码只有一个位设置。  

    #define GPIO1_8_MASK      ((uint32_t) 0x00000100)

    系统只有 一个中断。  因此我不理解为什么您在   GPIO_bankIsrFxn 中得出结论"* GPIO1_8_SET_ADDRESS = GPIO1_8_MASK"可能会导致另一个 GPIO 中断。

    在这里、我们再次关注中断延迟。 根据您的计算。  中断延迟应为309ns -  18.6ns ~= 290ns。  

    您是否会检查代码中的任何错误以及如何将中断延迟提高 到100ns。

    此致

    Andre

    同样、不要与另一个线程混淆、该线程侧重于将 GPIO 寄存器设置为 GPIO 电平更改之间的延迟。

     

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    安德烈曾、您好!

    我们已经讨论 了另一个线程上的 GPIO 延迟。

    我们需要在两个阶段确认问题-

    • 第1步-我们将确认 GPIO 输出延迟。
    • 第 2步- 我们 还将确认 GPIO 输入延迟。

    正如您在另一个线程中提到的 AM263X-LP 的性能、您能否共享 AM263x-LP 的相同结果。 比较苹果和苹果会更好。

    谢谢、 此致、
    Aakash

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Askash、

      请参阅 LP-AM2634的结果、GPIO44是中断源、GPIO65在 ISR 中被切换。 ISR 在 TCM 中运行、GPIO 寄存器区域的 MPU 设置为严格排序。

    在测量过程中、中断延迟为440ns、GPIO 延迟为34ns、这与另一线程中的测量相同。   https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1122978/am2434-am2434-gpio-interrupt-latency

    测试代码如下:

    e2e.ti.com/.../gpio_5F00_interrupt_5F00_latency_5F00_am263x_2D00_lp.zip

    对于 LP-AM243x 测量、即使 I 减去 GPIO 延迟、中断延迟也= 309ns -184ns = 125ns。 我们似乎仍在努力实现100ns 延迟(如果100ns 是最小中断延迟)。 我们可以向客户提出一些建议吗?

    此致

    Andre

        

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    安德烈曾、您好!

    根据我们在电子邮件中的讨论、结束此主题。

    BR、
    Aakash