2002889_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2002889_zh-CN

2002889_zh-CN

如何解决这个非常奇怪和困难的问题......

大家好。我遇到了一个非常奇怪的问题,希望有人可以给我建议如何解决这个问题,因为我已经研究这个问题好几天了,但我只是不明白出了什么问题。

我正在使用 MCUXpresso 和 MIMXRT1010-EVK。

我有一个 ADC,它为每个样本生成一个中断。并且采样率为288KHz!

我根据全局变量在这个中断中做一些处理。默认情况下,全局标志较低,我几乎不进行处理。
我在中断期间将输出引脚设置为高电平。在示波器上我可以看到中断确实以 288KHz 的速率发生,并且每次中断仅需要几分之一微秒。处理器负载约为 8%。

在主函数中,命令循环正在运行。通过这个我可以改变全局变量并且可以慢慢增加中断负载。我可以在示波器上看到中断负载上升。通常高达 80% 甚至 90% 都没有问题。主命令循环继续运行。

问题:

有时,在重新编译后,应用程序可以正确启动,但是当增加全局变量并因此增加中断负载时,主循环会突然停止。但中断仍在继续工作。它似乎总是发生在大约相同的中断负载(约 40%)下。

下次我编译并运行时(添加一些与中断无关的代码后)完全没有问题。并且主循环继续运行,同时增加中断负载。它是否取决于内存中代码或变量的位置?

知道是什么原因导致的吗?如何解决这个问题?我没有主意了。

在中断程序中我只读取 ADC 值并做一些计算。然后我写一个全局变量。

回复:如何解决这个非常奇怪和困难的问题......

我想我找到问题了!
我为此创建了一个新线程,因为我认为它对于处理高频率中断的开发人员来说是非常有价值的信息。

请参阅此主题

问题似乎是,为了执行主循环,需要读取外部代码,而这些代码却被某些中断一次又一次地中止。

回复:如何解决这个非常奇怪和困难的问题......

我觉得你没有理解我的意思。

发生了一些无法解释的奇怪事情。当代码改变时,问题可能会消失,即使这种改变与问题无关。因此,改变某些东西并在其工作时说它已经修复,这是没有意义的。这是一颗定时炸弹。

解决这个问题的唯一方法是重现问题,然后找出发生了什么。将其视为发现 SDK(或芯片)中严重错误的机会。

说我应该改变我的架构也不是解决这个问题的方法。如果我想以这种方式使用中断,那么我应该能够做到这一点。但这并不是重点。重点是SDK(或芯片)可能存在严重问题,我做了一个演示来展示这个问题。也许我做错了什么。但你提到的改变并不是我犯下的根本性错误。

并且清除 ADC 中断内的 ADC_ENV 中断对我来说毫无意义。而且无论如何,它大多数时候都是有效的。因此,如果忘记清除中断,它就根本无法正常工作。无论如何,我尝试了您的更改,但问题仍然存在。

我正在评估 NXP MCU 是否适合新的产品线。如果不解决这个问题那么我们将无法选择这个MCU。我真的很想使用这个 MCU,所以请尝试按照我的方式看待它。

如果您不想这样做,请将其他有兴趣查找 SDK(或芯片)中可能存在的问题的人添加到此线程中。

回复:如何解决这个非常奇怪和困难的问题......

感谢@mayliu1的回答。

一个非常重要的问题是:您是否可以重现该问题?

回复:如何解决这个非常奇怪和困难的问题......

你好@mayliu1 ,我添加了你的更改,但没有帮助。

您是否成功重现了该问题?我认为这是非常重要的第一步。正如我所说,这是一个非常奇怪的问题,我已经尝试了各种各样的方法。


您将 PIT 初始化移至所有初始化结束时的主循环。为什么?
为什么要消除延迟?

这些只是猜测还是有目的?我想了解如何自己解决此类问题。

正如我之前提到的:以任何方式更改代码都可能导致问题不显现。这并不意味着不再存在问题。这是一颗定时炸弹。下一次代码更改后,该错误就会显现出来。

您要求插入ADC_ETC_ClearInterruptStatusFlags

我想这就是你想让我做的:

uint32_t标志 = ADC_ETC_GetInterruptStatusFlags(ADC_ETC_PERIPHERAL, kADC_ETC_Trg0TriggerSource );

ADC_ETC_ClearInterruptStatusFlags (ADC_ETC_PERIPHERAL, kADC_ETC_Trg0TriggerSource ,标志);

如果确实需要手动清除,我认为代码将永远无法正常工作。但它有时确实运行完美。

请运行演示,输入一个低位数字并观察 LED 闪烁。也尝试一些其他数字。
然后重新启动并输入“9”(最大的中断负载)。失败了吗?



回复:如何解决这个非常奇怪和困难的问题......

并且请注意,启动后第一次输入一些低数字(低中断负载)时似乎不会出错。然后由于某种原因,高负载确实可以正常工作。
但当重启后按下的第一个数字是 8 或 9 时,它会失败。


回复:如何解决这个非常奇怪和困难的问题......

@mayliu1 ,当您启动演示时,它应该在终端上显示“按下键输入命令...”。然后您可以输入 1 到 9 之间的数字来定义中断负载。然后它使 LED 闪烁 20 次并将负载设置回 20,您可以输入其他数字。
按下数字后,您应该会看到 LED 闪烁,并且闪烁频率也取决于负载(选定的数字)。如果不是这种情况,演示将不起作用。

请注意,仅设置 g_delay 不起作用,因为还需要设置 g_mode。这也是由主循环完成的。

请再试一次,因为我认为确实出了问题。

我尝试增加堆栈大小,但没有帮助。

是的,我知道,不应该在中断程序中进行太多计算。但这正是该应用程序的目的所在。无法改变这一点。
无论如何,我使用人工中断负载来使问题更容易被发现。


回复:如何解决这个非常奇怪和困难的问题......

你好@mayliu1 ,你有机会测试它吗?我真的不知道为什么会发生这种情况,而且我目前没有任何主意。

回复:如何解决这个非常奇怪和困难的问题......

我能够将其缩小为一个非常简单的程序。

它有一个以 288KHz 调用的 ADC 中断程序。该例程根据全局变量执行一些虚拟操作。因此负载可以改变。请注意,也可以在 J56 的引脚 16 处监控负载。

主循环只是等待一个键(1-9),然后相应地设置中断例程加载的全局变量。然后,它使用软件循环延迟使 LED 闪烁几次。因此当中断负载较高时,LED 将以较低的频率闪烁。

当我启动该程序并点击“6”(中断例程的负载约为 50%)时,主循环就会冻结。LED 不再闪烁。但中断程序继续(引脚 16 J56 仍在切换)。
当使用调试器暂停并恢复时(几次),主循环再次启动!从那时起,对于我输入的任何数字,主循环都不会冻结。即使对于中断程序的最高负载也是如此。

请注意,这一切并不总是发生,所以也许你需要做几次。

还要注意,当您第一次击中像“3”这样的较小数字时。主循环不会冻结。即使此后选择一个较高的数字。问题没有出现!那么这可能与缓存有关吗?

还要注意,程序中仍然有一些代码没有执行或者做了无用的事情。但当我改变某些东西并重新编译时,问题就会消失。这是我能制作的最小版本,它显示了问题。至少在我的 MIMXRT1010-EVK 板上(我有两个 EVK 板并且都出现同样的问题)。

我使用了最新版本的 SDK,版本号为 2.16.000(847 2024-07-12),清单版本号为 3.14.0

我使用了最近安装的 MCUXpress IDE:v24.9 [Build 25][2024-09-26]


回复:如何解决这个非常奇怪和困难的问题......

你好 Mayliu1,

谢谢您的回复。

奇怪的是,当问题发生并且我暂停 MCU 时,我没有看到任何异常。当再次恢复 MCU 时,它又可以工作了!!

请注意,即使没有调试器也会出现该问题。所以这不是调试器的问题。

关于您对中断中的计算的评论。我需要在中断中做一些计算,这正是我所需要的。
目前我的中断程序只是做了一些虚拟的事情来创建一些负载来显示问题。

您有 MIMXRT1010-EVK 板吗?我可以发送这个项目,以便您亲眼看到这种奇怪的行为。

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-21-2025 02:37 PM
更新者: