应用篇-在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がSConscript
SConsビルドツールによって管理されていることを説明する必要があります。したがって、このように追加すると、.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を使用して浮動小数点数を印刷しますが、最後に浮動小数点数を印刷します= =!残念ながら満足のいく方法を開発していませんが、印刷のほとんどはテスト用であり、通常のプロジェクトを実行する場合は印刷する必要はありません。
私はこのテストがそれほどイライラすることを期待していませんでした、少し疲れました= =!また、友達がサポートしてくれて、もっとアドバイスしてくれることを願っています!
さて、この記事は以上です、ありがとう!