幾つかの品種だけRX MCUs internal USB peripheral registersのbitfieldがunavailableなiodefine.hがありますが作成ミスではないでしょうか?

こんにちは。NoMaYです。

最近、以下のスレッドに関わったのですが、どうもiodefine.hの作成ミスがあったのではないかなぁと思われましたので、スレッドを立ててみることにしました。

iodefine.h で、IODEFINE_H_HISTORY キーワードについて
japan.renesasrulz.com/cafe_rene/f/forum5/8446/iodefine-h-iodefine_h_history

続く。

(すみません、上記スレッドの投稿主さんのhirakuni45さんにおかれましては、当方の投稿が終了するまで暫くお待ち頂ければ、と思います。あわてない、あわてない、との、一休さんの心持も良いかと思うのです。)

  • こんにちは。NoMaYです。

    関わったスレッドはGCCの場合の話でしたが、まずCC-RXの場合を調べることにしました。CS+のRX向け(CC-RX向け)のiodefine.hの原本がまとめられているフォルダをgrepしてみると、大まかに以下の3種類が見受けられました。

    (1) ビットフィールド定義が使えないもの - その1 - #ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれている
    (2) ビットフィールド定義が使えないもの - その2 - //にてビットフィールド定義がコメントアウトされている
    (3) ビットフィールド定義が使えるもの

    grepしてみた時の画面コピー:


    具体例:

    (1) ビットフィールド定義が使えないもの - その1 - #ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれている
    品種: RX66T(下記内容)、RX72T

    typedef struct st_usb {
        union {
            unsigned short WORD;
    #ifdef IODEFINE_H_HISTORY
            struct {
                unsigned short :5;
                unsigned short SCKE:1;
                unsigned short :3;
                unsigned short DCFM:1;
                unsigned short DRPD:1;
                unsigned short DPRPU:1;
                unsigned short :3;
                unsigned short USBE:1;
            } BIT;
    #endif
        } SYSCFG;
    …略…

     
    (2) ビットフィールド定義が使えないもの - その2 - //にてビットフィールド定義がコメントアウトされている
    品種: RX64M(下記内容)、RX71M、RX230、RX231、RX2Z4(謎の品種)

    struct st_usb0 {
        union {
            unsigned short WORD;
    //      struct {
    //          unsigned short :5;
    //          unsigned short SCKE:1;
    //          unsigned short :3;
    //          unsigned short DCFM:1;
    //          unsigned short DRPD:1;
    //          unsigned short DPRPU:1;
    //          unsigned short :3;
    //          unsigned short USBE:1;
    //      } BIT;
        } SYSCFG;
    …略…

     
    (3) ビットフィールド定義が使えるもの
    品種: RX62N(下記内容)、左記と上記の(1)と(2)を除くUSB内蔵品

    struct st_usb0 {
        union {
            unsigned short WORD;
            struct {
                unsigned short :5;
                unsigned short SCKE:1;
                unsigned short :3;
                unsigned short DCFM:1;
                unsigned short DRPD:1;
                unsigned short DPRPU:1;
                unsigned short :3;
                unsigned short USBE:1;
            } BIT;
        } SYSCFG;
    …略…

     
    続く。

  • こんにちは。NoMaYです。

    ビットフィールド定義が使えない品種中で一番古いのはRX64Mだと思います。他方、RX64Mの前後の品種としてはRX63N及びRX65Nになると思いますが、どちらもビットフィールド定義が使えるようになっています。

    ハードウェアマニュアルの画面コピーは以下の通りですが、RX64Mのiodefine.hが前後の品種と異なっている合理的な理由らしきものは見当たらないです。ただ、RX64Mには2種類のUSB IPが内蔵されていて、片方はRX63N(直系の前世代版USB IP)及びRX65N(同一品のUSB IP)とも同一系統なのですが、もう片方は分家の新世代バージョンみたいなもののようでした。そして、こちらの分家の方に関しては、ビットフィールド定義を無効とした合理的な理由があると思いました。以下の画面コピーに赤文字で記入したように、読むと不定値が読めます、書く場合“0”としてください、と記載されている未使用ビットを含んでいるレジスタがゴロゴロしていまして、そのようなレジスタに対しては以下によりビットフィールドによる書き換えは不可ですので、あえて出来ないようにした、というのであれば(異論もあると思いますけれども)合理的な理由だと私には思えました。(それが理由かどうかは、あくまで私個人の推測、です。)

    理由:

    ● C言語でのビットフィールド書き換えでは対象のビットフィールド以外のビットは読み出し値を書き戻す処理であるけれども
    ⇒ 読むと不定値が読めます、書く場合“0”としてください
    ⇒ 不定値が読めるなら“1”が読める可能性もある
    ⇒ その読み出した“1”を書き戻す可能性もある
    ⇒ でも“1”を書くことは禁止されている
    ⇒ C言語でのビットフィールド書き換えは出来ない

    異論:

    (1) ビットフィールド書き換えは出来なくてもビットフィールド読み出しは可能なのだから合理性など無いのでは?
    ⇒ この種のことで自分や身内が犠牲者になっているかどうかで意見は変わるのではないかなぁ、、、という気がするのです

    (2) 分家の新世代バージョンみたいなものとはいえ本家バージョンの流用設計の筈だからドキュメントの間違いでは?
    ⇒ それはそれ、これはこれ、、、としか言いようがないかなぁ、という気がするのです

    (3) 分家の新世代バージョンのみビットフィールド定義を無効とするだけで良かったのでは?(本家バージョンを変える思考が全く理解不能!)
    ⇒ 後日、推測(というか妄想かも?)してみます

    続く。

    以下、ドキュメントの画面コピーです。

    RX64Mグループ ユーザーズマニュアル ハードウェア編
    Rev.1.10 2016.10
    www.renesas.com/jp/ja/document/mah/rx64m-group-users-manual-hardware-rev110#page=1747


    RX63Nグループ、RX631グループ ユーザーズマニュアル ハードウェア編
    Rev.1.80 2014.04
    www.renesas.com/jp/ja/document/mah/rx63n-group-rx631-group-users-manual-hardware-rev180#page=1247


    RX65Nグループ、RX651グループ ユーザーズマニュアル ハードウェア編
    Rev.2.30 2019.06
    www.renesas.com/jp/ja/document/mah/rx65n-group-rx651-group-users-manualhardware-rev230#page=1519


    (参) 分家の新世代バージョンみたいなUSB IPの方

    RX64Mグループ ユーザーズマニュアル ハードウェア編
    Rev.1.10 2016.10
    www.renesas.com/jp/ja/document/mah/rx64m-group-users-manual-hardware-rev110#page=1855

    www.renesas.com/jp/ja/document/mah/rx64m-group-users-manual-hardware-rev110#page=1857

     

  • こんにちは。NoMaYです。

    ざっくりとですが、RX64Mのドキュメントにて、本家バージョンのUSB IPの概要と分家の新世代バージョンのUSB IPの概要を比較してみました。

    以下、ドキュメントの画面コピーです。(上側が本家バージョンのUSB IP、下側が分家バージョンのUSB IP。)










     

  • こんにちは。NoMaYです。

    ざっくりとですが、RX64Mのiodefine.h内にて、本家バージョンのUSB IPのレジスタ定義と分家の新世代バージョンのUSB IPのレジスタ定義を比較してみました。(コメントアウトされてしまっている)ビットフィールド定義も含めて、基本的には本家バージョンのUSB IPのレジスタ割り付けを継承した分家バージョンのレジスタ割り付けとなっていることが汲み取れます。

    以下、ファイル比較ツールの画面コピーです。(左側が本家バージョンのUSB IP、右側が分家バージョンのUSB IP。) なお、全てでは無くて、途中や後半は省略しています。









     

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁ってみると、以下の画面コピーの2014/06/10 13:51のタイムスタンプのRX64Mのiodefine.hがあったのですが、これも、RX64Mの2種類のUSB IPの両方ともビットフィール定義が使えないように//でコメントアウトされてしまっていました。何にせよ、今、分家の新世代バージョンのみビットフィールド定義を無効とするだけで良かったのでは?(本家バージョンを変える思考が全く理解不能!)と思ってみても、もう10年近く前にそれでリリースされてしまっていた、ということでした。

    続く。

    以下、Windowsエクスプローラの画面コピーです。



    [追記]

    なお、iodefine.hのファイルのタイムスタンプは目安だと思って下さい。たぶん、CS+の開発者さんの事情(UNIXを使ったかどうか、UNIXを使うとコピー時にタイムスタンプが維持されなかったと思います)が関係すると思います。

    [追記2]

    余談ですが、この頃は、まだ IODEFINE_H_HISTORY という#defineは存在していませんでしたね。(grepしてもヒットしなかったです。)

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁っていて、ちょっと面白いことに気付きました。以下の画面コピーの2015/12/09 10:51のタイムスタンプのRX65Nのiodefine.hがあったのですが、これは、今とは違って、ビットフィール定義が使えないように//でコメントアウトされてしまっていました。むむむ、、、

    続く。

    以下、Windowsエクスプローラと秀丸の画面コピーです。



     

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁っていて、もうひとつ面白いことに気付きました。以下の画面コピーの2014/03/24 17:24のタイムスタンプのRX71Mのiodefine.hがあったのですが、こちらは、今とは違って、分家の新世代バージョンのみビットフィールド定義が使えないように//でコメントアウトされていました。つまり、本家バージョンの方ではビットフィールド定義が使えるようになっていました。むむむ、、、

    続く。

    以下、Windowsエクスプローラと秀丸の画面コピーです。



     

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁っていて、また面白いことに気付きました。以下の画面コピーの2016/08/05 15:08のタイムスタンプのRX65Nのiodefine.hがあったのですが、こちらはビットフィールド定義が#ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれているものでした。

    更に、以下の画面コピーの2019/07/30 10:17のタイムスタンプのRX65Nのiodefine.hでは、今と同じくビットフィールド定義が使えるようになっているものでした。

    ということで、RX65Nのiodefine.hには以下の3パターンが全て存在していた、ということなのでした。むむむ、、、

    (1) ビットフィールド定義が使えないもの - その1 - #ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれている
    (2) ビットフィールド定義が使えないもの - その2 - //にてビットフィールド定義がコメントアウトされている
    (3) ビットフィールド定義が使えるもの

    続く。

    以下、Windowsエクスプローラと秀丸の画面コピーです。






     

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁っていて、またひとつ面白いことに気付きました。RX66TやRX72Tのiodefine.hがCS+に追加された頃は、RX65Nのiodefine.hはビットフィールド定義が#ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれているものでした。(その後、しばらくして、RX65Nのiodefine.hはビットフィールド定義が使えるようになった。)

    以前に調べて知ったのですが、今現在、ビットフィールド定義が#ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれている品種は、以下のとおり、RX66TとRX72Tの2品種です。たぶん、これらがそうなっているのは、上に書いた理由だろうと推測するに至りました。(もちろん、なぜ今もそのままなのだろうか?というのは、それはそれで別途あります。)


    (1) ビットフィールド定義が使えないもの - その1 - #ifdef IODEFINE_H_HISTORY~#endifの条件コンパイルで除かれている
    品種: RX66T(下記内容)、RX72T


    続く。

    以下、Windowsエクスプローラの画面コピーです。



     

  • こんにちは。NoMaYです。

    私のパソコンのハードディスクを漁っていて、あとひとつ確認したいと思ったのは、RX231のiodefine.hがCS+に追加されたのは、どういう頃だったのかというものです。調べてみると、その頃は、RX65Nが出る前で、RX64MもRX71Mも、2種類のUSB IPの両方ともビットフィール定義が使えないように//でコメントアウトされていて、その2つが新規iodefine.hの代表格といった頃のようでした。(なお、RX64Mは最初から両方とも//でコメントアウトされていたのでしたが、RX71Mは最初は分家の新世代バージョンのみ//でコメントアウトされていたものが両方とも//でコメントアウトされるようになっていました。)

    以前に調べて知ったのですが、今現在、//にてビットフィールド定義がコメントアウトされている品種は以下のとおりなのですが、RX231とRX230がそうなっているのは、上に書いた理由だろうと推測するに至りました。(もちろん、なぜ今もそのままなのだろうか?というのは、それはそれで別途あります。)


    (2) ビットフィールド定義が使えないもの - その2 - //にてビットフィールド定義がコメントアウトされている
    品種: RX64M(下記内容)、RX71M、RX230、RX231、RX2Z4(謎の品種)


    続く。

    以下、Windowsエクスプローラの画面コピーです。