FreeRTOS のコードについて質問

RXマイコン用 FreeRTOS の依存部分コードを観ていて、疑問に思う場所があります。

ソースは

portable/Renesas/RX600/portmacro.h

で、SWINT を起動する部分です。

#pragma inline_asm vPortYield

static void vPortYield( void )
{

/* Save clobbered register - may not actually be necessary if inline asm

functions are considered to use the same rules as function calls by the
compiler. */
PUSH.L R5
/* Set ITU SWINTR. */
MOV.L #553696, R5
MOV.B #1, [R5]
/* Read back to ensure the value is taken before proceeding. */
MOV.L [R5], R5
/* Restore clobbered register to its previous value. */
POP R5

}

上記の「553696」は「0x720E0」で、ICUの「ソフトウェア割り込み起動レジスタ(SWINTR)」

と思いますが、起動させる為、バイトで「1」を書いてから、32ビットで読み出しています。

ICUの説明を読んでも、書き込み後に32ビットで読み出す必要がある事は書かれていません。(RX64Mのハードウェアーマニュアル)

 

そもそも、SWINT を起動するなら、DTC用に用意してあるハードを叩かなくても、

「INT #27」のアセンブラ命令を実行すれば良いように思います。

 

何故、このような実装になっているか判る方いますか?

Parents
  • SWINTRに書き込んで読み出しているのは、CPUの命令パイプラインを経由して、ICUに確実に書き込まれた事を、その時点で確定させたいからだと思います。なぜここでそうしたいのかは、FreeRTOSのスケジューリング方式に関わる話なので、ここだけを見ていたのではよくわかりません。
    INT 命令で代替できるかどうかも、スケジューリング方式に関わる話かもしれませんので、何とも言い難いです。
    実際に試してみれば何かわかるかもしれませんよ。
Reply
  • SWINTRに書き込んで読み出しているのは、CPUの命令パイプラインを経由して、ICUに確実に書き込まれた事を、その時点で確定させたいからだと思います。なぜここでそうしたいのかは、FreeRTOSのスケジューリング方式に関わる話なので、ここだけを見ていたのではよくわかりません。
    INT 命令で代替できるかどうかも、スケジューリング方式に関わる話かもしれませんので、何とも言い難いです。
    実際に試してみれば何かわかるかもしれませんよ。
Children
No Data