Everything

RTOS用タスク関数(#pragma rtos_task)


#pragma指令により,指定された関数をRL78向けルネサスRTOS用のタスクと解釈します。

[機能]

-

#pragma rtos_taskで指定された関数名をRTOS用のタスクと解釈します。

-

タスク関数は,引数なし,またはsigned long 型の1引数を使用可能とし,戻り値の記述はできません。
2つ以上の引数を記述した場合,signed long 型でない引数を記述した場合,または戻り値を記述した場合,エラーとなります。

-

RTOS用タスク関数では関数出口処理を出力しません。

-

RTOS用タスク関数の最後で,常にRTOSのサービス・コールext_tskを呼びます。

-

RTOSサービス・コールext_tskは,br !!addr20命令で対応するOS内部関数を呼びます。通常関数の最後でext_tskを発行した場合は,関数出口処理を出力しません。

-

タスク関数の本体(関数定義)部分のコードは,.textセクション,または.textfセクションに出力されます。セクション名は,#pragma sectionにより変更可能です。

[効果]

-

Cソース・レベルで,RTOS用タスク関数を記述することができます。

-

関数出口処理が出力されなくなるため,コード効率が良くなります。

[方法]

-

次の #pragma指令に,関数名を指定します。

#pragma rtos_task   [(]タスク関数名 [ ,...][)]

[制限]

-

RTOS用タスク関数は__inlineおよび他#pragmaを指定すると,コンパイル・エラーとなります。

-

RTOS用タスク関数を通常の関数のように呼び出すと,コンパイル・エラーとなります。

[使用例]

Cソースを以下に示します。

#pragma rtos_task       func1
#pragma rtos_task       func2
extern void ext_tsk(void);
extern void g(int *a);
 
void func1 ( void ) {
        int a[3];
        a[0] = 1;
        g(a);
        ext_tsk( );
}
 
void func2 ( signed long x ) {
        int a[3];
        a[0] = 1;
        g(a);
}
 
void func3 ( void ) {
        int a[3];
        a[0] = 1;
        g(a);
        ext_tsk( );
}
 
void func4 ( void ) {
        int a[3];
        a[0] = 1;
        g(a);
        if ( a[0] )
                ext_tsk( );
}

 

コンパイラの出力アセンブリ・ソースは,以下のようになります。

    .section        .textf, TEXTF
_func1 :
    subw    sp, #0x06               ;スタックの確保
    onew    ax
    movw    [sp+0x00], ax           ;配列aの要素への代入
    movw    ax, sp
    call    !!_g
    call    !!_ext_tsk              ;ext_tsk 関数の呼び出し
    br      !!__kernel_task_exit    ;タスク関数が常に出力する__kernel_task_exit呼び出し
                                    ;エピローグを出力しない
_func2 :
    subw    sp, #0x06
    onew    ax
    movw    [sp+0x00], ax           ;配列aの要素への代入
    movw    ax, sp
    call    !!_g
    br      !!__kernel_task_exit    ;タスク関数が常に出力する__kernel_task_exit呼び出し
                                    ;エピローグを出力しない
_func3 :
    subw    sp, #0x06
    onew    ax
    movw    [sp+0x00], ax           ;配列aの要素への代入
    movw    ax, sp
    call    !!_g
    call    !!_ext_tsk              ;ext_tsk関数の呼び出し
    addw    sp, #0x06               ;#pragma rtos_taskがないとエピローグを出力する
    ret
_func4 :
    subw    sp, #0x06
    onew    ax
    movw    [sp+0x00], ax           ;配列aの要素への代入
    movw    ax, sp
    call    !!_g
    movw    ax, [sp+0x00]
    or      a, x
    bnz     $.BB@LABEL@4_2
.BB@LABEL@4_1:                      ;return
    addw    sp, #0x06               ;#pragma rtos_taskがないとエピローグを出力する
    ret
.BB@LABEL@4_2:                      ;bb3
    call    !!_ext_tsk
    br      $.BB@LABEL@4_1