-
Notifications
You must be signed in to change notification settings - Fork 6
Description
T4はシステムタイマモジュール(r_sys_time_rx)を用いて周期処理している。
上位にウェブサーバモジュール(r_t4_http_server_rx)を実装した際、
通常はEther割り込み内にて送受信データ処理を行い、ファイルシステムアクセスを行う。・・・①Ether割り込みコンテキスト
周期処理のタイミングで送受信データが存在する場合、稀にこのときにファイルシステムアクセスを行う。・・・②CMT割り込みコンテキスト
一方でSDメモリカードドライバも周期処理が必要でありSDメモリカードドライバの周期割り込みにCMT割り込みを用いるとする。・・・③CMT割り込みコンテキスト
①は多重割込み許可となっており、優先度①<③の場合は問題なし。
②は多重割込み許可となっており、優先度②<③の場合は問題なし。
以下ループのタイムアウト検出用のタイマインクリメントは③で行っているため、
優先度①>=③および②>=③の場合にインクリメントされなくなり、ハングする。
rx-driver-package/source/r_sdc_sdmem_rx/r_sdc_sdmem_rx_vx.xx/r_sdc_sdmem_rx/src/r_sdc_sd_config.c
Line 99 in 4294d84
if (r_sdc_sd_check_timer(card_no) == SDC_SD_ERR) |
通常、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割り込み優先度をコンフィグ可能にする