LEDチカチカ(RTOS)

RTOS

RTOSとはなんぞやというのは、なかなか説明が難しいものではあるのですが、基本的には複数のタスクで動作し、タスク間でのリソースを共有出来る仕組みを持ったOSといったところでしょうか。
Wikipediaや、このあたりが参考になるでしょうか。

書籍では、リアルタイムOSと組み込み技術の基礎がとても詳しく解説されていると思いますので、オススメです。
μITRONなんかは、非常に有名ですね。

今回使用するFreeRTOSは、サイズが小さくシンプルで、色々なマイコンに対応しているので、覚えておくと移植も楽なのではないかと思います。

FreeRTOSのリファレンスマニュアルやチュートリアルは、公式サイトで有償で販売されています。
が、APIリファレンスくらいであれば、公式サイトの左側のメニューから、FreeRTOS->API Referenceで見ることができますので、まずはこれで感じを掴んでから、さらに深く知りたい場合には購入してみてもいいかもしれません。

私はまだ買ってませんけどw

構成

構成は、LEDチカチカ(RTOS)の方と変わりません。
基板上のLEDを、FreeRTOSを使用して点滅させます。

プロジェクト

まずは、新規プロジェクトを作りますが、前回とは選ぶプロジェクトが違います。
QuickStartPanelのNew projectから、LPC176Xの「FreeRTOS Project」を選択して、適当なプロジェクト名をつけます。
ここでは、「ledtest02」としました。

MCUはLPC1769を選び、途中Advanced OptionでFreeRTOSのrootを選べますが、とりあえずはこのままで。
すると、以下の様な構成で、プロジェクトが出来上がります。

プロジェクト構成

FreeRTOS_なんとかというフォルダは、FreeRTOS用のファイルであり、ここは自分でいじることはありません。
自分でいじるのは、srcフォルダにある、cr_startup_lpc17.c、main.cと、FreeRTOSConfig.hになります。

ざっと、デフォルトで作られたmain.cを見てみると、2つのタスクが作られて、vUserTask1は一定時間ごとに状態を反転させ、vUserTask2は一定時間ごとにカウンタを増やしているのがわかります。
それぞれに関連性はないので協調して動くものではないですが、これらが見かけ上同時に、並行して動くんだなということは、なんとなくわかると思います。

main関数は、これらのタスクを生成して、スタートさせているだけです。
RTOSのイメージが、なんとなく掴めるでしょうか。

次にFreeRTOSConfig.hを見てみましょう。
この中身をいじることにより、FreeRTOSの機能をカスタマイズすることが可能です。

とりあえず直しておく必要があるのは、configCPU_CLOCK_HZです。
これは、CPUクロックを設定する必要があるので、ledtest01で使ったのと同じ、SystemCoreClockを設定しておきます。

#define configCPU_CLOCK_HZ			( ( unsigned long )SystemCoreClock )

ただし、実はこれではビルドが通りません。
SystemCoreClockというのは、元々CMSISライブラリのsystem_LPC17xx.cに定義されているものであり、CMSISライブラリのincフォルダにあるsystem_LPC17xx.hでexternされています。

このため、CMSISライブラリを参照する必要がありますが、ledtest01の時には、CMSIS Library to link project toを設定するところがあり、CMSISv2p00_LPC17XXを選択しましたが、今回はその指定がありませんでした。
FreeRTOSを選んだ時には、FreeRTOSのソースが組み入れられるだけで、デフォルトではCMSISライブラリを使えるようには出来ていないようです。

ledtest01の時と同じように、CMSISv2p00_LPC17xxと、DriverLibを使用してLEDの点滅をさせたいので、このプロジェクトに対して、これらを使えるように、設定を変更します。

ledtest02のプロジェクトを、右クリックからプロパティを開きます。
まず、「Project References」で、CMSISv2p00_LPC17xxと、DriverLibの両方にチェックを入れておきます。

プロジェクト参照

次に、「C/C++ General」の「Paths and Symbols」を開いて、includeとライブラリの設定をします。
IncludesタブのLanguagesがGNU Cのところを選択し、/CMSISv2p00_LPC17xx/incと、/DriverLib/incを追加します。

Includeパス設定

そして、Librariesタブに、CMSISv2p00_LPC17xxと、DriverLibを追加します。

ライブラリ設定

最後に、Library Pathsタブに、/CMSISv2p00_LPC17xx/Debugと、/DriverLib/Debugを追加します。

ライブラリパス設定

これでヘッダファイルを参照出来るようになったので、FreeRTOSConfig.hの先頭で、LPC17xx.hをincludeするようにしておきましょう。

#include "LPC17xx.h"

ビルドを行い、ledtest02.axfが出来上がればOKです。

ビルドは通りましたが、実はまだ、ledtest01とはプロジェクトの設定が違うところがあります。
プロジェクトのプロパティに、Symbolsというタブがあり、色々なシンボルとそれに対する値が定義されていると思います。
Show built-in valuesというチェックを外すと、このプロジェクトに定義されているもののみが表示されます。

ledtest01とledtest02の定義を比べてみましょう。

ledtest01のみledtest02のみ
__REDLIB____NEWLIB__
__USE_CMSIS
GCC_ARMCM3
PACK_STRUCT_END

まず、__REDLIB__と__NEWLIB__の定義ですが、これはどのCライブラリを使用するか、という選択になります。
CodeRedのサポートページに書いてある通り、NewLibは標準のライブラリ、RedLibはCodeRed社独自のライブラリということになります。
RedLibの特徴としては、C90準拠でサイズが小さいため、メモリの制約が厳しい時に有効ですが、C++プロジェクトでは使用できないということになるようです。

C++を使わない限りは、RedLibを使用するのがいいと思いますので、ここはledtest01にあわせて変えておきましょう。
使用ライブラリの切り替えは、QuickStartPanelのQuick Settingsから、Set library typeで、Redlib(none)を選びます。
すると、シンボル定義や、リンクするライブラリの切り替えを全部自動でやってくれます。
nohostやSemihostについては、デバッグ用だったりするので、とりあえずここでは選びません。

ライブラリ選択

次にledtest01のみで定義されていた__USE_CMSISですが、これは文字通り、CMSISライブラリを使うためのものです。
この定義があると、cr_startup_lpc17.cの中で、CMSISライブラリのSystemInitという初期化関数を呼び、主にクロック関係の初期化をしてくれます。
やっておいた方がいいと思うので、ledtest02にもこの定義を追加しておきましょう。
SymbolsタブでAddボタンを押し、以下のように入れておきます。

定義追加

ledtest02で定義されているGCC_ARMCM3は、FreeRTOSが適切な設定をincludeするために使用していますので、これはこのままにしておきます。
もう一つのPACK_STRUCT_ENDですが、これは現状、どこでも使用されていません。
ただ、FreeRTOSのサンプルプログラムで、構造体定義のパディングをなくすために使用しているようです。
現状あってもなくても影響はないはずですが、とりあえずはそのままにしておきます。

FreeRTOSConfig.hの他の設定については、今のところはいじりません。

基本的なプロジェクトの設定はこんなところかと思いますが、最後にledtest01とledtest02のcr_startup_lpc17.cの違いを見ておきましょう。
内容としては、ledtest01の方が新しいようなのですが、ledtest02では、FreeRTOS用に書き換えられている箇所があります。
以下の3関数が、g_pfnVectorsという割り込み関数テーブルの中に「The SysTick handler」、「The PendSV handler」、「SVCall handler」として設定されています。

extern void xPortSysTickHandler(void);
extern void xPortPendSVHandler(void);
extern void vPortSVCHandler( void );

これは、FreeRTOSがタスクスケジューリングをするために使うものなので、これらの割り込みは、自前では使うことができません。
SysTick handlerはledtest01で使用しましたが、FreeRTOSで使用するので、同じような時間管理はできません。
ただし、FreeRTOSにタスクを一定時間休止するような機能や、タイマーが用意されていますので、そちらを使うことになります。

ソースコード


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS