問題タブ [ucos]
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.
synchronization - uCOS-ii ミューテックス vs クリティカル セクション vs スケジューラー ロック vs セマフォ
uCOS-ii を実行している組み込みシステムについて書いています。2 つの整数 (互いに同期する必要がある値とタイムスタンプ) をアトミックに書き込む (および読み取る) 必要があります。最も簡単な方法は、2 つの値の書き込みをクリティカル セクションでラップして、割り込みやタスクの切り替えを無効にすることです。しかし、これは非常に積極的であり、割り込みを無効にすることで他のリアルタイムのものを台無しにするのは非常に簡単だと言われました.
しかし、2 つの整数を書き込むのは非常に小さな操作であるため、mutex を使用して簿記全体を処理する価値があるかどうかはわかりませんでした。
そこで、いくつかの測定を行いました。これら 2 つの値を 100 万回書き込むのにかかる時間を測定し、かかったミリ秒数を数えました。さまざまな同期メカニズムのオーバーヘッドを理解するためだけに、これらすべてを 1 つのタスクで実行しました。結果は次のとおりです。
- 同期メカニズムなし: ~65
- クリティカル セクション: ~185
- 優先度 2 のミューテックス: ~1890
- スケジューラがロックされている: ~1750
- 1 で初期化されたセマフォ: ~1165
私はこれに慣れていないため、デバッガーを接続してこれを測定したことは認めますが、プロファイラーがあるかどうかはわかりませんが、CS が最速であり、ミューテックスがセマフォよりも遅いことは理にかなっています (なぜならすべての優先順位の逆転処理があります)。
このことから、クリティカル セクションを使用するのが最善であると結論付けるべきでしょうか? それとも、割り込みを無効にするのは本当に悪いことですか? 一般に、各同期メカニズムをいつ使用するかについてのガイドラインはありますか?
更新: 同僚がスピンロックの使用を提案しました。明らかに、これはより高度な同期メカニズムよりもオーバーヘッドが小さくなります。しかし、この特定のケースでは、クリティカル セクションよりも優れているのではないかと思います。
更新 2: 考えてみると、CPU が 1 つしかないため、スピン ロックは何の役にも立ちません。コンテキストが切り替わるまでスピンします...
sqlite - メモリ割り当てに問題があるSTM32へのSQLite移植
STM324xG_EVAL ボードで実行されている uCOS RTOS に SQLite を移植しようとしています。SQLite で使用される RAM ベースのファイル システムを作成するために、micrium ファイル システムを使用しています。さまざまなビルド構成を試し、sqlite3_config API を使用して、ヒープ、スクラッチ、ページ メモリなどのさまざまなメモリ領域を定義しました。DB を初期化 (sqlite3_initialize) して開く (sqlite3_open) ことができます。しかし、テーブル (sqlite3_exec) を作成しようとすると、「ジャーナル ファイルが見つかりません」、「メモリ不足」などのエラーが発生します。何が問題なのか
ありがとう、四条トーマス
c - Cでコードを1回だけ実行する
コードを一度だけ実行したい。bool 型のグローバル変数に基づくソリューションを使用しました。私の質問は、それが最善の解決策ですか?
備考:ucos-IIを使用しています。
semaphore - ISR 内の UC/OS III セマフォが機能しないことがある
セマフォに問題があります。ISR 内で呼び出された SemPost が有効でない場合があるようです。
私のアプリケーションは Micrimum UCOS III に基づいており、ターゲット プラットフォームは Microsemi Smartfusion2 SoC (Cortex-M3) に基づいています。私のアプリケーションは 2 つのタスク (A と B) で構成されていますが、問題が発生したときにアクティブになるのは 1 つだけです (もう 1 つのタスクはセマフォでスタックしています)。
問題は、アクティブなタスク (タスク A と呼びましょう) が次のアクションを実行するときに発生します。
- 割り込みがトリガーされた後に操作を開始するためにいくつかのレジスタに書き込みます
- 100ミリ秒のタイムアウトを設定して、セマフォ(Sem Aと呼びましょう)でOSSemPendを作成して操作の完了を待ちます。
- OSSemPend 呼び出しが正常に終了したかどうか、またはタイムアウトが発生したかどうかを確認します
割り込みがトリガーされると、タイムアウト前にセマフォのロックを解除するために、関連する ISR が Sem A で SemPost を作成します。
問題が発生すると、OSSemPend は OS_ERR_TIMEOUT を返します。この問題は非常にまれにしか見られません。
私は確信しています:
- 開始操作 (ポイント 1 を参照) が与えられ、操作が開始されます。
- 割り込みがトリガーされ、Sem A の OSSemPost が実行されます。
- 割り込みは、開始から 500 マイクロ秒未満 (つまり、1 ミリ秒未満) 後にトリガーされます。
コードは適切に記述されていますか? ISR 内でのセマフォの使用に制限はありますか? 誰かが私を助けることができますか?ありがとうございました
コードの簡略版を同封します
c - uC/OS-III システムスティック & PWM 干渉用のペリフェラル timer0
uC/OS-III を実行している NXP LPC1857 でスムーズに動作する LED の PWM 信号を取得するのに問題があります。1 ミリ秒で実行されている OS システムスティックを無効にした場合にのみ、定期的に発生するちらつきが停止します。
各色 (赤、緑、青) 用に 1 つ、全期間用に 1 つ、計 4 つのマッチ レジスタを使用してタイマーを設定しました。最初の 3 つの一致出力は、各色の物理出力ピンをクリアしています。最後のピリオドが一致すると、次のピリオドの 3 つのカラー出力すべてを設定するための割り込みが生成されます。
割り込みの周りに次のコードを追加して、timer0 割り込み中に OS からの割り込みを無効にしようとしました。
システムスティックが PWM 信号のちらつきを引き起こす理由を知っている人はいますか?
c++ - C++ を使用した MicroC OS-II
MicroC OS-II を使用して新しい組み込みプロジェクトをセットアップし、C++ を使用したいと考えていました。
new 演算子を使用してクラスのインスタンスを作成しようとすると、プロセッサで例外が発生します。これは、new 演算子での malloc 呼び出しの失敗が原因のようです。これは失敗する例です:
testC は、整数メンバー変数を持つクラスです。ところで、私は Altera Nios 2 を使用しています。
いくつかの調査の後、malloc は RTOS と互換性がないという結論に達しました。したがって、私の質問: uC/OS-II で C++ を使用することは可能ですか? または、新しい演算子で malloc 呼び出しを置き換える方法はありますか?
これまでのところ、これに関する追加情報は見つかりませんでした。
ご助力ありがとうございます。ベスト、ローマ
task - MicroC/OS II (ucos ii) で優先度を変更すると、タスク ID が変更されますか?
いくつかの RTOS (pSOS、VxWorks、QNX) の経験がありますが、MicroC/OS II (ucos ii) は初めてです。ucos ii のユニークな点は、タスクに一意の ID を持つ代わりに優先度を使用してタスクを一意に識別し、すべてのタスクが異なる優先度でなければならないため、ラウンド ロビン スケジューリングがサポートされていないことです。それくらい、わかります。質問は次のとおりです。
OSTaskChangePrio() を使用してタスクの優先度を変更しても、優先度を変更したばかりのタスクの優先度 (タスク ID) を格納していたコードやその他のタスクで問題が発生することはありません。実際、優先度を変更すると、タスクのアイデンティティが変更されます。これはどのように問題ではないのですか?