* 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/