RXマイコン用 FreeRTOS の依存部分コードを観ていて、疑問に思う場所があります。
ソースは
portable/Renesas/RX600/portmacro.h
で、SWINT を起動する部分です。
#pragma inline_asm vPortYield
/* Save clobbered register - may not actually be necessary if inline asm
}
上記の「553696」は「0x720E0」で、ICUの「ソフトウェア割り込み起動レジスタ(SWINTR)」
と思いますが、起動させる為、バイトで「1」を書いてから、32ビットで読み出しています。
ICUの説明を読んでも、書き込み後に32ビットで読み出す必要がある事は書かれていません。(RX64Mのハードウェアーマニュアル)
そもそも、SWINT を起動するなら、DTC用に用意してあるハードを叩かなくても、
「INT #27」のアセンブラ命令を実行すれば良いように思います。
何故、このような実装になっているか判る方いますか?
hirakuni45さん、こんにちは。NoMaYです。#FreeRTOS kernelについて調べ始めて日は浅いですが、、、> バイトで「1」を書いてから、32ビットで読み出して私もHigetakaさんの考えと同じ考えです。その時点で確定させることが必須かどうかは別にして、作った人の思いとして、そこで確定させたい、という気持ちだったのだと思います。ですが、以下のスレッドに書きましたが、RXマイコンのパイプライン動作はもっと高度で、作った人の意図通りには動作しないと思われます。(レジスタをリードして、更にリード値で何らかの演算をする、とういうことをしないといけないです。)RX65NのSCIgのTENDフラグの挙動を調べてみた(RX631のSCIcのTENDフラグの挙動も調べてみた)japan.renesasrulz.com/cafe_rene/f/forum5/5642/rx65n-scig-tend-rx631-scic-tend/31463#31463> SWINTを起動するなら、DTC用に用意してあるハードを叩かなくても、「INT #27」のアセンブラ命令を実行すれば単純に代替することは出来ないです。vPortYield()はportYIELD()とportYIELD_FROM_ISR()で使われていますが、以下の2つの役割があり、この(2)において色々面倒なことになります。(1) 通常処理内:(当面することがないので)次に控えているタスクに制御を譲る(2) 割り込み処理内:(割り込み処理内でタスクのプライオリティを変化させたので)割り込み終了時に高優先度タスクに制御を移す
#define portYIELD() vPortYield()#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD()
うまく伝えられる自信が無いですが、この(2)においては、割り込み処理内で(つまりCPUが割り込み処理中の状態に留まったままで)高優先度タスクに切り替えては駄目で、一旦割り込み処理を抜けてから高優先度タスクに切り替えないといけないですが、INT命令を使った場合には、RTOS実装者にもRTOS利用者(またはRTOS対応のソフトウェアフレームワーク開発者)にも余分に負担が掛かります。INT命令を使った場合、実装的には、スタックを小細工し、戻っていくタスクが、割り込み発生時のタスクとは別の高優先度タスクにリターンしていくようにするのですが、その為、タスク切り替えを引き起こす可能性のある割り込みルーチンは全て常に同じシーケンスでレジスタのPUSH/POPが行われるように(そうしないと自由にタスクを切り替えることが出来ない、そうしないとタスクを切り替えた時にスタックの整合性が狂って暴走してしまう、INT命令での割り込みルーチン内だけの話に収まらない)、割り込み処理ルーチンの最初と最後で「おまじない」ルーチンを呼び出す必要があります。他方、SWINT機能を使った場合、割り込みルーチンは全て今まで通りのままで良く、唯1つSWINT割り込みルーチンをRTOS実装者が気を付けて書けば良いだけになります。(SWINT割り込みルーチンのみ、スタックを小細工し、戻っていくタスクが、割り込み発生時のタスクとは別の高優先度タスクにリターンしていくようにすることが出来るようになっていれば良い。)ただし、デメリットもあって、タスク切り替え時間が少し長くなることです。このことは、RL78のFreeRTOSでのことですが、以下のスレッドに書いたことがあります。(なお、以下の「おまじない」というのは上に書いた「おまじない」とは意味が異なります。すみません。)RL78 FreeRTOS APIを特別なおまじない記述無しで割り込みルーチンから呼び出せるようにしてみた(CC-RL/GNURL78)japan.renesasrulz.com/cafe_rene/f/forum21/5845/rl78-freertos-api-cc-rl-gnurl78