论坛

LPC2387 GPIO中断延迟

开始于 "ger ... @ yahoo.gr [lpc2000]" 2014年12月17日
大家好,我发现GPIO中断与EXTINT3共享最高 优先级大约为60usec。延迟,而不是EXTINT3引脚。
可以修复此功能吗?有什么方法吗?
我正在尝试连接条形码阅读器,并且总是丢失第一个 clock.
我在eclipse IDE中使用gcc gnu arm。

提前致谢
克里斯

LPC2100系列工程师指南

我不知道您如何定义中断程序或您是哪个编译器 使用,但GCC会生成大量的前导代码来保存和恢复一堆 of registers.

因此,如果您使用的是GCC,请考虑让函数原型包含 属性为“裸”。这消除了任何进入和退出代码。现在你是 负责保存和恢复使用的所有寄存器。这使得 判断中断代码是否用汇编语言编写。试图out测 C编译器在寄存器使用上几乎注定会失败。

RTOS实施中使用的GCC属性 http://www.freertos.org/implementation/a00013.html

RTOS实施中使用的GCC属性 http://www.freertos.org/implementation/a00013.html 使用GCC属性 防止编译器将代码插入RTOS中断程序。

在www.freertos.org上查看 http://www.freertos.org/implementation/a00013.html
雅虎预览

流水线处理器不一定具有最低的延迟。它 取决于设计者如何决定处理队列。他们可能会中止一切 正在进行的指令(不太可能),或者只是将分支指令塞入 队列的开头,而不是下一个顺序指令。我没有 任何想法如何在ARM处理器上完成。不过,60美元似乎很长 time.

在LPC2148中,有两种到达引脚的方法:标准GPIO和 快速IO。内部引脚的连接方式对 引脚可切换的速率。我不知道这是否适用于 中断系统,但可能会。

LPC2378具有类似的结构。查看用户中是否有东西 Manual re: Fast IO.

理查德
嗨,理查德,

感谢您的答复。
所有IO引脚均配置为FIO。在我的程序集启动文件中,我做了一些 我以前的项目中发生了变化(没有时间紧迫的中断),所有这些似乎 to be OK.

我尝试使用ISR_ENTRY()设置“裸”属性&ISR_EXIT()defs但相同 results.

这是我的项目的一些文件的链接:

//www.sendspace.com/file/7wux9h //www.sendspace.com/file/7wux9h

在ISR_EINT3的s_irq.c gile中,您会看到发生gpio中断时,我 禁用Interrpt,然后更改另一个GPIO的状态。 从条形码发出的第一个时钟开始,此更改大约需要60us 读者。看一下(GPIRQ_DisableInterrupt(KW_CLK_PRT,KW_CLK_PIN);
ClrPin(DO1_PRT,DO1_PIN);)

如果有人可以帮助我,我将非常感激。

提前致谢

克里斯
如果您编写最短的代码来确认 中断并切换图钉?摆脱所有其他代码,尤其是其他 中断代码。新项目可能少于100行代码 INCLUDING crt.s

您有很多其他中断正在进行的中断处理,而我 并没有看它们是否可以重叠或它们是否更高 priority.

理查德
另外,如果您没有将FIQ用于短延迟中断,则应该这样做。 参见第7.5节:

http://www.nxp.com/documents/data_sheet/LPC2387.pdf http://www.nxp.com/documents/data_sheet/LPC2387.pdf

理查德
理查德,早上好

如果您编写最短的代码来确认会发生什么 中断并切换引脚?我想我错过了你的意思。 3个或4个GPIO加EXTINT(最高优先级ISR)引脚共享相同的ISR。 当我意识到自己有 long latency
摆脱所有其他代码,尤其是其他中断代码。
每种情况都是另一个引脚(中断)源。如果我误会了就让你 code suggestion.
感谢您的时间!
问候克里斯
我以某种方式认为您只有一个时间要求严格的输入。我意识到那里 在您的项目中有很多中断。

当我尝试排除故障时,我将代码剥离到最小 演示问题所需的行。一针一中断,一无所有 其他。这样,我知道硬件在最佳情况下会做什么。

顺便说一句,即使在使用快速IO的情况下,ARM也无法很好地实现引脚的切换。尝试 编写一个循环,看看使引脚改变状态的速度有多快。你可能会 感到惊讶的是它不会以MHz速率切换。

过去对于GPIO来说如此严峻,以至于他们不得不发明FIO设置。

理查德
60 us必须是IO的某种问题。任何合理的中断开销 就像推送寄存器不会花费那么长的时间(假设CCLK是合理的,而您 正在使用内部存储器,并且您不会被某些事物打扰 else)

我曾经遇到过外设时钟速率有所不同的情况。看着 外设中断期间访问的所有外设的时钟速率。和 将外设寄存器的访问权限保持在最低水平。
我想知道您是否可以使用捕获计时器来确定真正的中断 latency.

外部信号使捕获寄存器加载当前定时器值 但是AFAIK不会停止计时器。此捕获事件可能会导致 如果需要,可以打断(确实如此)。

再次在中断程序中读取时间,然后减去捕获的值。 一小部分的算术和实际等待时间将被确定。

时钟速率和预分频器值起作用,但这只是一个开始。

理查德