Linux用C ++のFreeRTOS + STM32F4

良い一日 前回AVRをプログラミングしてからかなりの時間が経ったので、間違いなく興味深く魅力的な開発分野-マイクロコントローラの開発-をメモリに復元することにしました。 プラットフォームとしてARM STM32が選択されました。そして、ささいなことをしないために、すぐにCortex-M4が選択されました。 STM32F407を搭載したSTM32F4DISCOVERYデバッグボード。 メガバイトのフラッシュと128 kbのメモリにより、リソースの節約とC ++での書き込みに煩わされることがなくなります。



だから、タスク:FreeRTOSでSTM32の下でLEDをゼロから点滅させることを学ぶが、これは純粋なCではなくC ++で行うのが流行です。



すでにEclipseを使用していること、アドオンを追加する方法を知っていること、Linuxがどのように機能するかを一般的な用語で知っていることが理解されています。



インターネットで多数のマニュアル、ハウトシェク、その他の情報を読んだ後、私はすべてを入れました...何も機能せず、機能せず、コンパイルもしませんでしたし、コンパイルした場合は鉄片で始まりませんでした。 結局、すべて同じで、すべてがうまくいきました。そして、私はレーキファンではないので、この投稿を書くことにしました。



ツールチェーン



開発環境のインストールとセットアップには2日かかりました。 したがって、実際に機能するセットを提供し、遭遇した問題を詳細に説明します。

-Eclipse Kepler (C / C ++の場合)

-GCC

-テキサン/ stlink



問題はarm-none-eabiのGCCにありました。 ツールチェーンには多くのオプションがあり、2つ試してみましたが、実際には両方とも機能しました。 ただし、2つの間にはまだわずかな違いがあります。

-GNU Arm toochain はここにあります

-Mentor Graphics CodeSourcery EABIはここから入手でき、データの入力を求められ、ダウンロードリンクをメールに送信します..



ところで、最初に彼らのLinuxディストリビューションからarm-linux-gnueabiをインストールしました。 それだけの価値はありませんが、私たちの目的では機能しませんが、LinuxがARMにインストールされている場合は、そうです。



そのため、コンパイラは好きな場所に配置しますが、ユーザーのPATHには必ずコンパイラへのパスを記述してください。 これを行う方法は、使用しているOSによって異なります。 このツールチェーンのペアを/ optに投げ、シンボリックリンク/ opt / arm-toolchainを作成しました-デフォルトのように。



プログラマー



次に、Githubを使用して便利な方法でstlinkをクローンします。 いつものように行く:



# git clone github.com/texane/stlink





# cd stlink





# ./automake





# ./configure --prefix=/usr/bin







libusb-devを忘れないでください。DebianWheezyにはインストールしていません。 それでも十分なライブラリがない場合は、システムで行われているとおりに配置してください。



開発環境



次に、私にとって最も興味深いのは、開発用のクリップを設定することです。 すべてがコンパイルされて純粋なEclipseで動作するように、プロジェクトをセットアップできませんでした。 したがって、便利なプラグインを配置できます。 ただし、設定をある程度明確にした後は、プラグインを使用せずに、より深く掘り下げて自分用にプロジェクトをカスタマイズできます。



ARMの開発には十分な数のプラグインがありますが、ここにいくつかあります。

-GNU Arm Eclipse はここから入手できます

-Zylin CDT- こちら



両方に更新サイトがあり、プラグインはメニューからのクリップの標準的な方法でインストールされます。 両方入れます。



次に、EclipseでC ++プロジェクトを作成し、ARM(ARM Cross GCCツールチェーン)の下にあるものを選択し、選択したコンパイラーCodeSourceryまたはARM GCCに応じてツールチェーンのタイプを選択します。 一般に、プラグインはあらゆる種類の異なるコンパイラのセットをサポートしています-あなたはそれらをいじることができます。











1つの問題があります-CodeSourceryでlibnosys.aが見つかりませんでした。 GNU Arm GCCから取得する必要がありました。 一般的に、飛行は正常です。







結論



次に、プラグインが解決する問題について少し説明します。 自分でプロジェクトをカスタマイズし、初心者の場合は、これに直面する必要があります。 私にとって、これはすべて発見でした。 ファームウェアを書いたことがありません。



-コントローラーにlibcがありません。 ファームウェアは静的に構築されます。

-そして、オペレーティングシステムはありません(プロジェクトに組み込まれます)、ローダーはありません-プログラムはスイッチを入れるとすぐに起動します。



このプラグインは多くの問題を解決します-作成したプロジェクトで必要なCMSISと標準の周辺機器をすぐに提供します。 これらのライブラリは、コントローラー周辺機器を操作するために必要です。



もちろん、メーカーが提供するライブラリの代わりにlibopencm3をねじ込むこともできますが、これは別の記事のトピックです。



Ppaginは、リンカースクリプトのセットも提供します。 正直なところ、私は彼らに初めて出会いました。 リンカスクリプトは、バイナリファイルの構造、セクション、エントリポイントなどを記述します。 このすべてを手作業で断片的に収集するのは面倒で面白くありませんが、プロジェクトは鉄の断片でさえ開始されていませんが、それから-どのような研究の余地がありますか。



プラグインは、プロジェクトのプロパティから設定されます。実際、設定を保存するプロジェクト内で設定されます。



デバッガーを構成する



一般に、この部分は最後に行うことができますが、デバッグが機能したという事実は、すべてが構成されているという兆候です。 したがって、事前にこれを行います。



当然、GDBはデバッガーとして使用されます。 GDBサーバーアプリケーションを構成しましょう。これは、texane / stlinkのユーティリティになります。



外部ツールに移動し、ツールを追加します。 デバッグが必要な場合は、ボードを接続した状態で毎回起動する必要があります。 ユーティリティはデバッグイメージをフラッディングし、サーバーとして機能します。 -mスイッチは、デバッガーへの接続が中断されるたびに脱落しないように指示するだけです。これは、私の意見では非常に便利です。







次に、デバッグターゲットを作成します。 ここではすべてが簡単です。ツールチェーンからデバッガーを取得し、ポート4242を指定します-これはデフォルトのGDBサーバーポートです。







デバッグサーバーを起動し、ターゲットに接続します。プロジェクトをアセンブルし、バイナリにハードウェアを入力して実行します。 デバッグできます。



FreeRTOS



プロジェクトを組み立てるのに必要なものはすべてプラグインによって提供されたので(ちなみに、LEDを備えたウィンカーテンプレートを作成しました)、それをまとめて鉄で埋めることができます。 LEDが点滅してすべてが機能する場合、OSの統合を開始します。



プラグインによって作成されたプロジェクトの構造には、CMSIS、StdPeriphなどがすでに存在するlibsディレクトリがあります。 これは、FreeRTOSをドロップする場所です。 さらに、OSが機能するには、設定する必要があります。 シャフトを使用してインターネット上でFreeRTOSをセットアップするためのマニュアル(公式のマニュアルを含む)があるため、ここでは説明しません。 要するに、次のことを行います。



1)FreeRTOSConfig.hを作成し、RTOSリーダーに配置します

2)ハードウェア用のポータブルポートを用意し、残りのRTOSソースと共にポートファイルを配置します。

3)ソースからRTOSメモリマネージャー(例:heap_2.c)を見つけて、そこに配置します。



ところで、RTOSの設定では、プロジェクトの作成時に指定したものと同じ実際のプロセッサクロックを指定する必要があります。 1億6800万です。



 #define configCPU_CLOCK_HZ ( ( unsigned long ) 168000000 ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 )
      
      







そしてこれも追加してください:



 #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
      
      







そして、vTaskDelayをオンにします。これを使用して、LEDの点滅を待機します。



 #define INCLUDE_vTaskDelay 1
      
      







プロジェクト設定でFreeRTOSへのパスを処方することを忘れないでください:







一般に、プロジェクトには多くの設定があり、そこからコンパイラ、アセンブラ、およびリンカのパラメータが形成されます。 いろいろ試して、何が起こるか見てみましょう;)



最小構成、これで収集を試みることができます。 何かを忘れると、単に組み立てられないか、機能しなくなります。



そして今、 ダンスアプリ!



アプリケーションをC ++で記述し、純粋なCからC ++に移行します。 私は長い間これらの言語で書いていないので、厳密に判断しないでください。



githubのプロジェクト。



タスク処理では、C ++への移行中に少し苦労したニュアンスが1つあります。



 void Application::attach(Task *task) { FNMETHOD impl = &Task::impl; pdTASK_CODE proc = ((pdTASK_CODE)(task->*impl)); xTaskCreate( proc, (signed char *) "test", configMINIMAL_STACK_SIZE, task, 2, (xTaskHandle *) 0); }
      
      







最初のパラメーターは、タスクが実装されているメソッドへのポインターです。 xTaskCreateの4番目のパラメーターは、Taskクラスのインスタンスへのポインターです。 インスタンスにポインターを渡す必要があります。そうしないと、実装メソッドはTaskクラスの変数(この場合はLEDピンと遅延)にアクセスできません。



さて、残りは簡単です。 良い一日を過ごし、ビルドを成功させてください。 質問歓迎!



PSそして、あなたはこれらの目的のためにどのLinux環境を使用しますか? ;)



PPSこの投稿はシステムプログラマーによって書かれたものではなく、ファームウェア開発の世界に参入したい「ハイレベル」な仲間を支援することを目的としていることを理解する必要があります。 したがって、アセンブラーの第一人者に怒らないようにお願いします^-^



All Articles