RTOS、IARツールを実行する組み込みシステム(ARM 9263)があります。システムは、現在の時刻を取得する標準のtime()関数をサポートしています。逆の呼び出しが必要です。つまり、時間を設定する必要があります。これを行うための「C」標準の方法はありますか?私はグーグルで調べましたが、それは明らかだと思いましたが、おそらくそれはプラットフォームに依存していますか?time()はそうではないので、理由はわかりません-何かアイデアはありますか?ありがとう!
4 に答える
IARツールセットを使用すると、時刻CランタイムAPI(time()
)は、の例を使用してオーバーライドできますARM\src\lib\time.c
。デフォルトのルーチンは常に-1を返します。これは、CRTが何時かわからないことを示します。time()
tartgetプラットフォームやRTOSに依存するソースから時刻を取得する独自の実装を提供したら、その時刻ソースを更新することで時刻を設定できます。IARはすでにRTOSに対してこれを行っている可能性があります-私はIARのPowerPacRTOSを使用していません。
これが別のRTOSまたはRTOSのないシステムでどのように機能するかについての詳細は、IAR C /C++開発ガイドに概説されています。
たとえば、私が取り組んだシステムでST Micro STM32マイクロコントローラーを使用している場合、リアルタイムクロック(RTC)は1秒に1回刻みに設定され、time()
ライブラリ関数はRTCの値を返すだけです。新しい日付/時刻の設定は、RTCに新しい値を設定することです。RTCのタイムカウンターはUnixエポック値(1970年1月1日からの秒数)で設定されます。これにより、残りのライブラリ関数が正常に機能するようになりtime.h
ます(32ビットオーバーフローが大混乱を引き起こし始める2035年頃まで)。
IAR DLIB Cランタイムライブラリのカレンダールーチンは、2035年12月31日までの日付をサポートします(内部計算では1900年1月1日のエポックが使用されるため、2038年より前にオーバーフローすると思われます)。Unicエポックを使用する場合、他のDLIBルーチンは多かれ少なかれ機能します-別のエポックを使用するためにどのレベルの努力が必要になるかはわかりません。
IAR ツールはターゲット固有のものではないため、ハードウェアの時間を設定する方法 (またはそれを読み取る方法) をライブラリ内に知っているものはなく、ボード サポート パッケージ (通常、ハードウェアを標準ライブラリにマップする) に依存します。そのことなど)。
すべてのターゲットに RTC があるわけではありません。IAR のツールは、多数の特定のマイクロコントローラと既製の開発ボードのサポートを提供しているため、既に完了していることに気付くかもしれません。調べる必要があります。
マイクロには内部 RTC がある場合も、外部に RTC がある場合もありますが、「ARM 9263」自体は RTC を定義していないため、より具体的にする必要があります。RTC は通常、ベンダー固有の周辺機器として追加されます。次に、部品のユーザー マニュアルを取得し、必要なレジスタを書き込む場合です。
C または C++ でこれを行う標準的な方法はありません。API については OS ベンダーに、何らかの拡張機能についてはコンパイラまたは標準ライブラリ ベンダーに目を向ける必要があります。