* FreeRTOS for AVR Small demo / Mega Pack v03
デモ Ver0.3 (v03)(2012-04) by audin
*はじめに
*コンパイル可能AVR
*ハードウエア
*デモ動作/3つのタスク
*インストール
*Flash書込みと動作方法
*Cコンパイラとコンパイル
*ファイル構成
*Makefile
*注意事項
*memo
*変更履歴
*参考リンク
*はじめに
マルチタスクOSのFreeRTOSを秋月電子などで入手可能なメジャーなmega系に移植して
簡単なデモ動作をさせてみました。
内容はLEDチカチカと簡単なUART送受信(対PC)のみですが、
その分シンプルでわかり易いと思います。
コンパイルやFlash書込み等、開発環境の初期操作確認に使えると思います。
FreeRTOSはプリエンプティブ型のRTOSです。
OS部分は最小で数kバイトと非常に小さいです。
ベースにしたのは標準デモの「ATMega323」用ですがこれを元に簡略化し、
多数のMega系MCUで動作するように意図しています。
FreeRTOS Ver.7.1.0を同梱してあるのですぐにコンパイル可能です。
WindowsXP上でコンパイル確認しました。
*コンパイル可能AVR
MCU type
atmega8,atmega16, atmega88,atmega88p
atmega128,atmega162, atmega168,atmega168p
atmega323,atmega324p, atmega325,atmega328p,atmega329
atmega644,atmega644p, atmega645,atmega649
atmega1284p
コンパイルできればデモは動作すると思いますが、動かない場合は適当に
修正してください。
atmega328p以上(SRAM 2Kバイト以上)を使うことを強く推奨します。
*ハードウエア
今回からArduinoボード上の「ATMega328p」で動作確認しました。
Arduino基板上のLEDが点滅するだけなので、他の配線は必要ありません。
デフォルト設定
ボード : 秋月 AE-ATmega (Arduino Duemilanove 互換)
CPU : atmega328p
CPUクロック : 16MHz
UARTポート0 : 38400bps,none,1stop。 Arduinoのダウロード用 RX/TX端子
タスク・ディスパッチ周期 : 1msec
*デモ動作/3つのタスク
マルチタスクなので、
1.LEDチカチカさせつつ
2.PCにUART経由で文字列を表示させつつ
3.入力された数字に応じてLEDチカチカ速度を変更。
という3つのタスクを動作させます。
例えばLED点滅タスクは
/*******************
* LED 点滅タスク
*******************/
void vLed_tsk( void *pvParameters )
{
static char ledFlag = 0;
( void ) pvParameters; // not used
vLed_init(); // LEDポート初期化
while(1){ // 無限ループ
( ledFlag ^= 1 ) ? vLedDrv_LedOn() : vLedDrv_LedOff();
vTaskDelay( MSEC(100) ); // 100msec毎に呼ばれる
}
}
と無限ループの形で書けます。
今回から擬似的なPWM信号を生成してLEDの明るさに変化を付けています。
*インストール
FreeRTOSのソースコードは以下から入手可能ですが
FreeRTOS v7.1.0 コアを同梱済みなのでダウンロードの必要ありません。
http://sourceforge.net/projects/freertos/files/FreeRTOS/
*Cコンパイラとコンパイル
Cコンパイラは無料で使えるWinAVRです。
WinAVRは、Arduino 1.0に付属の
gcc version 4.3.2 (WinAVR 20081205)を使いました。
また、現在の最新版、
gcc version 5.7.1 20120322 (prerelease) (GCC)
も使用可能でした。
コンパイルに必要なmakeや関連ツールは設定済みとします。
コンパイル方法i:
コマンドプロンプトを「demo/AVR_ATMega_WinAVR/LED_Blink」フォルダにして
「make」と打つだけです。(m.batでも良い)
avr-size led_blink_atmega328p.elf
text data bss dec hex filename
6084 62 783 6929 1b11 led_blink_atmega328p.elf
コンパイルが成功すればだいたい上のような表示になります。
コードサイズが6kバイトくらいなのはprintf()関数を使用しているためで
printf()を使わなければサイズは3kバイトくらいです。
*Flash書込みと動作方法
AVRライタで書き込む:
一般的には、Flash書込みはAVRライタで「*.hex」ファイルを書込みます。
AVRライタなしで書き込む(Arduino):
Arduinoの場合は、AVRライタなしでHEXファイルを書き込むことが出来ます。
guidudeを使う:
GUIタイプののguidudeを使えば簡単に書き込むことが出来ます。以下を参照してください。
guidude: Arduinoに任意のHEXファイルを書き込む。 AVRライタ不要
コマンドラインから書き込む:
付属の「w.bat」、「acf.bat」内の変数を設定すればコマンドラインから書き込み可能です。
動作:
リセット後LEDチカチカすれば成功です。
次にPC上でターミナルソフトを起動します。
ボーレート : 38400bps 8ビット、ノンパリティ、1ストップビット
に設定、接続するとターミナル上で以下の表示を繰り返します
Welcome !
FreeRTOS V7.1.0 for AVR, UART Transfer test.
CPU may be ATmega328p or something.
UART speed is 38400 bps.
Now LED blink speed is 9.
Please input LED blink speed [1 - 9]
CPU名は固定値でATmega328pと表示されます。
文字はゆっくり流れるように表示されます。
1〜9の数字を入力するとLEDチカチカ速度が変わります。
「1」で最高速。
*ファイル構成
「taskフォルダとdrvフォルダ」のソースをざっと見れば
タスクの追加方法はだいたいつかめると思います。
通常はこの「taskフォルダとdrvフォルダ」に追加変更していきます。
タスクを増やしたいときはmain.cにxTaskCreate()文を追加します。
フォルダ構成:
demo/AVR_ATMega_WinAVR/LED_Blinkフォルダ: 詳細は以下
Sourceフォルダ: FreeRTOS v7.1.0のソースコードとAVR Mega用のportableファイル
LED_Blink
│ Makefile 全体をメイクする
│ FreeRTOSConfig.h FreeRTOSコンフィグファイル
│ w.bat FLASH書き込みバッチファイル
│ acf.bat Arduino用のFlash書き込みバッチファイル
│ w.batから呼び出される。
│ m.bat make用の短縮入力バッチファイル
│ mm.bat make clean ; make と同等
│ mc.bat make clean と同等
│ SConstruct SCons用 メイクファイル(参考)
│ armgcc.py 同上
│
├─build 依存関係ファイル(*.d)が生成される
│
├─cpu cpuに深く関わるファイルはここ
│ sio_intr.c
│ sio_intr.h
│ mega_regs.h mega系のレジスタ名の違いを吸収する
│
├─drv 各タスクのデバイス・ドライバ関係
│ led_drv.c
│ led_drv.h
│ sio_drv.c
│ sio_drv.h
│ time_def.h
│ platform.h
│
└─task 各実行タスクのファイル群と設定ファイル。
led_tsk.c LEDチカチカ・タスク
led_tsk.h
sio_tsk.c ターミナル表示、入力タスク
sio_tsk.h
main.c メイン関数
*Makefile
Cソースファイルを「task」「drv」「cpu」フォルダに追加・削除・移動しても
Makefileを変更する必要はありません。
例えば「spi_tsk.c」を「task」フォルダに、「spi_drv.c」を「drv」フォルダに追加しても
「Makefile」を変更する必要はなく「make」を実行するだけでコンパイルリンクされます。
一方、「OSのサービス関数」は最小限に絞っているため「Queue機能」を使用するときは
「Makefile」の中の「OS_SRC」変数に以下の様に追加します。
OS_SRC= \
$(RTOS_SOURCE_DIR)/queue.c \
$(RTOS_SOURCE_DIR)/list.c \
$(RTOS_SOURCE_DIR)/tasks.c \
$(PORT_DIR)/port.c \
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_1.c
*注意事項
デモ動作で使用しているサービス関数以外の動作は確認していません。
mega8/mega168などでも動作しますがSRAMが少なすぎて先がありません。
最低限mega328p、
可能ならmega644pやmega128などSRAMが多いものが安心だと思います。
この文書作成時点で「ATMega328pp」での動作を確認しました。
mega8/mega168での動作は未確認です。
*memo
*変更履歴:
Ver0.3 (V03): 2012/04, 2012/06
1,UARTの受信バッファ追加。
2,FreeRTOS v7.1.0のソースを同梱
3,ハードウエアはArduinoでチェック
Ver0.2 (V02): 2010/04/11
1,MakefileのつくりをARM系にあわせた。
2,フォルダ構造変更。
3,インストーラスクリプト追加。
4,その他。
Ver0.1 (V01): (2009-06-27)
初版
このファイルの作者: audin
http://avr.paslog.jp/article/1157172.html
*参考リンク
WinAVR
http://sourceforge.net/projects/winavr/files/
FreeRTOSの使い方(PIC32MX版)
http://www.picfun.com/RTOS/FreeRTOSframe.html
ATMEL AVR RTOS館
http://akiba.geocities.jp/atmel_avr_atros/