カーネル起動パラメータの設定

アプリケーションが使用するタスクやセマフォなどのカーネル資源の数や属性などを 設定ファイル(kernel_cfg.c及びkernel_cfgh)に記述します。

資源を静的に生成する場合だけでなく、動的生成拡張カーネルを利用して動的生成 APIを利用する場合でも各資源について利用できる資源の最大数を記述する必要があります。

設定ファイルの編集

SOLID-IDEを使用してアプリケーションの新規作成を行うとアプリケーションのスケルトンコードの他に以下の二つのファイルがアプリケーションと同じフォルダに生成されます。以下のファイルを編集し、ビルドすることでカーネル資源の設定を行います。

kernel_cfg.c

カーネルが起動時に生成する各資源の数や属性等のパラメータを記述したテーブルが定義され、ビルド時にアプリケーションと 同時にびるどされ、カーネルとリンクされます。

kernel_cfg.h

各資源のID(数値)をC言語の定数(define)として定義します。kernel_cfg.cからincludeされるのでIDの他にアプリケーションと

  kernel_cfg.cとの間で共有する定義を記述する目的にも使えます。

(カーネルでは各資源のIDは整数でしか扱われないので個々のIDを表す定数の定義は必須ではありません)

注釈

タスクやセマフォなどのIDで管理される資源静的に生成されるものについてはここに記述されている初期化ブロックの配列内の順序でIDが決定します。(最初の要素がID=1となり, 並びの順にIDが割り振られます)

警告

ネットワーク機能を利用する場合、kernel_cfg.の中にある下記の定義を削除しないでください。

  • __SOLID_RESERVED_TASKS__

  • __SOLID_RESERVED_TASK_ORDER__

  • __SOLID_RESERVED_SEMS__

  • __SOLID_RESERVED_DTQS__

  • __SOLID_SYS_INTRTN()

  • __SOLID_SYS_TERRTN()

ネットワークを利用する場合の設定にてついてはネットワークの項の カーネル資源設定について も参照してください。

タスク初期化ブロック

typedef struct task_initialization_block TINIB

説明

タスク生成時の初期化情報を設定します。

定義

typedef struct task_initialization_block {
    ATR         tskatr;
    intptr_t    exinf;
    TASK        task;
    uint_t      ipriority;
    size_t      stksz;
    void        *stk;
} TINIB;

const TINIB _kernel_tinib_table[];

メンバー

tskatr

タスク属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_ACT

タスクの生成時にタスクを起動する

TA_NOACTQUE

タスクに対する起動要求をキューイングしない

TA_RSTR

生成するタスクを制約タスクとする

exinf

タスクの拡張情報

タスクが起動されるときの引数を指定します。(任意)

task

タスクの起動番地

タスクの起動番地をC言語の関数アドレスで指定します。 関数型は以下の通りです。

typedef void    (*TASK)(intptr_t exinf);

タスクが起動するタイミングでexinfを引数にtaskで指定された関数が呼び出されます。

ipriority
タスクの起動時優先度(内部表現)

カーネル内部表現で指定する必要があるため、マクロ INT_PRIORITYを使用してください。INT_PRIORITY(1)が最高優先度でINT_PRIORITY(16)が最低優先度です。

stksz

スタック領域のサイズ(丸めた値)

stk

スタック領域の先頭番地

note

このテーブル内に記述された順序に沿ってタスクIDが1(TMIN_TSKID)から割り振られます。

stkがNULLの場合、カーネルは自動的にstkszで指定された領域を確保してタスクに割り当てます。ユーザが確保した領域(変数)をスタックとして使用したい場合にはその領域のアドレスをstkに指定しますがその場合は以下の点に注意してください

  • SOLID-OSの機能であるスタックフェンス機能はスタックが自動割り当ての場合(stk==NULL)のみ動作します。ユーザが任意のスタック領域を割り当てている場合にはそのタスクにはスタックフェンス機能が働きません。

  • スタック領域と使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制限があるためstkに指定する領域(変数)については以下のマクロを使用して宣言してください。

    SKT_T

    スタック用のデータ型

    COUNT_STK_T(sz)

    サイズszのスタック領域を確保するために必要なSTK_T型の配列の要素数

    ROUND_STK_T(sz)

    サイズszに必要なSTK_T型の数(配列の要素数)

example

#define STACK_SIZE          2048

extern void task1(void *);
extern void task2(void *);

static STK_T _stack_TASK1[COUNT_STK_T(STACK_SIZE)];

const TINIB _kernel_tinib_table[] = {
        // 生成時に起動(TA_ACT), スタック領域のアドレスを指定 (スタックフェンス機能 無効)
        { TA_ACT, 0, task1, INT_PRIORITY(MID_PRIORITY), ROUND_STK_T(STACK_SIZE), _stack_TASK1 },
        // 生成時には起動しない, スタックをカーネル内で確保(スタックフェンス機能 有効)
        { TA_NULL, 0, task2, INT_PRIORITY(HIGH_PRIORITY), ROUND_STK_T(STACK_SIZE), NULL}, };
};

タスク生成順序テーブル

type ID

説明

タスク生成の順序を設定します。

定義

const ID _kernel_torder_table[];

メンバー

note

タスクを生成する順序をIDで指定します。指定する数はタスク初期化ブロックに記述された数と必ず一致する必要があります。 一致しない場合のカーネルの動作は保証されません。 -このテーブルでの指定の順序に関わらず各タスクのIDはタスク初期化テーブルでの並びで決まります。

example

/*
*  タスクIDの定数定義
*/
#define    TASK1       1
#define    TASK2       2
#define    TASK3       3

const ID _kernel_torder_table[] = { TASK3, TASK1, TASK2 };

この例の場合、TASK3→TASK1→TASK2の順序でタスク生成処理が行われます。

セマフォ初期化ブロック

typedef struct semaphore_initialization_block SEMINIB

説明

使用するセマフォの属性を定義します。

定義

typedef struct semaphore_initialization_block {
   ATR         sematr;         // セマフォ属性
   uint_t      isemcnt;        // セマフォの資源数の初期値
   uint_t      maxsem;         // セマフォの最大資源数
} SEMINIB;

const SEMINIB _kernel_seminib_table[];

メンバー

sematr

セマフォ属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_TPRI

待ち行列をタスクの優先度順にする

isemcnt

セマフォの資源数の初期値

maxsem

セマフォの最大資源数

note

example

const SEMINIB _kernel_seminib_table[] = {
    { TA_NULL, 1, 1 },  // 待ち行列=FIFO順, 最大数=1,初期値=1でセマフォを生成
    { TA_TPRI, 0, 1 },  // 待ち行列=タスク優先度順, 最大数=1,初期値=0でセマフォを生成
};

イベントフラグ初期化ブロック

typedef struct eventflag_initialization_block FLGINIB

説明

使用するイベントフラグの属性を定義します。

定義

typedef struct eventflag_initialization_block {
   ATR         flgatr;         // イベントフラグ属性
   FLGPTN      iflgptn;        // イベントフラグのビットパターンの初期値
} FLGINIB;

const FLGINIB _kernel_flginib_table[];
メンバー
flgatr
イベントフラグ属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_TPRI

待ち行列をタスクの優先度順にする

TA_WMUL

複数のタスクが待つのを許す

TA_CLR

タスクの待ち解除時にイベントフラグをクリアする

iflgptn

イベントフラグのビットパターンの初期値

note

example

const FLGINIB _kernel_flginib_table[] = {
        { TA_NULL, 0x00 },          // 複数タスク待ち不可, 待ち行列=FIFO順, フラグ初期値=0
        { TA_CLR, 0x01 },           // 複数タスク待ち不可, 待ち行列=FIFO順, 待ち解除時にフラグクリア,フラグ初期値=1
        { TA_WMUL|TA_CLR, 0x00 },   // 複数タスク待ち許可, 待ち行列=FIFO順, 待ち解除時にフラグクリア,フラグ初期値=0
        { TA_WMUL|TA_TPRI, 0x00 },  // 複数タスク待ち許可, 待ち行列=タスク優先度順, フラグ初期値=0
};

データキュー初期化ブロック

typedef struct dataqueue_initialization_block DTQINIB

説明

使用するデータキューの属性を定義します。

定義

typedef struct dataqueue_initialization_block {
   ATR         dtqatr;         // データキュー属性
   uint_t      dtqcnt;         // データキューの容量
   DTQMB       *p_dtqmb;       // データキュー管理領域の先頭番地
} DTQINIB;

const DTQINIB _kernel_dtqinib_table[];

メンバー

dtqatr

データキュー属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_TPRI

送信 待ち行列をタスクの優先度順にする (受信待ち行列は常にFIFO順)

dtqcnt

データキューの容量

p_dtqmb

データキュー管理領域の先頭番地

note

p_dtqmbがNULLの場合、カーネルは自動的にdtqcntで指定された容量に対して必要な管理領域を確保してデータキューに割り当てます。 ユーザが確保した領域をデータキュー管理領域として使用する場合、管理領域して使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制約があるため、p_dtqmbが指す領域(変数)については以下のデータ型とマクロを使用して宣言してください。

MB_T

管理領域のデータ型

TSZ_DTQMB(dtqcnt)

dtqcntで指定した数のデータを格納できるデータキュー管理領域のサイズ(バイト数)

TCNT_DTQMB(dtqcnt)

dtqcntで指定した数のデータを格納できるデータキュー管理領域を確保するために必要なMB_T型の配列の要素数

example

static MB_T    _kernel_dtqmb_DTQ3[TCNT_DTQMB(2)];

const DTQINIB _kernel_dtqinib_table[] = {
    { TA_NULL, 2, NULL },                // 送信待ち行列=FIFO順, 容量=2
    { TA_NULL, 0, NULL },                // 送信待ち行列=FIFO順, 容量=0
    { TA_TPRI, 2, _kernel_dtqmb_DTQ3 },// 送信待ち行列=タスク優先度順, 容量=2, 管理領域を指定
};

優先度データキュー初期化ブロック

typedef struct pridataq_initialization_block PDQINIB

説明

使用する優先度データキューの属性を定義します。

定義

typedef struct pridataq_initialization_block {
   ATR         pdqatr;         // 優先度データキュー属性
   uint_t      pdqcnt;         // 優先度データキューの容量
   PRI         maxdpri;        // データ優先度の最大値
   PDQMB       *p_pdqmb;       // 優先度データキュー管理領域の先頭番地
} PDQINIB;

const PDQINIB _kernel_pdqinib_table[];

メンバー

pdqatr

優先度データキュー属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_TPRI

送信 待ち行列をタスクの優先度順にする (受信待ち行列は常にFIFO順)

pdqcnt

優先度データキューの容量

maxdpri
データ優先度の最大値

TMIN_DPRI(1,最高優先度)からTMAX_DPRI(16)の範囲で指定可能です

p_pdqmb

優先度データキュー管理領域の先頭番地

note

TA_TPRIを指定した場合のデータ優先度とタスク優先度の関係、動作については TOPPERS第3世代カーネル(ITRON系)統合仕様書 の4.4.4 優先度データキューの「仕様上の注意」を参照してください。

p_pdqmbがNULLの場合、カーネルは自動的にpdqcntで指定された容量に対して必要な管理領域を確保して優先度データキューに割り当てます。 ユーザが確保した領域を優先度データキュー管理領域として使用する場合、管理領域して使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制約があるため、p_pdqmbが指す領域(変数)については以下のデータ型とマクロを使用して宣言してください。

MB_T

管理領域のデータ型

TSZ_PDQMB(pdqcnt)

pdqcntで指定した数のデータを格納できる優先度データキュー管理領域のサイズ(バイト数)

TCNT_PDQMB(pdqcnt)

pdqcntで指定した数のデータを格納できる優先度データキュー管理領域を確保するために必要なMB_T型の配列の要素数

example

static MB_T    _kernel_pdqmb_PDQ3[TCNT_PDQMB(2)];

const PDQINIB _kernel_pdqinib_table[] = {
    { TA_NULL, 2, TMAX_DPRI, NULL },                // 送信待ち行列=FIFO順, データ優先度=最大(最低)
    { TA_NULL, 0, 8, NULL },                        // 送信待ち行列=FIFO順、容量=0
    { TA_TPRI, 2, TMAX_DPRI, _kernel_pdqmb_PDQ3 },    // 送信待ち行列=タスク優先度順,  管理領域を指定
};

ミューテックス初期化ブロック

typedef struct mutex_initialization_block MTXINIB

説明

使用するミューテックスの属性を定義します。

定義

typedef struct mutex_initialization_block {
   ATR         mtxatr;         // ミューテックス属性
   uint_t      ceilpri;        // ミューテックスの上限優先度(内部表現)
} MTXINIB;

const MTXINIB _kernel_mtxinib_table[];

メンバー

mtxatr

ミューテックス属性

以下の属性を指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_TPRI

待ち行列をタスクの優先度順にする

TA_CEILING

優先度上限ミューテックスとする.待ち行列をタスクの優先度順にする

ceilpri
ミューテックスの上限優先度(内部表現)

カーネル内部表現で指定する必要があるため、マクロ INT_PRIORITYを使用してください。INT_PRIORITY(1)が最高優先度でINT_PRIORITY(16)が最低優先度です。 TA_CEILINGが指定された場合のみ有効です。

note

優先度上限ミューテックスの動作については TOPPERS第3世代カーネル(ITRON系)統合仕様書 の4.4.5 ミューテックスの「使用上の注意」を参照してください。

example

const MTXINIB _kernel_mtxinib_table[] = {

      { TA_NULL, INT_PRIORITY(1) },    //待ち行列=FIFO順 (優先度は無効)
      { TA_CEILING, INT_PRIORITY(9) }, //優先度上限ミューテックス, 上限優先度有効
      { TA_TPRI, INT_PRIORITY(1) },    //待ち行列=タスク優先度順、優先度上限なし

};

固定長メモリプール初期化ブロック

typedef struct fixed_memorypool_initialization_block MPFINIB

説明

使用する固定長メモリプール初期化ブロックの属性を定義します。

定義

typedef struct fixed_memorypool_initialization_block {
   ATR         mpfatr;         // 固定長メモリプール属性
   uint_t      blkcnt;         // メモリブロック数
   uint_t      blksz;          // メモリブロックのサイズ(丸めた値)
   void        *mpf;           // 固定長メモリプール領域の先頭番地
   MPFMB       *p_mpfmb;       // 固定長メモリプール管理領域の先頭番地
} MPFINIB;

const MPFINIB _kernel_mpfinib_table[] = {

メンバー

mpfatr
固定長メモリプール属性

TA_TPRI

待ち行列をタスクの優先度順にする

blkcnt

メモリブロック数

blksz

メモリブロックのサイズ(丸めた値)

mpf

固定長メモリプール領域の先頭番地

p_mpfmb

固定長メモリプール管理領域の先頭番地

note

mpf及びp_mpfmbにNULLを指定した場合はカーネル内部で必要なメモリ領域の確保が行われます。

固定長メモリプール領域、固定長メモリプール管理領域として使用するメモリ領域には配置(アドレスのアラインメント)、サイズに制限があるためそれぞれ以下のマクロを使用して宣言してください。

  • 固定長メモリプール領域を確保するためのマクロとデータ型

    MPF_T

    固定長メモリプール領域用のデータ型

    COUNT_MPF_T(blksz)

    固定長メモリブロックのサイズがblkszの固定長メモリプール領域を確保するために,固定長メモリブロック1つあたりに必要なMPF_T型の配列の要素数

    ROUND_MPF_T(blksz)

    要素数COUNT_MPF_T(blksz)のMPF_T型の配列のサイズ(blkszを,MPF_T型のサイズの倍数になるように大きい方に丸めた値)

  • 固定長メモリプール管理領域を確保するためのマクロ

    TSZ_MPFMB(blkcnt)

    blkcntで指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域のサイズ(バイト数)

    TCNT_MPFMB(blkcnt)

    blkcntで指定した数の固定長メモリブロックを管理することができる固定長メモリプール管理領域を確保するために必要なMB_T型の配列の要素数

example

#define MPF_BLOCK_SIZE      64

#define NUM_BLOCKS_MPF1     1
#define NUM_BLOCKS_MPF2     2
#define NUM_BLOCKS_MPF3     1
#define NUM_BLOCKS_MPF4     1

static  MPF_T   _pool1[ NUM_BLOCKS_MPF1 * COUNT_MPF_T(MPF_BLOCK_SIZE) ];
static  MPF_T   _pool4[ NUM_BLOCKS_MPF2 * COUNT_MPF_T(MPF_BLOCK_SIZE) ];

static  MB_T    _mpfmb2[TCNT_MPFMB(NUM_BLOCKS_MPF2)];
static  MB_T    _mpfmb4[TCNT_MPFMB(NUM_BLOCKS_MPF4)];

const MPFINIB _kernel_mpfinib_table[] = {
    { TA_NULL, NUM_BLOCKS_MPF1, ROUND_MPF_T(MPF_BLOCK_SIZE),_pool1, NULL },           // データ領域を静的変数で確保
    { TA_NULL, NUM_BLOCKS_MPF2, ROUND_MPF_T(MPF_BLOCK_SIZE),NULL, (MPFMB*)_mpfmb2},   // 管理領域を静的変数で確保
    { TA_TPRI, NUM_BLOCKS_MPF3, ROUND_MPF_T(1),NULL,NULL },                           // 待ち行列=タスク優先度順
    { TA_NULL, NUM_BLOCKS_MPF4, ROUND_MPF_T(MPF_BLOCK_SIZE),_pool4, (MPFMB*)_mpfmb4 },// すべての領域を静的変数で確保
};

周期通知初期化ブロック

typedef struct cyclic_handler_initialization_block CYCINIB

説明

使用する周期通知の属性と処理を定義します。

定義

typedef struct cyclic_handler_initialization_block {
   ATR         cycatr;         // 周期通知属性
   intptr_t    exinf;          // 通知ハンドラの拡張情報
   NFYHDR      nfyhdr;         // 通知ハンドラの起動番地
   RELTIM      cyctim;         // 周期通知の起動周期
   RELTIM      cycphs;         // 周期通知の起動位相
} CYCINIB;

const CYCINIB _kernel_cycinib_table[] = {

メンバー

cycatr

周期通知属性

以下の属性を論理和(or)で指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_STA

周期通知の生成時に周期通知を動作開始する

exinf

通知ハンドラの拡張情報

通知ハンドラが起動されるときの引数を指定します。(任意)

nfyhdr

通知ハンドラの起動番地

通知ハンドラの起動番地をC言語の関数アドレスで指定します。 関数型は以下の通りです。

typedef void    (*NFYHDR)(intptr_t exinf);

通知ハンドラが起動するタイミングでexinfを引数にnfyhdrで指定された関数が呼び出されます。

cyctim

周期通知の起動周期(単位:usec)

cycphs

周期通知の起動位相(単位:usec)

note

example

#define CYC1_CYCLE      100U        // 100usec

extern void cyc_func(intptr_t exinf);

const CYCINIB _kernel_cycinib_table[] = {
   { TA_STA, 0, cyc_func, CYC1_CYCLE, CYC1_CYCLE }, // 生成と同時に100usec間隔でcyc_funcを呼び出す
};

アラーム通知初期化ブロック

typedef struct alarm_handler_initialization_block ALMINIB

説明

使用するアラーム通知の属性と処理を定義します。

定義

typedef struct alarm_handler_initialization_block {
   ATR         almatr;         // アラーム通知属性
   T_NFYINFO   nfyinfo;       //通知パラメータ構造体
} ALMINIB;

const ALMINIB _kernel_alminib_table[];

メンバー

almatr
アラーム通知属性

指定可能な属性をありません。常にTA_NULLをセットしてください。

nfyinfo
通知パラメータ構造体

アラーム通知が発生した場合の通知方法やエラーが起きた場合の処理方法を構造体に設定します。 詳細については 通知パラメータ構造体の設定方法 を参照してください。

note

example

(通知パラメータ構造体の設定方法 を参照してください。)

通知パラメータ構造体の設定方法

typedef struct T_NFYINFO T_NFYINFO

説明

アラーム通知などにおいてカーネルからの通知方法を定義・指定します。

定義

typedef struct {
   MODE    nfymode;             // 通知処理モード
   union {                     // タイムイベントの通知に関する付随情報
      T_NFY_COMMON    initializer;
      T_NFY_HDR   handler;
      T_NFY_VAR   setvar;
      T_NFY_IVAR  incvar;
      T_NFY_TSK   acttsk;
      T_NFY_TSK   wuptsk;
      T_NFY_SEM   sigsem;
      T_NFY_FLG   setflg;
      T_NFY_DTQ   snddtq;
   } nfy;
   union {                     // エラーの通知に関する付随情報
      T_NFY_COMMON    initializer;
      T_ENFY_VAR  setvar;
      T_NFY_IVAR  incvar;
      T_NFY_TSK   acttsk;
      T_NFY_TSK   wuptsk;
      T_NFY_SEM   sigsem;
      T_NFY_FLG   setflg;
      T_ENFY_DTQ  snddtq;
   } enfy;
} T_NFYINFO;

メンバー

nfymode

通知処理モード

以下の通知種類をエラー通知方法を論理和(or)で指定します。

通知の種類

TNFY_HANDLER

タイムイベントハンドラの呼出しによる通知

TNFY_SETVAR

変数の設定による通知

TNFY_INCVAR

変数のインクリメントによる通知

TNFY_ACTTSK

タスクの起動による通知

TNFY_WUPTSK

タスクの起床による通知

TNFY_SIGSEM

セマフォの返却による通知

TNFY_SETFLG

イベントフラグのセットによる通知

TNFY_SNDDTQ

データキューへの送信による通知

エラー通知の種類

TENFY_SETVAR

変数の設定による通知

TENFY_INCVAR

変数のインクリメントによる通知

TENFY_ACTTSK

タスクの起動による通知

TENFY_WUPTSK

タスクの起床による通知

TENFY_SIGSEM

セマフォの返却による通知

TENFY_SETFLG

イベントフラグのセットによる通知

TENFY_SNDDTQ

データキューへの送信による通知

エラー通知が必要無い場合には上記定数を指定する必要はありません。

nfy

タイムイベントの通知に関する付随情報

nfymodeに指定した通知の種類に応じて通知に付随するパラメータを指定します。 本メンバーの設定には以下のマクロを使用してください。

nfymode

マクロ名

TNFY_HANDLER

NFY_PARAM_HANDLER

TNFY_SETVAR

NFY_PARAM_SETVAR

TNFY_INCVAR

NFY_PARAM_INCVAR

TNFY_ACTTSK

NFY_PARAM_ACT_TSK

TNFY_WUPTSK

NFY_PARAM_WUP_TSK

TNFY_SIGSEM

NFY_PARAM_SIG_SEM

TNFY_SETFLG

NFY_PARAM_SET_FLG

TNFY_SNDDTQ

NFY_PARAM_SND_DTQ

各マクロのパラメータは以下の通りです。

NFY_PARAM_HANDLER(exinf, handler)
intprt_t exinf

ハンドラ関数に渡されるパラメータ

TMEHDR handler

ハンドラ関数アドレス (void (*)(intptr_t))

NFY_PARAM_SETVAR(p_var, value)
intptr_t p_var

変数アドレス

intptr_t value

変数に設定するアドレス

NFY_PARAM_INCVAR(p_var)
intptr_t p_var

変数アドレス

NFY_PARAM_ACT_TSK(tskid)
ID tskid

起動するタスクID

NFY_PARAM_WUP_TSK(tskid)
ID tskid

起床させるタスクID

NFY_PARAM_SIG_SEM(semid)
ID semid

セマフォID

NFY_PARAM_SET_FLG(flgid, flgptn)
ID flgid

イベントフラグID

FLGPTN flgptn

セットするビットパターン

NFY_PARAM_SND_DTQ(dtqid, data)
ID dtqid

データキューID

enfy

エラーの通知に関する付随情報

nfymodeに指定した通知の種類に応じて通知に付随するパラメータを指定します。 本メンバーの設定には以下のマクロを使用してください。

nfymode

マクロ名

TENFY_SETVAR

ERRNFY_PARAM_SETVAR

TENFY_INCVAR

ERRNFY_PARAM_INCVAR

TENFY_ACTTSK

ERRNFY_PARAM_ACT_TSK

TENFY_WUPTSK

ERRNFY_PARAM_WUP_TSK

TENFY_SIGSEM

ERRNFY_PARAM_SIG_SEM

TENFY_SETFLG

ERRNFY_PARAM_SET_FLG

TENFY_SNDDTQ

ERRNFY_PARAM_SND_DTQ

各マクロのパラメータは以下の通りです。

ERRNFY_PARAM_SETVAR(p_var)
intptr_t p_var

変数アドレス

intptr_t value

変数に設定するアドレス

ERRNFY_PARAM_INCVAR(p_var)
intptr_t p_var

変数アドレス

ERRNFY_PARAM_ACT_TSK(tskid)
ID tskid

起動するタスクID

ERRNFY_PARAM_WUP_TSK(tskid)
ID tskid

起床させるタスクID

ERRNFY_PARAM_SIG_SEM(semid)
ID semid

セマフォID

ERRNFY_PARAM_SET_FLG(flgid, flgptn)
ID flgid

イベントフラグID

FLGPTN flgptn

セットするビットパターン

ERRNFY_PARAM_SND_DTQ(dtqid)
ID dtqid

データキューID

note

example

#define    TASK1        1
#define    TASK2        2
#define    SEM1        1
#define   FLG1        1
#define   DTQ1        1

extern bool_t event_variable;
extern int_t count_variable;
extern ER error_variable;

const ALMINIB _kernel_alminib_table[] = {
    // 通知時に変数 event_variableにtrueを設定、エラー通知なし
    { TA_NULL, { TNFY_SETVAR, {NFY_PARAM_SETVAR(&event_variable, true)} }},

    // 通知時にタスク(ID=TASK2)を起動、エラー通知なし
    { TA_NULL, { TNFY_ACTTSK, {NFY_PARAM_ACT_TSK(TASK2)} }},

    // 通知時にタスク(ID=TASK2)を起床、エラー通知発生時には変数error_varibaleにエラーを格納する
    { TA_NULL, { TNFY_WUPTSK|TENFY_SETVAR, {NFY_PARAM_WUP_TSK(TASK2)}, {ERRNFY_PARAM_SETVAR(&error_variable)} }},

    // 通知時にセマフォに返却(sig_sem)、エラー通知発生時にはタスク(ID=TASK2)を起床
    { TA_NULL, { TNFY_SIGSEM|TENFY_ACTTSK, {NFY_PARAM_SIG_SEM(SEM1)}, {ERRNFY_PARAM_ACT_TSK(TASK2)} }},

    // 通知時にイベントフラグをセット(ID FLG1に対し 0x01)
    { TA_NULL, { TNFY_SETFLG, {NFY_PARAM_SET_FLG(FLG1, 0x01)} }},

    // 通知時にデータキューに対しデータ(0x01)を送信、エラーが発生した場合はTASK2を起床させる
    { TA_NULL, { TNFY_SNDDTQ|TENFY_WUPTSK, {NFY_PARAM_SND_DTQ(DTQ1, 0x01)}, {ERRNFY_PARAM_WUP_TSK(TASK2)} }},

    // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはSEM1に対しsig_semを実行する
    { TA_NULL, { TNFY_ACTTSK|TENFY_SIGSEM, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SIG_SEM(SEM1)} }},

    // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはイベントフラグ FLG1に対し0x02をセット
    { TA_NULL, { TNFY_ACTTSK|TENFY_SETFLG, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SET_FLG(FLG1, 0x02)} }},

    // 通知時にタスク(ID=TASK2)を起動、 エラー発生時にはデータキューに対しエラーコードを送信
    { TA_NULL, { TNFY_ACTTSK|TENFY_SNDDTQ, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_SND_DTQ(DTQ1)} }},

    // 通知時に変数 count_varibaleをインクリメント、エラー通知なし
    { TA_NULL, { TNFY_INCVAR, {NFY_PARAM_INCVAR(&count_variable)} }},

    // 通知時にタスク(ID=TASK2)を起動、 エラー発生時には通知時に変数 count_varibaleをインクリメント
    { TA_NULL, { TNFY_ACTTSK|TENFY_INCVAR, {NFY_PARAM_ACT_TSK(TASK2)}, {ERRNFY_PARAM_INCVAR(&count_variable)} }},
};

割込み初期化設定ブロック

typedef struct interrupt_handler_initialization_block INTINIB

説明

カーネルで扱う割込みについて定義します。 カーネルは起動時にこのテーブルに記述された内容を読込み、Core Serviceに対して必要な設定を行います。 このテーブルに定義されていない割込みはカーネル管理外となり、アプリケーションから扱う事はできなくなります。

割込みの処理を行う関数を登録する方法には以下の二種類があります。
  • 割込みサービスルーチン(ISR)

    カーネル内部のハンドラを経由します。同一の割込みに対して複数のISRを登録することができ、割込み発生時には設定されて優先度に従ってすべてのISRが呼び出されます。

    動的生成機能拡張カーネルの場合はacre_isrの呼び出しによりISRを登録することもできます。 (その場合でも割込み初期化設定ブロックであらかじめ使用する割込みについて定義しておく必要はあります)

  • 割込みハンドラ

    割込み初期化設定ブロックに登録された関数のみが呼び出されます。 カーネルの動的生成機能拡張対応の有無に関わらず動的に登録することはできません。

同一の割込みに対して割込みサービスルーチンと割込みハンドラの両方を同時に使用することはできません。

定義

typedef struct interrupt_handler_initialization_block {
   INTNO       intno;     // 割込み番号
   ATR         inhatr;    // 割込みハンドラ属性
   FP          inthdr;    // 割込みハンドラの出入口処理の番地 (ISR使用時はINTINI_USE_ISRを指定)->関数型:void (foo)(void);
   ATR         intatr;    // 割込み属性 (TA_ENAINTのみサポート)
   PRI         intpri;    // 割込み優先度 [-1:最低優先度 ... -32:最高優先度]
} INTINIB;

const INTINIB _kernel_intinib_table[];

メンバー

intno
割込み番号

SOLID-OSにおいては割込み番号はBSPにおけるIRQ番号に一致します。

inhatr
割込みハンドラ属性

指定可能な属性をありません。常にTA_NULLをセットしてください。

inthdr
割込みハンドラの出入口処理の番地
  • 割込みサービスルーチン(ISR)を使用する場合

    マクロ INTINI_USE_ISRを指定します。

  • 割込みハンドラを使用する場合

    ハンドラ関数のアドレスを指定します。関数型は以下の通りです。

    void interrupt_handler(void);
    

    割込みハンドラと割込みサービスルーチンでは関数型が異なるので注意してください

intatr
割込み属性 (TA_ENAINTのみサポート)

以下の属性を指定できます。何も指定がない場合にはTA_NULLをセットします。

TA_ENAINT

割込み要求禁止フラグをクリア

intpri
割込み優先度

-1(最低優先度)から-32(最高優先度)の範囲で優先度を指定します。 ここで指定された値はCore Serviceを介して割込みコントローラの優先度に反映されます。 (実際にコントローラに設定される値はコントローラの仕様に合わせて変換されます)

note

使用する割込み番号が重複した場合は先着優先(先に記述された定義が優先)となり無視されます。また、タイマ割込みなどカーネルやCore Serviceで使用する割込みを指定した場合も同様です。予約されている割込みはボード毎に異なりますので 予約されている割込み で確認してください。

動的生成機能拡張カーネルを使用してacre_isrを利用する場合でも割込み初期化設定ブロックにおいて対象となる割込み番号が割込みサービスルーチンを使用するための設定で登録されている必要があります。

example

割込みサービスルーチン(ISR)初期化ブロック

typedef struct t_cisr T_CISR

説明

割込みサービスルーチンの登録を行います。 使用する割込みについては割込み初期化設定ブロックにおいて割込みサービスルーチンを使用するための設定で登録されている必要があります。

定義

typedef struct t_cisr {
   ATR         isratr;     // 割込みサービスルーチン属性
   intptr_t    exinf;      // 割込みサービスルーチンの拡張情報
   INTNO       intno;      // 割込みサービスルーチンを登録する割込み番号
   ISR         isr;        // 割込みサービスルーチンの先頭番地->関数型:void (foo)(intptr_t);
   PRI         isrpri;     // 割込みサービスルーチン優先度 [1:最高優先度 ... 16:最低優先度]
} T_CISR;

const T_CISR  _kernel_isrini_cfg_table[] = {

メンバー

isratr
割込みサービスルーチン属性

指定可能な属性をありません。常にTA_NULLをセットしてください。

exinf
割込みサービスルーチンの拡張情報

割込み発生時にisrで指定された関数に引数として渡される値を指定します。

intno
割込みサービスルーチンを登録する割込み番号

割込み初期化設定ブロックで登録した割込み番号を設定します。該当する割込みについて割込み初期化設定ブロックのメンバinthdrにINTINI_USE_ISRが指定されている必要があります。

isr

割込みサービスルーチンの先頭番地

typedef void    (*ISR)(intptr_t exinf);
  • 割込みサービスルーチンと割込みハンドラでは関数型が異なるので注意してください*

isrpri
割込みサービスルーチン優先度

1(最高優先度)から16(最低優先度)の範囲で優先度を指定します。 ここで指定された値はカーネル内で割込みサービスルーチン間の優先順位を判定するためにのみ使用されます。 (割込みコントローラの設定には反映されません)

note

example

#define     INTNO_SGI1                1    // 割込み番号1
#define     INTNO_SGI2                2    // 割込み番号2

extern void int_handler_sgi2(void);

//
// 割込み初期化ブロック
//
const INTINIB _kernel_intinib_table[] = {
    {INTNO_SGI1,TA_NULL, INTINI_USE_ISR, TA_NULL,(-1)},     // IRQ1 <- 最低優先度、ISRを使用
    {INTNO_SGI2,TA_NULL, int_handler_sgi2, TA_NULL,(-32)},  // IRQ2 <- 最高優先度、直接割込みハンドラ関数を登録
};

#define ISRPRI_HIGH_PRIORITY   1       // 高優先度
#define ISRPRI_MID_PRIORITY    10      // 中優先度
#define ISRPRI_LOW_PRIORITY    16      // 低優先度

extern void isr_high_handler(intptr_t exinf);
extern void isr_mid_handler(intptr_t exinf);
extern void isr_low_handler(intptr_t exinf);

//
//  割込みサービルルーチン初期化ブロック
//
const T_CISR  _kernel_isrini_cfg_table[] = {
    {TA_NULL, (intptr_t)1, INTNO_SGI1, isr_mid_handler, ISRPRI_MID_PRIORITY},  // 中優先度のISRを登録
    {TA_NULL, (intptr_t)2, INTNO_SGI1, isr_low_handler, ISRPRI_LOW_PRIORITY},  // 低優先度のISRを登録
    {TA_NULL, (intptr_t)3, INTNO_SGI1, isr_high_handler, ISRPRI_TOP_PRIORITY}, // 高優先度のISRを登録
};

ISR生成順序テーブル

type ID

説明

割込みサービスルーチン生成の順序を設定します。 割込みサービスルーチン(ISR)初期化ブロックに登録したISRに対応するIDを指定してください。

定義

const ID _kernel_isrorder_table[];

メンバー

note

割込みサービスルーチンを生成する順序をIDで指定します。指定する数は割込みサービスルーチン初期化ブロックに記述された数と必ず一致する必要があります。 一致しない場合のカーネルの動作は保証されません。 -このテーブルでの指定の順序に関わらず各割込みサービスルーチンのIDは割込みサービスルーチン初期化テーブルでの並びで決まります。

example

/*
*  割込みサービスルーチンIDの定数定義
*/
#define    ISR1       1
#define    ISR2       2
#define    ISR3       3

const ID _kernel_isrorder_table[] = { ISR3, ISR1, ISR2 };

この例の場合、ISR3→ISR1→ISR2の順序で割込みサービスルーチン生成処理が行われます。

動的生成される資源の上限数設定(動的資源生成カーネルのみ)

/*
*    動的に生成するカーネル資源の数を定義
*    (静的なテーブルで定義される資源に追加して動的に
*     生成できる資源数を定義
*/
#define    TNUM_AID_TSK    0
#define    TNUM_AID_SEM    0
#define    TNUM_AID_FLG    0
#define    TNUM_AID_DTQ    0
#define    TNUM_AID_PDQ    0
#define    TNUM_AID_MTX    0
#define    TNUM_AID_MPF    0
#define    TNUM_AID_CYC    0
#define    TNUM_AID_ALM    0
#define    TNUM_AID_ISR    0

各資源ごとに動的生成可能な上限数を定義します。 ここで定義した数を超えて資源を生成するAPI(acre_*)を呼び出した場合、E_NOID(ID番号不足)が返されます。 定義を省略した場合の値は0となります。

  • ここで定義される資源数には静的に生成される資源は含まれません。 例えば、テーブル定義で3つのタスクを定義し、さらにTNUM_AID(3)を定義した場合には合計で最大6つのタスクが生成できることになります。

各定数と資源の対応は以下の通りです。

定数名

資源名称

TNUM_AID_TSK

タスク

TNUM_AID_SEM

セマフォ

TNUM_AID_FLG

イベントフラグ

TNUM_AID_DTQ

データキュー

TNUM_AID_PDQ

優先度データキュー

TNUM_AID_MTX

ミューテックス

TNUM_AID_MPF

固定長メモリプール

TNUM_AID_CYC

周期通知

TNUM_AID_ALM

アラーム通知

TNUM_AID_ISR

ISR(割込みサービスルーチン)

注釈

動的生成カーネルでない場合にはこれらの定義は無視されます。