freeRTOS

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)の生成を行っている

        このタスクの初期化処理として

  1. NTシェルの初期化
  2. UARTの初期化
    1. 受信キューの生成
    2. UartLiteの初期化
    3. 割込みハンドラの設定
    4. 割込みの登録と有効化
  3. ウェルカムメッセージ出力

    を行っている

タスク内では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点を変更

  1. register_int_handler()

        ↓

        BaseType_t xStatus;

        xStatus = xPortInstallInterruptHandler(); →引数の内容はそのまま

        configASSERT( xStatus == pdPASS );

        ※configASSERTが不要ならxPortInstallInterruptHandler()にするだけでも良い

  1. 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 )

        は若干修正が必要だが、その他はほとんどそのまま使える


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です