xilkernelからの移行
- freeRTOSの設定(Configuration for OS)
基本的にデフォルトでOK
以下、必要に応じて触る個所
- kernel_behavior -> max_task_name_len
長いタスク名が必要な場合は調整する
- kernel_behavior -> total_heap_size
Free-RTOSが使うRAMの総量
各タスクのスタックの合計より大きくすること
- リンカスクリプトの設定
- スタックはmain関数しか使わないので最低限で良い(はず)
- ヒープは各タスクのスタックに割り当てられる(はず)
total_heap_sizeより大きくする必要がある(はず)
- ヘッダー
基本的に<*.h>はほとんど不要(<pthread.h>とか<sys/*.h>系とか)
もちろん一部必要に応じてinclude(<stdio.h>とか)
FreeRTOSとしては
#include “FreeRTOS.h”
#include “task.h”
#include “queue.h” ←必要なら
#include “timers.h” ←必要なら
- デバッグモニタ機能について
main関数の先頭の方でvUARTCommandConsoleStart()を実行することによってタスク(prvUARTCommandConsoleTask)の生成を行っている
このタスクの初期化処理として
- NTシェルの初期化
- UARTの初期化
- 受信キューの生成
- UartLiteの初期化
- 割込みハンドラの設定
- 割込みの登録と有効化
- ウェルカムメッセージ出力
を行っている
タスク内ではNTシェルを実行している
必要なファイル
- UARTCommandConsole.c
- serial.c
- serial.h
- usrcmd.c
- usrcmd.h
※これは必須ではないので従来通りの処理でも構わない
- NT Shellのコンパイルについて
ディレクトリ”core”と”util”を含むディレクトリを”src”の下に置く(“NtShell”とする)
Vivado SDKのProject -> Properties -> C/C++ Build -> Setting -> Tool Setting -> MicroBlaze gcc compiler -> Directories で + を押し
上記の”core”と”util”を指定する
- 割込みの登録、有効化
以下の2点を変更
- register_int_handler()
↓
BaseType_t xStatus;
xStatus = xPortInstallInterruptHandler(); →引数の内容はそのまま
configASSERT( xStatus == pdPASS );
※configASSERTが不要ならxPortInstallInterruptHandler()にするだけでも良い
- enable_interrupt()
↓
vPortEnableInterrupt(); →引数の内容はそのまま
- タスクの生成
例:LEDTask
xTaskCreate( LEDTask, /* タスク(関数)名 */
“LED”, /* デバッグ時に表示されるタスク名 カーネルは使用しない */
configMINIMAL_STACK_SIZE*2, /* タスクのスタックサイズ */
NULL, /* NULL */
configMAX_PRIORITIES – 2, /* タスクの優先度 */
NULL ); /* ハンドル(xTaskHandle *) 使わない場合はNULL */
- タスク(関数)記述
void * 関数名( void *arg)
を
void 関数名( void *pvParameters)
と置き換える
return は不要
pvParametersは使わないので先頭で明示的に
(void)pvParameters
としておく
周期起動待ち、Sleepの場合は
sleep( 1000 );
を
vTaskDelay(pdMS_TO_TICKS( 1000 ));
と置き換える
yieldは
taskYIELD();
と記述する
タスクの起動
sem_post( &T_sem );
を
vTaskResume(THandle);
と置き換える
タスクの起動待ち
sem_wait( &T_sem );
を
vTaskSuspend(NULL);
と置き換える
- main()の初期化時等でまだvTaskStartScheduler()を実行する前にwaitの意味でvTaskDelay()を使うとハングアップする
→初期化処理もInitTskを生成しその中で行えば良い
その際InitTskは優先度を最大にし、処理が終わればvTaskDelete( NULL )で削除する
但し、優先度はconfigMAX_PRIORITIESを指定できないのでconfigMAX_PRIORITIES – 1とする
- リンカがgettimeofdayが見つからないというエラーを出す場合の対処法
Luaのライブラリ内で時間取得等を行っている箇所が原因(xilkernellのbspでは通るがFreeRTOSのbspでは参照先がない)
- loslib.c
#include <time.h>をコメントアウト
static int os_date (lua_State *L)をコメントアウト
static int os_time (lua_State *L)をコメントアウト
static const luaL_Reg syslib[] = {内の
{“date”, os_date},
{“difftime”, os_difftime},
{“time”, os_time},をコメントアウト
- lstate.c
//extern int time(int *timer);のコメントアウトを外す
#include <time.h>をコメントアウト
- ltablib.c
//extern int clock(void);のコメントアウトを外す
//extern int time(int *timer);のコメントアウトを外す
#include <time.h>をコメントアウト
- misc.c
//#include <time.h>と//char *setlocale( int cate, const char *locale ){
以外のコメントアウトを外す
- misc.h
#include <time.h>をコメントアウト
//#define CLOCKS_PER_SEC (1000)のコメントアウトを外す
//extern char *setlocale( int cate, const char *locale );以外の関数のexternを有効にする
- usecmd.c
ヒストリー機能、文字列編集機能、TABによる補完(一度発行したコマンドのみ)を利用するために使用
但し既存のコマンドを使うために完全流用はしない
本来はusrcmd_execute(const char *text)から
ntopt_parse(text, usrcmd_ntopt_callback, 0);
を呼んでいるがこれだとコマンドがスペースでぶつ切りにされ
- Luaコマンドが使えなくなる
- D[C/B/W/L]のスペースで区切らない引数が扱いにくい
等の弊害がある為
m_data = (char *)text;
でstatic グローバルのポインタにコピーし、以降は従来の処理を行う
コマンド内で入力を待つ処理r232_GetAnalysData( void )
は若干修正が必要だが、その他はほとんどそのまま使える
コメントを残す