Replies: 1 comment 1 reply
-
その理解で合っています。 |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
FMP3 3.3.0 のシリアルドライバ(syssvc/serial.c)における割り込み処理との排他制御に疑問があり、質問させていただきます。
serial_wri_chr(1文字送信ルーチン)では、割り込み禁止にして送信文字を送信バッファ(snd_buffer)へ書き込んでいます。
423 static ER_BOOL
424 serial_wri_chr(SPCB p_spcb, char c)
425 {
426 bool_t buffer_full;
427 ER ercd, rercd;
:
445 SVC(loc_cpu(), gen_ercd_sys(p_spcb)); ←割り込み禁止
446 if (p_spcb->snd_count == 0U && !(p_spcb->snd_stopped)
447 && serial_snd_chr(p_spcb, c)) {
448 /
449 * SIOの送信レジスタに文字を入れることに成功した場合.
450 /
451 buffer_full = false;
452 }
453 else {
454 /
455 * 送信バッファに文字を入れる.
456 */
457 p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c; ←送信バッファへ書き込み
458 INC_PTR(p_spcb->snd_write_ptr, p_spcb->p_spinib->snd_bufsz); ←ライトポインタ進める
459 p_spcb->snd_count++; ←文字数カウンタ増やす
460 buffer_full = (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz);
461 }
462
463 SVC(unl_cpu(), gen_ercd_sys(p_spcb)); ←割り込み禁止解除
一方、sio_irdy_snd(割り込み処理)では、
割り込み禁止にせずに送信バッファ(snd_buffer)からの読出しを行っています。
670 void
671 sio_irdy_snd(EXINF exinf)
672 {
673 SPCB *p_spcb;
674
675 p_spcb = (SPCB ) exinf;
676 if (p_spcb->rcv_fc_chr != '\0') {
677 /
678 * START/STOPを送信する.
679 /
680 (void) sio_snd_chr(p_spcb->p_siopcb, p_spcb->rcv_fc_chr);
681 p_spcb->rcv_fc_chr = '\0';
682 }
683 else if (!(p_spcb->snd_stopped) && p_spcb->snd_count > 0U) {
684 /
685 * 送信バッファ中から文字を取り出して送信する.
686 */
687 (void) sio_snd_chr(p_spcb->p_siopcb,
688 p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]); ←送信バッファ読出し
689 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz); ←リードポインタ進める
690 if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
691 if (sig_sem(p_spcb->p_spinib->snd_semid) < 0) {
692 p_spcb->errorflag = true;
693 }
694 }
695 p_spcb->snd_count--; ←文字数カウンタ減らす
696 }
FMP3での割り込み禁止(loc_cpu)は、それを実行したコアにのみ作用する(他のコアは割り込み許可状態で動き続ける)ものと理解しています。そうすると、例えば、serial_wri_chr()がコア#0で、sio_irdy_snd()がコア#1で、同時に実行され得る(コア#1は割り込み禁止にならないので)事になり、送信バッファの状態(p_spcb->snd_countなど)が壊れてしまうと思います。正しくは、serial_wri_chr()とsio_irdy_snd()の両方で、スピンロックを使った排他制御が必要なのではないかと思っています。
最近TOPPERSやマルチコアを触り始めたところで、あまり自信がないのですが、私の理解は間違っているでしょうか???
とても不思議に思っています。
どうぞよろしくお願いします。
fxycw360
Beta Was this translation helpful? Give feedback.
All reactions