TOPへ戻る

20070708 AVR用RTOS ATROSを使ってLEDの点滅実験

AVRでRTOS(リアルタイムOS)を試してみたく色々探してみたところ、mkmacさんのATROSを見つけまして
試行錯誤しLEDを点滅させるプログラムができました。

※元はPICROS(PIC用簡易リアルタイムOS)からの移植とのことです。

ATROSを実装するにいたり、少々PICROSの構造を理解する必要がありました。
PICROSは2種類あって、こちらのC言語で書かれた物です。

ATROSの構成

ソースファイル

機能

備考

atros.c ATROS本体 .
usrconf.h コンフィギュレーションファイル .
tdt.h タスクディスパッチテーブル .
tasklink.h タスクリンクファイル .
usrini.c ユーザー初期化関数 .
基本的には、この5つのファイルで構成されています。

◆atros.c
 ATROS Ver1.10 を基にしています。
 最初ATROSの部分だけ抜き出して、コンパイルしたところ、ワーニング・エラーが発生したので、
 以下の点を修正しました。

 1)WinAVR-20050214 以降から、sbi(),cbi()等のマクロが使えなくなってしまったので、
   usrconf.hに、#include を追加。

 2)mkmacさんは、ATmega163を使われていましたので、ATmega168 用にレジスタを変更。
   atros.cに、#if defined (__AVR_ATmega163__)、#elif defined (__AVR_ATmega168__)を追記し
   makefile の MCU の設定で切り替えられるようにしました。
   違いは、TIMSK -> TIMSK0、 TCCR0 -> TCCR0B でした。

 3)動作クロックの変更。8MHz -> 20MHz
   usrconf.h #define XTAL 20000000 // crystal frequency - 20MHz

 4)makefile には、
   # Target file name (without extension).
   TARGET = atros
   のみの指定で
   # List C source files here. (C dependencies are automatically generated.)
   SRC = $(TARGET).c
   ここに、アレコレ入れなくても良いつくりになっています。
   ユーザーのソースは #include で結合されます。


LED点滅プログラム

このサンプルプログラムのダウンロード
led_tsk.c
void led_tsk(void)
{
	PORTB = ~PORTB;

	Wait_Timer( 50 );	// 50x10ms で、LED点滅
	return;
}
PORTBのB0にLEDを取り付けてあります。
Wait_Timer(50)で、500ms周期で led_tsk が呼び出されます。

userini.c には、PORTBの初期設定、Initilal Start Task で、task1 を指定しています。
userconf.h には、#define task_number 1 1つのタスクしかありませんから。
// Task Prototyping
void led_tsk(void);
tdt.h には、dispatch(1,led_tsk()) led_tskのディスパッチを設定。


動作確認

コンパイラは、WinAVR-20070525 を使用しました。
ターゲットCPUは、ATmega168 20MHz です。

特に画像や動画はありませんが(^_^; LEDが500ms消灯、500ms点灯を繰り返します。

TOPへ戻る