Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
HirokiIshiguro opened this issue Oct 11, 2020 · 0 comments
Labels
bug Something isn't working

Comments

@HirokiIshiguro
Copy link
Collaborator

HirokiIshiguro commented Oct 11, 2020

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割り込み優先度をコンフィグ可能にする

@HirokiIshiguro HirokiIshiguro added the bug Something isn't working label Oct 11, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant