-4

こんにちは、組み込みプログラマーです。最近、マルチスレッドの使用を余儀なくされているプロジェクトに出会いました。私はJavaで同じものを使用しましたが、8051の埋め込みコードを実装できませんでした.誰か助けてもらえますか?

4

2 に答える 2

5

スレッド化には、通常スケジューラと呼ばれる、スレッドを切り替える何らかのメカニズムが必要です。

大まかに言えば、スレッド化には 2 つのタイプがあります。協調型とプリエンプティブ型です。

協調スレッドでは、各スレッドが何らかの作業を行った後、制御をスケジューラに戻します。これは、プログラム構造として大規模な while(1) {} ループを持つようなものですが、タスクの独立性 (開発時のみ) が高いだけです。1 つのタスクが CPU を占有したり、ロックして他のタスクの実行を妨げたりするリスクは依然としてあります。実際、タスク間の独立性は、開発者にとって幻想または組織的な抽象化にすぎません。

プリエンプティブ マルチタスキングでは、スケジューラ (タイマー割り込みから駆動される可能性が高い)は、1 つのスレッドから実行を取得し、その状態を保存し、別の凍結スレッドを再起動することにより、定期的にタスクの変更を強制します。これはセットアップが少し難しいですが、より信頼性が高くなります。

多くの場合、どちらのスキームでも、インフラストラクチャをゼロから作成するのではなく、原始的なオペレーティング システムまたは少なくとも他の人が開発したスケジューラ ルーチンを使用します。

ただし、非常に小さな組み込みシステムの場合は、割り込みサービス ルーチン自体が、特定の短時間および/または緊急のタスクを処理するための代替スレッドに似たものを提供できると考えることができます。シリアル割り込みが発生した場合は、いくつかの文字を取得し、後で都合の良いときに別の方法で解釈できるように保存します。多くのタスクは、割り込みを使用して即時部分を処理し、その後、while(1) {} 型のプログラム構造の後の時点で結果の作業を行うことによって実装できます。

8051 で実行されるスケジューラーのアイデアを適切に笑う人もいるかもしれませんが、奇妙な理由により、安価で小さな 8051 と同等のコアは、今日ではかなり複雑な専用チップ (通常、大量のバンク メモリと強力なメモリによってアクセサリされます) になります。そのため、デバイスが行うすべてのことを管理するために、動的タスク作成が実装されたマルチスレッド ソリューションを目にすることは、実際には珍しくありません。

于 2013-07-02T13:59:07.127 に答える
0

8051 のアーキテクチャは、合理的なプリエンプティブ スケジューリングには適していません。オンチップ RDATA/IDATA の少なくともスタック、おそらくそれ以上のスタックを XDATA にスワップアウトする必要があり、非常に面倒です。

8051 は、トースター/洗濯機のコントローラーに適しています。

先制スケジューラなどの機能が必要な場合は、ARM に移行してください。

于 2013-07-02T14:22:54.267 に答える