皆さん、こんにちは。私は非常に奇妙な問題を抱えており、誰かがこれに取り組む方法についてアドバイスをくれることを願っています。なぜなら、私は何日もこれに取り組んでおり、何が問題なのか理解していないからです。
私はMCUXpressoとMIMXRT1010-EVKを使っています。
サンプルごとに割り込みを生成するADCがあります。そして、サンプルレートは288KHzです!
この割り込みでは、グローバル変数に応じていくつかの処理を行います。デフォルトでは、グローバルフラグは低く、私はほとんど処理を行いません。
割り込み時に出力端子をハイにセットしました。また、オシロスコープでは、割り込みが実際に288KHzの速度で発生し、各割り込みにマイクロ秒のほんの一部しかかからないことがわかります。約8%のプロセッサ負荷。
main 関数では、コマンド ループが実行されています。これにより、グローバル変数を変更し、割り込み負荷をゆっくりと増やすことができます。そして、オシロスコープでは、割り込みの負荷が上がっていることがわかります。通常は80%または90%まで問題ありません。メイン コマンド ループが動作し続けます。
問題を:
新しいコンパイルの後、アプリケーションは正しく起動することがありますが、グローバル変数を増やして割り込みロードすると、メインループが突然停止します。しかし、割り込みは機能し続けます。これは常にほぼ同じ割り込み負荷(約40%)で発生しているようです。
そして、次にコンパイルして実行するとき(割り込みとは関係のないコードを追加した後)、まったく問題はありません。そして、メインループは割り込み負荷を増やしながら稼働し続けます。メモリ内のコードや変数の位置に依存しますか?
これの原因とこれにどのように対処するか、何か考えはありますか?アイデアが足りません。
割り込みルーチンでは、ADCの値を読み取っていくつかの計算を行うだけです。次に、グローバル変数を記述します。
問題を見つけたと思います!
私はそれが高レート割り込みを扱う開発者にとって非常に貴重な情報になると思うので、それについて新しいスレッドを作りました。
このスレッドを参照してください。
問題は、メインループの実行には、外部コードの読み取りが必要であり、それが何らかの割り込みによって何度も中止されることのようです。
あなたは私の言いたいことを見逃していると思います。
説明のつかない奇妙なことが起こっています。コードが変更されると、その変更が問題と関係がない場合でも、問題は解消される可能性があります。したがって、何かを変更して、それが機能するときに修正されたと言うことは意味がありません。時限爆弾です。
これに対処する唯一の方法は、問題を再現し、何が起こっているのかを見つけることです。これを、SDK (またはチップ) の重大なバグを見つける機会と見なしてください。
アーキテクチャを変更すべきだと言うのも、これを解決する方法ではありません。割り込みをこのように使用したい場合は、それができるはずです。しかし、繰り返しになりますが、それは問題ではありません。要は、SDK(またはチップ)に深刻な問題があるかもしれないということで、その問題を示すデモを作りました。もしかしたら、私が何か間違ったことをしているのかもしれません。しかし、あなたが言及した変更は、私が行った根本的な誤りではありません。
また、ADC割り込み内のADC_ENV割り込みをクリアすることは、私には意味がありません。そして、それはとにかくほとんどの場合うまくいきます。したがって、割り込みをクリアするのを忘れると、割り込みはまったく正しく機能しません。いずれにせよ、私はあなたの変更を試しましたが、問題はまだ存在しています。
私は新しい製品ラインのためにNXPの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ボードでは(私は2つのEVKボードを持っていますが、どちらも同じ問題を示しています)。
バージョン 2.16.000 (847 2024-07-12) マニフェスト バージョン 3.14.0 の最近のビルド SDK を使用しました
最近インストールした MCUXpress IDE v24.9 [ビルド 25][2024-09-26] を使用しました。
こんにちはMayliu1、
お返事ありがとうございます。
奇妙なことの1つは、問題が発生してMCUを一時停止しても、何も奇妙なことが見当たらないことです。そして、MCUを再開すると、再び動作します!!
この問題は、デバッガーがない場合でも発生することに注意してください。したがって、デバッガーの問題ではありません。
また、割り込みの計算についてのご意見もお聞かせください。私は割り込みでいくつかの計算をする必要があります、それはまさに私が必要とするものです。
そして現在、私の割り込みルーチンは、問題を示すための負荷を作成するために、いくつかのダミーのものを実行します。
MIMXRT1010-EVKボードはありますか?あなたが奇妙な行動を自分で見ることができるように、プロジェクトを送ることができました。