Skip to content

T4+Webサーバ+SDメモリカードドライバを組み合わせたとき、T4とSDメモリカードドライバとで使用するCMTの優先度が同じだとハングする #12

@HirokiIshiguro

Description

@HirokiIshiguro

T4はシステムタイマモジュール(r_sys_time_rx)を用いて周期処理している。
上位にウェブサーバモジュール(r_t4_http_server_rx)を実装した際、
通常はEther割り込み内にて送受信データ処理を行い、ファイルシステムアクセスを行う。・・・①Ether割り込みコンテキスト
周期処理のタイミングで送受信データが存在する場合、稀にこのときにファイルシステムアクセスを行う。・・・②CMT割り込みコンテキスト

一方でSDメモリカードドライバも周期処理が必要でありSDメモリカードドライバの周期割り込みにCMT割り込みを用いるとする。・・・③CMT割り込みコンテキスト

①は多重割込み許可となっており、優先度①<③の場合は問題なし。
②は多重割込み許可となっており、優先度②<③の場合は問題なし。

以下ループのタイムアウト検出用のタイマインクリメントは③で行っているため、
優先度①>=③および②>=③の場合にインクリメントされなくなり、ハングする。

通常、CMTはチャネル毎に優先度設定はできないが、APIとしては実装されている。

②の初期化はシステムタイマモジュールで行う。以下★の行のように②の優先度を下げてしまえば条件を満たさなくなりハングしなくなる。

sys_time_err_t R_SYS_TIME_Open(void)
{
    sys_time_err_t return_code;
    int i;

    if(0 == sys_time_opened_flag)
    {
        memset(&sys_time_private, 0, sizeof(SYS_TIME));
        if(true == R_CMT_CreatePeriodic(100, sys_time_process, &sys_time_cmt_channel))
        {
        	uint32_t level = 1;  /* ★ */
        	R_CMT_Control(sys_time_cmt_channel, CMT_RX_CMD_SET_PRIORITY, &level);  /* ★ */

対策:
(1)CMTのControlのCMT_RX_CMD_SET_PRIORITYコマンドを公開する
(2)システムタイマモジュールのCMT割り込み優先度をコンフィグ可能にする

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions