問題タブ [rtx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - KEIL RTX RTOS でタスクを実行するための固定時間
プリエンプティブ ラウンド ロビン スケジューラを使用する KEIL RTX RTOS を使用しています。データを表示するための LCD があり、いくつかのタスクがこの LCD にアクセスできます (他にもいくつかのタスクがあります)。たとえば、最初のタスク ハンドル LCD はデータを 50 秒間表示し、50 秒後、2 番目のタスクはデータを 10 秒間処理して表示します)。LCD へのアクセスを管理するためにミューテックスを使用する必要があることはわかっていますが、一定時間管理する方法がわかりません。LCD タスクは優先度が最も低く、他に実行するタスクがない場合、これらのタスクはメッセージを表示するために実行されます。 .
rtos - イベント フラグ関連の関数が keil rtx のタスクの外で正しく動作しないのはなぜですか?
ご存じのように、イベント フラグは非常に便利です (例: タスクの実行を許可する) が、残念ながらそれらの制御関数 (os_evt_clr/set/wait) はタスク本体の外 (例: 割り込み処理関数) で正しく機能しません。別の方法として、変数を使用し、必要に応じて割り込みハンドラーで初期化し、別のタスクでそれを使用して os_evt_set() 関数を実行し、MCU がタスクに入るようにしました。
より良いアプローチはありますか?WBR。
c - メッセージ キューを使用した Keil RTX の問題
Keil rtx メッセージ キューの使用に問題があります。send_thread と receive_thread の 2 つのスレッドがあります。
擬似コード:
問題は、何が間違っているのか、それをどのように実装する必要があるのかということです。アドレスをデバッグしましたが、同じものを取得しました。違いは、send_thread では送信変数がポインターの配列へのポインターですが、receive_thread には void* しかなく、その中の値にアクセスできないことです。
どんな提案でも大歓迎です。
twincat - TwinCAT 3 または IntervalZero
新しいボード (名前は XYZ とします) の EtherCAT 通信をテストするつもりです。そこで、XYZ を Slave にしてマスターに接続する予定です。生活を楽にするために、自分の PC (Windows とクアッドコア xeon cpu) のマスターとして TwinCAT 3 または RTX64 を使用することにしました。3つの質問。1. これらのソフトウェアのうち、どちらが優れているか、またその理由は? 例 - モジュール性、さらなるプロジェクト、互換性 (ソフトウェアとハードウェアの両方)、matlab 統合、コスト (予想外) などに関して (私が言及した以上のものになる可能性があります)。2. ソフトウェアを使用して EtherCAT マスターを構成し、PC の既存のイーサネット ポートを介してデータを送信できますか? 3. XYZ スレーブは非インテル EtherCAT スレーブ チップセットです。これは合併症を引き起こしますか?(理想的にはそうあるべきだ」
gcc - Keil RTX の開始時の制御
比較的複雑な通信インターフェイスを利用する ARM Cortex-M3 用のブートローダーを作成しています。これは、実際のアプリケーションが使用するものと同じです。アプリケーションはカーネルとして Keil の RTX を使用し、通信スタックはそれに依存しています。もちろん、GCCを使用しています。
ブートローダーは、次の基本的な手順を実行します。
- 起動時に、有効なアプリ イメージをチェックします。利用できない場合は、アップグレード モードに入ります。
- アップグレード モードに入る要求としてボタンが押されたかどうかをチェックします。それが見つかった場合は、アップグレード モードに入ります。
- 有効なイメージが見つかり、アップグレードの要求がない場合、アプリを「起動」します。
これはかなり単純化されていますが、このシナリオは目的に沿って適切に説明されています。
驚くほど困難であることが判明した最後の問題は、アプリの起動です。アイデアは、割り込みを無効にし、ベクター テーブル、スタック ポインターを設定し、新しいベクター テーブルでアプリのリセット ベクターにジャンプすることです。これはすべてピーキーに機能しますが、その後すぐにハードフォールトが発生します。
実験を通じて、単純なブートローダー (RTX や、もちろん通信スタックを使用しない) でこれを行うと、アプリの起動は正常に機能します。つまり、RTX が問題のようです。
実際のブートローダーは、アップグレード モードに入るまで RTX を必要としません。したがって、明らかなアプローチは、RTX が必要であると判断するまで RTX を開始しないことです。ただし、起動コードにハッキングされているようで、ブートローダー コードに入るまでには手遅れです。実際、ブートローダーの main() 関数はすでにスレッドです!
最善の方法は、必要になるまで RTX を開始しないことです (FreeRTOS を使用していなかったのが残念です!)。ただし、これにはハッキングが必要なようです。別のアプローチは、何らかの理由ですべての割り込みと例外を無効にすることですが、何らかの理由で、私も成功していません。誰かがどちらかのアプローチの例を持っていますか?
stack - Keil RTX RTOS スレッド スタック サイズ
Keil RTX RTOS 構成ファイルで、ユーザーはデフォルトのユーザー スレッド スタック サイズを構成できました。一般に、スタックは auto/local 変数を保持します。「ZI データ」セクションには、初期化されていないグローバル変数が保持されます。
したがって、RTX 構成ファイルでユーザー スレッドのスタック サイズを変更すると、スタック サイズが増加し、「ZI データ」セクションのサイズは増加しません。
テストしたところ、ユーザー スレッドのスタック サイズを増やすとテスト結果が示されました。「ZI data」セクションのサイズは、同じサイズで同期的に増加します。
私のテスト プログラムでは、6 つのスレッドがあり、それぞれに 600 バイトのスタックがあります。Keil を使用してプログラムをビルドすると、次のことがわかります。
しかし、各スレッドのスタック サイズを 800 バイトに変更したとします。キールは次のように私に示します:
「ZI データ」セクションのサイズが 6484 バイトから 7684 バイトに増加しました。7684 - 6484 = 1200 = 6 * 200. そして 800 - 600 = 200. したがって、スレッド スタックは " ZI Data " セクションに配置されていることがわかります。
私の質問は次のとおりです。スレッドスタックが RAM の「ZI データ」セクションに配置されると、スレッドの自動/ローカル変数が「ZI データ」セクションに配置されるということですか? true の場合、スタック セクションがまったくないことを意味します。「RO/RW/ZI データ」とヒープ セクションしかありません。
この記事は私に別の答えを与えます。そして、私は今それについて少し混乱しています。 https://developer.mbed.org/handbook/RTOS-Memory-Model
arm - keil rtx osdelay が正確な遅延を作成しない
私は LPC1768 マイクロコントローラーを含むボードに取り組んでいます。私がしたいのは、CMSIS RTOS API の osdelay 関数を使用して正確な時間遅延を作成することだけです。システムスティックのタイムティックカウントを 10000 に設定しましたが、スレッドで osdelay(1000) を使用すると、1 秒の遅延期間が作成されません。
ここにソースコードがあります
ここで、私の問題は、osdelay(1000) が 1000 ミリ秒の遅延を提供しないことです。sysstick タイマーのティック値を 1000 に設定する必要があります。
arm - IAP ブートローダーが RTX アプリケーション イメージを読み込めませんでした
ソフトウェアを 2 つの部分に分割しました: ブートローダー (RTX なし)、RTX 付きのアプリケーション イメージ。しかし、ブートローダーは RTX でアプリケーション イメージをロードできませんでした。フラッシュ設定は次のとおりです。
私は 3 つの方法をテストしました: (1) RTX なしで別のアプリを使用します。ブートローダーはアプリを正常にロードできました。
(2) RTX プロジェクトの IROM 設定でアプリケーションを変更します。アプリケーション プロジェクトの IROM 開始アドレスを 0x08002800 から 0x08000000 に変更します。そして、アドレス 0x08000000 からアプリケーション イメージをフラッシュにダウンロードします。イメージは 0x08000000 から正常に実行できました。
(3) アプリケーションイメージの IROM 開始アドレスの設定は 0x08002800 です。ブートローダーとアプリ イメージをフラッシュにダウンロードした後、アプリ プロジェクトを keil で段階的にデバッグします。「osTimerthread スタック オーバーフロー」エラーがあることがわかりました。次に、メイン スレッド スタックもオーバーフローします。スタックサイズを増やそうとしましたが、うまくいきません。アプリが RTX カーネルの切り替えでスタークすることがわかりました。すべてのスレッドが待機状態にあり、実行されていません。
追伸、keil でデバッグしているときに、テスト項目 (2) にもカーネルの初期化中にスタック オーバーフロー エラーが発生します。アイテム(2)は今のところ問題なく動作します。だから、ここに必要な情報を入れただけです。
eclipse - Eclipse を使用した RTX の実装
RTX (RTOS) について質問があります。RTOS RTX を NUCLEO-F411RE ボード (Cortex M4) に実装する必要があります。私はEclipseでそれをしなければなりませんが、どうすればいいのかわかりません。
さらに、gcc コンパイラでコンパイルしようとしたところ、次のような多くのエラーが発生しました。
誰かがそれを修正するのを手伝ってくれますか?