ライトステートマシンフレームSCM

マイクロコントローラの方法でベアメタルなる、方法は、古典的な検出キー判定として比較的良好な状態機械です。
実際には、あなたがこのアイデアを使用することができます多くの場所があります。このようなデータ収集センサーとして、常に多くの場合、CPUの使用率を向上させるために組み合わせFSM +タイマーのように、このような低効率などのマイクロコントローラの動作を、待っていないので、
FSMの方法で使用されるセンサ。
我々はすべて知っているように、DS18B20コレクションは少し長すぎる変換命令、720ms待つ最も遅い必要性、この時間を送った後、比較的遅いです。単純に立つことはできません。
次のように:私は11ビットの分解能を用い、解像度は、温度基準として、0.125に十分です。
0.5℃、0.25℃で、0.125°C、および0.0625°C、それぞれの増分に対応する、9、10、11、または12ビットに設定 - 温度センサの分解能は、ユーザです。
温度変換時間T CONV
9 - ビット分解能93.75ミリ秒0.5
- 10ビット分解能187.5 0.25
11 - ビット分解能375 0.125
12 - ビット分解能750 0.0625
さて私はなど、確かに死んでいないよ、と死んだ、と、より多くの無駄なCPUは、効率が実際の作業を受け入れることができない、低すぎます。
したがって、我々は、ステートマシンを作りました:

INTメイン(INTのargc、char型のconst * ARGV [])

{
    一方、(1)
    {
        ds18b20_discope();
    }
    0を返します。
}
空ds18b20_discope(無効)
{
    スイッチ(DS18B20グローバル変数のステートマシン)
    {
    場合は、コマンドを送信します。
        送信変換コマンド
        スタンバイ状態手段に割り当てられました
        ブレーク;
    ケースロードされた状態を待ちます。
        タイムアウトがあるかどうかを判断し、
        その後、タイムアウトがある場合:読み取りは、カウンタがクリアされ、バック状態にコマンドを送信しています
        そうでなければ、何もしません
            ブレーク;
    デフォルト:
        ブレーク;
    }
}
ベンチマークタイマ割り込みは、私が50ミリ秒中断しています、自分自身を絞り込むことができます
空HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
    DS18B20は、待機状態にあった場合は、
    そして、カウント数++
}
このようなアイデアの簡単なステートマシンセンサーサンプリングタイミングで、死なないように、高効率、かつ安定しました。
より厳しいDS18B20アイデアノートのタイミングは、温度をサンプリングすることはかなり安定しているが、それはベアメタル、ステートマシンであるので、フォローアッププログラムを考慮すると、比較的大きい、インターネットが中断され、それ以降のfreertosに移植も可能であるしてはならないと述べました基本的には解決しました。

 

おすすめ

転載: www.cnblogs.com/CodeWorkerLiMing/p/12501934.html