0

私は MCU に取り組んでおり、私の目的は MCU に時刻/日付を実装することです。

秒単位で刻むタイマーを使用し、uint32_t count136 年を保存するのに十分なサイズのタイマーを保存します。2000 を参考にしたいのですが、最大値は 2099 にする必要があります。

ここに私のデータ構造があります:

typedef struct
{
uint8_t sec;        // Seconds. [0-60] (1 leap second) 
uint8_t min;        // Minutes. [0-59] 
uint8_t hour;       // Hours.   [0-23] 
uint8_t day;        // Day.     [1-31] 
uint8_t month;      // Month.   [0-11] 
uint8_t year;       // Year - from 2000.  [00-99] 
} osal_time_t;

uint32_t count秒 ( ) を分/時/日/月/年に正しく変換し、最も低いリソースを使用する最善の方法は何ですか?

時間、時間、年は単純に見えますが、1 日は 28-29-30-31 日と複雑になり、2 月は 4 年ごとに 29 日です。

Linux のソース コードの実装が表示されますが、これは OS として設計されたものであり、質素な MCU ではありません。

MCU で最小値が必要になるように、MCU でどのようなアルゴリズムを使用すればよいか、誰でもヒントを得ることができますか? 資力?

例として、これを計算するためにどのアルゴリズムが使用されているかhttp://www.mathcats.com/explore/elapsedtime.html

コード スニペットがあれば、共有していただければ幸いです。

4

2 に答える 2

1

マイクロコントローラだけではこれを確実に行うことはできないため、これはプログラミングの問題ではありません。内部 RC オシレータは不正確すぎるため、高精度の外部水晶オシレータを使用したとしても、時間の経過とともにドリフトし、温度によって変化する可能性があります。

唯一の正しい解決策は、リアルタイム クロック回路をハードウェアに追加することです。できればバックアップ バッテリも一緒に追加してください。リアルタイム クロック回路との通信方法は、ハードウェア固有です。

https://electronics.stackexchange.com/でハードウェアとの境界にあるような質問をすることをお勧めします。

于 2016-03-31T14:24:57.867 に答える
1

あなたはただ計算をしなければなりません、それを回避する他の方法はありません。基数 2 から基数 10 に変換しています (基数 60 は基数 10 で表されます)。

同様に、月日のものについても、月ごとの日のテーブルを作成し、うるう年に対処する必要があります。

計算を行う代わりに、より多くのメモリを使用してより少ない計算で、カウント方法を変更することです。基本的にBCDアプローチ。1 秒が 9 から 10 になったら、10 秒ずつ増やして 1 秒を 0 に設定します。日付まで繰り返します。または、途中で59秒を超えてゼロにロールし、分を増やします...次に、10を基数にして、秒の10と10を分離します。分割がない場合は、そのためにテーブルを使用できます。

于 2016-03-31T14:01:40.920 に答える