您好专家、
中断延迟可以小于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