こんばんわ。うさぎと申します。
「RL78/G14 ユーザーズマニュアル ハードウェア編 Rev. 3.30 2016.08」の
P1021に「現在処理中の割り込みと同レベルか,より低い優先順位の割り込み要求が発生した場合には,多重割り込みとして受け付けられません。ただしレベル0 の割り込み中にIE フラグをセット(1)した場合には,レベル0の他の割り込みも許可されます。」とあります。
しかしP1022の「表21 - 11 割り込み処理中に多重割り込み可能な割り込み要求の関係」を見ると、
レベル0以外の場合でも、同じレベルの多重割り込みは受け付けられるように読み取れます。
たとえば、処理中の割り込みレベルがISP0=1,ISP1=0 の時、IE=1でPRが10のときに○(多重割り込み可能)となっています。
また、P1019の「図21 - 11 割り込み要求受け付け処理アルゴリズム」では、
フローチャート中の割り込み要求受付の条件式が(××PR1,××PR0)≦ (ISP1,ISP0)となっていて、同じレベルなら多重割り込みが受け付けられるように思えます。
表や式の解釈が間違っているのでしょうか…。
実機で試してみればよいのでしょうが、どなたかご存知の方がいらっしゃれば、ご教示頂きたく、よろしくお願いいたします。
usagiさん、EB68さん、こんにちは。NoMaYと申します。EB68さんのリプライをもとにマニュアルの表の画面コピーに赤入れしてみました。以下のようになっていなければならない、ということですね。RL78/G14 ユーザーズマニュアル ハードウェア編www.renesas.com/jp/ja/search/keyword-search.html#q=r01uh0186r01uh0186jj0330-rl78g14.pdf
うさぎさん
RL78の元になった78K0マイコンのUMからコピペした感じですね。
78K0の場合、同じ優先順位の割り込みなら、受け付ける仕様でした。(ISP=PRレジスタの値)そのため同じ優先順位の割り込みなら後から発生した方が優先されてしまうという不条理な仕様だったので78K0R(≒RL78)で修正されたようです。
このあたりの表現は78K0RとRL78で同じなので、当時78K0RのUMを作った人があまり気にしていなかったのかなと思います。
↓ 78K0はレベルが高と低の2つしかなかったので、こーゆー仕様です。
RL78/G14のUMの表現にも揺らぎ(誤記)があって、混乱の元ですね。
「21. 4 割り込み処理動作」の章では受け付けた割り込みの優先順位指定フラグの内容をISP1, ISP0フラグへ転送します。
「21.3.5 プログラム・ステータス・ワード(PSW)」の章では受け付けた割り込みの優先順位指定フラグ・レジスタの内容が00 以外は,“-1” された値がISP0,ISP1 フラグに転送されます。
PS「-1された」という表現も初めて見た人には良くわからないと思いますけども、((ISP1×2+ISP0)-1)%2=ISP0((ISP1×2+ISP0)-1)/2=ISP1という事のようです。(余計に混乱しちゃうかも^^;)
NoMaYさん 割り込み中でもISPを書き換えてISP1=1、ISP0=1にすることもできるので、必ずしもISP1=1、ISP0=1が割り込み未受付け状態とは限りません。 ふつうはやりませんけどね^^;フラッシュセルフ中の割り込みもISPが変化しないので、割り込み中もISP1=1、ISP0=1のままだし。
PSどうUMを修正するか楽しみですね。でも大変だよ。RL78シリーズ全部のUMの修正なんて>_<
usagiさん,NoMaYさん,Kirinさん。
手元にあったTESSERAさんのRL78/G14 StickとCS+CCの環境で,INTP0~INTP4を使って確認してみました。
プロジェクトと画面キャプチャ結果をPDFにしたものを参考用に添付しておきます。
いろいろ設定するのが面倒なので,INTP0~INTP4割り込みは全てソフトで割り込み要求をセット(PIFxを1に)しています。
>割り込み中でもISPを書き換えてISP1=1、ISP0=1にすることもできるので…
それをやると,多重割り込みの仕組みそのものが崩れてしまうので,絶対にやるべきではないですね。
>どうUMを修正するか楽しみですね
いまさら,これだけでの修正はしないと思いますよ。
G14多重割り込み.zip
チョコさん おっしゃるとおりで。 ISPをいじる時はスタックの中身と色々整合をとらないといけないので、ふつうはやりませんよね。