RTスレッドアプリケーション-STM32L051でのRTスレッドの使用(3.ワイヤレス温度および湿度センサーのI2C通信)

应用篇-在STM32L051上使用RT-Thread 第三篇,学习RT-Thread Studio如何添加自定义的.c .h文件,
同时开始我们的程序移植和设计。

序文

前の2つの記事の準備ができたら、ようやくアプリケーションコードの記述を開始できます。独自のドライバーファイルを追加する前に、この記事では、RT-ThreadStudioが独自の.cファイルと.hファイルを追加する方法について説明します。

次に、これに基づいて、SHT21温度および湿度センサーのI2Cドライバー移植を完了します。

STM32L051C8リンクでのRT-Threadアプリケーションシリーズのブログ投稿の使用:
RT-Threadアプリケーション-STM32L051でのRT-Threadの使用(1.ワイヤレス温度および湿度センサーの新しいプロジェクト)
RT-Threadアプリケーション-STM32L051でのRT-Threadの使用(2. CubeMXワイヤレス温度および湿度センサーの構成)

1.RT-ThreadStudioはカスタム.c.hファイルを追加します

RT-ThreadStudioを使用してカスタム.c.hファイルを追加する方法はたくさんあります。この記事では、ブロガーの実際のテストに従ってそれらを説明します。

1.1既存のフォルダの下に追加

以下に示すように、プロジェクトの既存のフォルダーの真下を右クリックし、[新しいヘッダー]または[ソースファイル]を選択します。

ここに画像の説明を挿入

追加が完了すると、直接コンパイルできます。上記では、SrcとIncの下のcubemxフォルダーの下に2つのヘッダーファイルを追加しました。i2c.c直接コンパイルはそれに関連付けられます。
ここに画像の説明を挿入

しかし、ここでは、cubemxがSConscriptSConsビルドツールによって管理されていることを説明する必要があります。したがって、このように追加すると、.cファイルを自分で追加するたびに、SConscriptファイル。は無関係です。cファイルはビルドから除外されます。
ここに画像の説明を挿入

もちろん、以下に示すように、.chファイルが混在しているdriversフォルダーなど、他のフォルダーに追加することもできます。また、新しいフォルダーを直接作成することもできます。
ここに画像の説明を挿入

要約すると、プロジェクトのビルドシステム全体で、これらのファイルの下にある.chファイルの包含関係が既に処理されており、ヘッダーファイルのパスを追加する必要がないため、既存のフォルダーの下に追加する方が便利です。 。
ただし、この方法はプロジェクトの元のフレームワークに影響します。小さなプロジェクトのファイルが少ないかどうかは関係ありません。ファイルが多すぎると、非常に面倒になります。

1.2新しいフォルダを追加します

それでは、独自のドライバーを配置するための新しいフォルダーを作成する場合の対処方法について説明しましょう。

まず、右クリックして[新しいフォルダ]を選択し、フォルダを配置する場所を選択して、フォルダ名を入力します。
ここに画像の説明を挿入

新しいフォルダを作成すると、左側のリソースマネージャにフォルダがあることがわかります。上記のセクション1.1の内容からファイルを追加するか、フォルダが配置されているディレクトリを直接開いてコピーすることができます。以下に示すように、直接必要なファイル。
ここに画像の説明を挿入

新しいフォルダを作成してファイルをコピーし、操作を行わずに直接コンパイルすると、コンパイルに参加できます。
ここに画像の説明を挿入

ただし、他のフォルダに含めるファイルを準備するには、ヘッダーファイルパスを追加する必要があります。追加しないと、次のエラーが発生します。

ここに画像の説明を挿入

1.2.1パスを手動で追加する

以下に示すように、プロジェクトエクスプローラーインターフェイスを右クリックし、[ビルド構成]をクリックします。
ここに画像の説明を挿入

次に、次の図に示す手順に従って、新しいヘッダーファイルが配置されているフォルダーパスを追加します(keilツールと同じ)。
ここに画像の説明を挿入

1.2.1SConscriptスクリプトを使用して追加

SConscript以下に示すように、ドライバーを配置するフォルダーの下に新しいスクリプトを作成します。

ここに画像の説明を挿入
次に、追加する.chファイルを対応するフォルダーの下に置き、新しい更新プロジェクトを作成し、右クリックして[プロジェクトにscons構成を同期]を選択すると、スクリプトはコンパイルされたパスにファイルパスを自動的に追加します。

スクリプトの内容は次のとおりです。

from building import *

cwd     = GetCurrentDir()
src     = Glob('*.c') + Glob('*.S')

libpath = [cwd]
CPPPATH = [os.path.join(cwd)]
 
group = DefineGroup('mydrivers', src, depend = [''], CPPPATH = CPPPATH,LIBPATH = libpath)

Return('group')

2.I2Cドライバー移植

上記では、独自のドライバーファイルを追加すると、以前のドライバーファイルを直接移植することを説明しました。これは、SHT21のドライバーファイルが、以前のブログ投稿STM32L051およびnRF52832の列でSHT21のプログラムを説明しているためです(このアプリケーション)。最終的なソースコードがアップロードされます):

STM32L051テスト(3つ、I2Cプロトコルデバイスの追加テスト)

nRF52832学習記録(11、TWIバスアプリケーションSHT21プログラム移植)

ここでは、ベアメタルで使用されるファイルをRT-Threadで使用されるファイルに変更するだけです。

2.1移行手順

まず、すべてのドライバーファイルをコピーします(Datadef.hは、私が個人的に使用するデータ型マクロ定義です)。
ここに画像の説明を挿入

コンパイル後も、上記の遅延関数を除いて警告を通過します。
ここに画像の説明を挿入
これは、delay_us()この関数がHALライブラリで使用できないためです。ベアメタルを使用したときに自分で実装しました。ここでは、RT-Threadを使用しています。 RT-Thread Record(4、RT-Thread Clock Beat and Software Timer)」、RT-Threadにusdelay関数があることを紹介しました。それを試してみましょう。

すべてdelay_usをに変更しrt_hw_us_delay、ヘッダーファイルをインクルードすることを忘れないでください。次に
ここに画像の説明を挿入
、ファイルドライバーファイルのすべてを次のようにHAL_Delay変更します。rt_thread_mdelayたとえば
ここに画像の説明を挿入
、気分が良いです...次に、効果を見てみましょう。

2.2テストの使用

上記のドライバーを移植しました。直接テストしてみましょう。ここでも新しいスレッドを作成します。私の経験に基づいて、温度と湿度を読み取るスレッドを192バイトに設定し、3秒ごとに温度と湿度の印刷を読み取ります。

ここに画像の説明を挿入
プログラムは問題なく正常にコンパイルされますが、実行すると問題が発生します...

2.3非常に多くの質問==!

ボタンは変更されていません。前の記事のように予約されています
ここに画像の説明を挿入

7000バイト以上を使用しますが、それでもスペースがあるはずですが、プログラムの実行中にエラーが直接報告されます。

ここに画像の説明を挿入
昨日キースレッドをテストしたところ、全く問題ありませんでした。ここでエラーが発生しました。本日、shtスレッドを追加したと思い、温湿度読み取りスレッドのロジックを削除すると、別の問題が発生しました。 :

ここに画像の説明を挿入
それから、センサーを起動したばかりのときに、しばらく待ってセンサーを読み取ったのではないかと思いました。理由はありません。意味がありません= =!それから:
ここに画像の説明を挿入

この時、いきなり浮動小数点数の特殊性を思いついたのですが、以前RT-Threadを使って出会ったことを思い出し、インターネットをチェックしましたが、確かにrt_kprintf浮動小数点数は印刷できないので問題ですか?浮動小数点数の。

上に示したのはsht21スレッドスタックオーバーフローなので、スレッドスタックが足りないということです。実際、経験上は十分です。ここでは気にしないので、スレッドスタックを追加して確認します。結果は、次の図に示すようになります
ここに画像の説明を挿入
まだ問題があり、助けにはなりません。最初に浮動小数点数の問題に対処しましょう。

浮動小数点数を出力しないものを変更すると、結果は次のようになります。
ここに画像の説明を挿入
ここに画像の説明を挿入

そういう意味では、ドライバーの改造の問題かもしれませんが、最初に思いついたのはusディレイ機能でしたが、そのディレイ機能に問題があったので、ベアメタルでドライウェイト機能を使用しました。 。:

(これが理由ではないことが後で証明されます、us遅延機能が利用可能です)
ここに画像の説明を挿入

FreeRTOSには192バイト以上ありますが、経験は役に立ちません。
ここに画像の説明を挿入

しかし、ここでそれを使用すると、256バイトのサイズは私が増やし続けるまでうまくいきません:
ここに画像の説明を挿入

問題解決

結局、RT-Threadスレッドでこのドライバー関数に必要なスレッドスタックサイズはFreeRTOSのサイズよりも大きいことがわかりました。これは、スタックオーバーフローの問題によっては、さまざまなエラーレポートが発生するため、以前の経験に基づいているためです。最初は盲目的に考えないでください。スレッドスタックスペースを増やしてください。

考えてみると、ドライバの動作はすべてSTM32L051チップをベースにしています。この部分はそれほど変わらないはずです。もう一つの理由は印刷機能です。印刷機能は多くのメモリを消費することを前に述べました。スペース、rt_kprintfはRTです。-スレッドは単独で実装されますが、この印刷機能は多くのスペースを占めるためですか?これは現時点では単なる推測であり、後で勉強する機会があります!

戻ってRT-Threadのusdelay関数に戻ると、テストも成功します。

2.4RT-Threadnanoは浮動小数点数を出力します

1.rt_vsnprintf_fullパッケージセンターに浮動小数点数を印刷できるという名前のパッケージがありますが、使用しているnanoバージョンではパッケージをインストールできません...

RT-Thread_rt_kprintf()は浮動小数点数を出力します(解決策2:rt_vsnprintf_fullを追加します)

2.同じnanoバージョンは標準のlibcライブラリを使用できないため、vsnprintf置換rt_vsnprintf方法は使用できません。

RTスレッドrt_kprintf()関数でフォーマットされた出力浮動小数点数

3.標準Cライブラリ呼び出しをサポートするために他の変更が行われた場合、追加のRAMスペースが占有されます。

rt-thread printf印刷情報(浮動小数点浮動小数点の印刷を含む)

要約すると、私は周りを見回しました、まあ、敗北を認めます!印刷できない、再生できない、このテストはあまりスムーズではありません...

結局、印刷は後の段階で必要とされず、印刷はテストのためだけであるため、私はまだそれを簡単に処理するために土壌法を使用しています。
ここに画像の説明を挿入

3.RAMのサイズに常に注意を払ってください

この記事ではI2Cドライバーを追加しますが、上記の多くのテストと変更を行った後、温度と湿度のテストスレッドも384バイトを使用します。印刷されない場合は、はるかに小さいはずです。プロジェクトは後で確実に調整します。

それでも同じです。今日のテスト後に占有されたスペースと以前の占有スペースの比較チャートを見てみましょう。

ここに画像の説明を挿入

温度と湿度の読み取りスレッドを追加した後、プログラムが実行時に占有する必要のあるRAMのサイズ:7248バイト、チップRAM:8192バイト。

エピローグ

この記事では、RT-ThreadStudioでカスタム.c.hファイルを追加する方法を学び、I2Cドライバーを正常に移植しました。

単純な移植ですが、長い間基本的な問題に悩まされてきました。繰り返しになりますが、スレッドで印刷機能を使用することは、RAMスペースを大量に消費する動作です。以前は、この問題を使用するときに知っていました。オペレーティングシステム。

rt_kprintfこのテストでは、RT-Thread独自の関数を使用printfするを使用することになると推測します(エラーを指摘してください)。これもわずかなメリットです。

次に、RT-Thread nanoを使用して浮動小数点数を印刷しますが、最後に浮動小数点数を印刷します= =!残念ながら満足のいく方法を開発していませんが、印刷のほとんどはテスト用であり、通常のプロジェクトを実行する場合は印刷する必要はありません。

私はこのテストがそれほどイライラすることを期待していませんでした、少し疲れました= =!また、友達がサポートしてくれて、もっとアドバイスしてくれることを願っています!

さて、この記事は以上です、ありがとう!

おすすめ

転載: blog.csdn.net/weixin_42328389/article/details/124400088