マイクロコントローラを使用して複数のタイムクリティカルな機能を実装する良い方法は?


8

マイクロコントローラに非常にタイムクリティカルな機能を実装するための哲学またはアプローチは何ですか?

私は、さまざまな周波数の正確な方形波波形を出力するプロジェクトに取り組んでいます。タイマーと割り込み機能を使用してこれを行いました。ただし、これを正しく実装する場合でも、割り込みサービスルーチン中に取得したクロックサイクル数のオフセットを調整する必要がありました。私は、この精度が別のそのような波形を同時に実行することによって妨害されると想像します(たとえば、周波数を正確に同時に変更する必要があるとします)。マイクロコントローラをそれぞれ持つことで、そのような時間ごとに重要な機能は無駄に見えます。

クロック(hh:mm:ssなど)関数を実装する別の例を見てみましょう。すべての高レベルのマイクロコントローラー/コンピューターに、時間を追跡するためだけに専用のリアルタイムクロックチップがあるとは思えません。ただし、コアプロセッサを使用して正確に測定されていることを想像するのは難しいです。コアプロセッサは、非同期の間隔で大量の関数を処理するのに忙しいためです。タイムカウントにはオフセットエラーがあり、実行中の関数に応じて変化すると思います。

達成可能な精度に許容範囲を含める、または許容範囲を与える設計プロセスまたはアプローチはありますか?または、誰かがこれに関する詳細情報をどこで見つけることができるかについてのポインタまたは提案を持っていますか?


多くの場合、正確なRTCを必要とするものには、デバイスの電源がオフになっている時間を追跡するために、専用のチップ、または独自の電源と水晶を備えたサブ機能があります。時間は非常に面倒です。
pjc50 2016年

このような恐ろしいアーキテクチャの使用を停止する(または正しく使用する)-ハードウェアタイマーは、ISRのサービスに費やされた時間に依存しないようにします。
Spehro Pefhany 2016年

どのマイクロコントローラー?それはより良い品質の答えを可能にするでしょう。
StainlessSteelRat

@SpehroPefhany私は言わなければならない、私はこれでかなり経験が浅い 方形波で発生している問題は、出力の遷移ごとに周波数を変更できるようにすることです(2つの異なる方形波の場合、非同期の間隔であり、場合によっては一致する可能性もあります)。方形波は、私が考えていたより大きな質問の小さな部分でした。波形生成内で、複数の任意のアナログ波形をどのように実装しますか?犠牲は一般的な「サンプルレート」を作ることでしょうか?
midnightBlue

@StainlessSteelRat質問はかなり広いと感じたので、特定のマイクロコントローラーを意図的に指定しませんでした。私にとっては、それは大型コンピューターからマイクロコントローラーに至るまでのプロセッサー・アーキテクチャーに適用できるようです。部分的に、時間に敏感な複数の関数を実装するときに、優れた設計の作成/エラーの制限について学習できるリソースがあるかどうかを知りたいです。
midnightBlue

回答:


10

正確な方形波を出力するには、ハードウェアを使用します。ほとんどのマイクロコントローラーには、これを実行できるPWMジェネレーターが組み込まれています。クロックサイクルで期間とオン時間を設定すると、ハードウェアが残りを行います。これを新しい周波数に変更するには、新しい周期を周期レジスタに書き込み、周期の半分をデューティサイクルレジスタに書き込みます。

リアルタイムクロックは、プロセッサの他の負荷のために時間を失うので、非常に不十分に書かれていない限り、そのようには機能しません。一般に、ハードウェアは数秒の周期的な割り込みを作成するために使用され、ファームウェアはそこからさらに分割されます。割り込みは必要なときにいつでも実行されるため、これはプロセッサのビジー状態に関係なく機能します。割り込みルーチンが全体のサイクルのごく一部を占める限り、ほとんどのプロセッサは依然としてフォアグラウンドタスクに適用されます。

やや未知の間隔でポーリングすることによって時間を保つ方法もあります。ハードウェアにカウントを維持させ、クロックの更新に取り掛かるたびに、経過したティックの総数に基づいて更新します。このルーチンが十分に頻繁に実行される限り、使用されるカウンタが実行と実行の間に折り返さない限り、時間のロスはありません。


ごめんなさい!私の質問はもっと広範にすべきだった。方形波は、私が考えていたタイムクリティカルなアプリケーションの特定の例にすぎません。あなたが言及したPWMジェネレーターメソッドでは、方形波遷移ごとに周波数を更新することができますか(必要な場合)。2つの非同期方形波に対してこれを行う必要がある場合はどうなりますか?10は?そういうものに一般的なデザインのアプローチはあるのかなと思います。クロックを更新するための定期的な割り込みとポーリングについて述べている方法は、確かにいくつかの光を放っています。
midnightBlue

1
@mid:ほとんどのマイクロは、PWM周期の開始時に中断できます。一部にはダブルバッファレジスタがあり、ある期間中にパラメータを更新し、次の期間の開始時にそれらを有効にすることができます。一部のマイクロは、DMAを介してPWMに給電できます。これを一度使用して、ハードウェアにディザリングを自動的に行わせました。
Olin Lathrop

3

ここのキーワードは「ハードウェアサポート」です。深刻な場合は、µCのサポートハードウェアが必要になります。最も一般的な統合ペリフェラルは、他のCPU動作からの干渉なしに比較的正確に実行されるタイマー回路です。

その上に構築すると、コントローラーのクロックソースと同じくらい正確な中期タイミングで実行する多くの機能を持つことができます。

ただし、すでに経験したように、中長期的な精度に加えて、ハードウェアイベントのソフトウェア処理(タイマーオーバーフローなどを含む)には常にタイミングジッタが伴います。これは、イベントが発生したときに実行状態が異なる可能性があり、その結果、イベントへの実際の応答が発生するまでさまざまな遅延が発生します。

したがって、結論は次のとおりです。高速またはゼロに近いジッター要件を持つものには、ハードウェアサポートが不可欠です。ほとんどのµCには、UART&cなどの多くのハードウェアペリフェラルが含まれており、µCが強力でコストが高いほど、サポートするハードウェアが通常組み込まれています。µCが必要なハードウェアを提供していない場合は、実際に、タスク専用の外部ハードウェアを検討する必要があります。


ジッタを理解することが重要です。複数のハードウェアタイマーを使用でき、それらはすべて独立して追跡しますが、それらがすべて同時に割り込みを発火した場合、それらすべてを一度に処理できるわけではありません。
pjc50 2016年

2

特に非常にタイムクリティカルな機能については、ハードウェアを最大限に活用してください。すべてのマイクロコントローラーには、イベントのカウントと時間測定のために特別に作成されたタイマー/カウンターがあります。

それはさておき、これは本当に非常に幅広い質問です。だから良い答えはありません。

唯一の本当の答えは経験です。試してみて、プロファイリングして、強調して、修正してください。使用率の高いコードの領域を特定する必要があります。ソフトウェアの20%は90%の時間で実行されます。つまり、すべての命令が削除され、パフォーマンスが向上します。

優れた設計では、ハードウェア、ソフトウェア、メモリのバランスが常に取れています。これはすべてのマイクロプロセッサ、特にマイクロコントローラに当てはまります。1つを最大にするか、1つを非効率的に使用すると、製品の品質が低下します。シリコン密度が増加するにつれて、ますます多くの機能がマイクロコントローラーのハードウェアに含まれています。しかし、より多くの機能はより多くの期待を意味します。オンボードメモリを2倍にすると、それを使用する機能が追加されます。

すべてのISRにはオーバーヘッドがあり、これはISRが使用するレジスタに依存します。非常にタイムクリティカルな機能のISRを処理する場合と比較して、マシンの状態を保存するためのレイテンシが大きい場合、設計はスケーラブルではない可能性があります。したがって、ハードウェアを使用するための回答の一般的なコンセンサス。

ソフトウェア割り込みを使用すると、ISRマシン状態の膨張を減らすことができます。

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    call Inc_Seconds()

Inc_Seconds()のすべてのレジスタは、150サイクルごとに1回だけ使用される場合、プッシュする必要があります。

// Timer0 ISR
Temp = Temp + 1
if (Temp == 150)
    _Software_Interrupt
...
// Software_Interrupt ISR
    call Inc_Seconds()

これで、レイテンシヒットは150サイクルに1回だけ発生します。

hh:mm:ssでリアルタイムクロックを実装する場合、50msオフであるかどうかは重要です。だれもエラーを検出しません。これは確かにリアルタイムの運用上の問題ではありません。

同時に発生しなければならないイベントについても。彼らが必要ですか?それらが必要な場合は、ハードウェア設計で処理する必要があります。それ以外の場合は、一部のソフトウェアの侵害が発生する必要があります。一度に2ビットを設定できない場合は、1ビットを設定します。次の命令は他を設定します。RISCプロセッサで1クロックサイクルの精度。私はそれで十分だと主張します。


0

方形波の場合、サイクルするタイミングを知るために、ある種のカウンターを使用してXTALでPLL化されたPWMペリフェラルを使用する必要があります(少数を設定するため)。すべてのデータシートには、これを行う方法が記載されています:)

時間を保つために、はい、アセンブラーに行ってオペコードを作成しない限り、RTCで正確に実行する必要があります。これにより、実行パス内の各命令の正確な実行タイミングを手動で確認できます。それはまた、試みられた真の「後藤は有害であると考えられる」という陳述に新たな光を当てるでしょう。


3
ソフトウェアRTCに関するコメントは、最も不注意に実装されたソリューションにのみ適用されます。これを行うための健全で信頼できる方法は、ハードウェアタイマーを使用して、1ミリ秒(または10ミリ秒)ごとに割り込みを生成することです。サービスルーチンには、最大1000(または100)までの割り込み数をカウントする静的カウンター変数があります。完全なカウントが達成されたら、カウンターをリセットしてから秒カウンターを増やします。60秒ごとに、秒カウンター変数をゼロにリセットし、分カウンター変数を増分します。必要に応じて、これを数か月から数年に延長してください。
Michael Karas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.