「__secend」の疑問

RAMを初期化するのに必要な「__secend」で疑問点が有ります。  H8/3052のマニュアルには、次のように書かれています。 __sectop の先頭アドレスを参照します。 __secend の末尾+1 アドレスを参照します。  セクション・サイズがゼロなら __sectop = _secend では無くて、 __sectop
  •  改行がうまく行かないので、もう一度書きます。 

     RAMを初期化するのに必要な「__secend」で疑問点が有ります。

     H8/3052のマニュアルには、次のように書かれています。

    __sectop <セクション名>の先頭アドレスを参照します。

    __secend <セクション名>の末尾+1 アドレスを参照します。

     セクション・サイズがゼロなら __sectop = _secend では無くて、 __sectop < _secend と読めます。

     すると次のfor文の判断条件が違って来ませんか。

    static void clearblock(void *b_top, void *b_end)

    { // 未初期化データセクションをゼロで初期化します

    char *p;

    for( p=b_top; p<(char *)b_end; p++)

    *p = 0;

    }

  • __sectop、__secendの実際のアドレスは次のようになったかと思います。

    例:

    B_EE (初期値無し変数セクション:適当です)
    開始アドレス0xF900

    の条件下で

    1.セクションサイズ1(任意の大きさ)
      __sectop -> 0xFE90、__sectop -> 0xFE91

    2.セクションサイズ0
       __sectop -> 0xFE90、__sectop -> 0xFE90

    下の図はセクションサイズが0だった場合のスクリーンショットです。

  •  Kon Nozomu さん、リカルドです。

     自分でも試してみましたが、セクション・サイズがゼロなら __sectop = _secend のようです。

     では「<セクション名>の末尾+1 アドレスを参照します。」とは、どう言う意味なんでしょう。

     RX621でも同じように書かれていますね。

  • Kon Nozomuさん、リカルドさん、エビスクラウンです。

    確かにご指摘の通り、サイズがゼロのセクションでは「<セクション名>の末尾+1 アドレスを参照します。」とはなりません。

    が、あまり難しく考える必要もないかと思っています。

    もともとセクションの初期化用に使用する特殊演算子ですから、ご指摘のような仕様になっているだけです。

    マニュアルに付け加えるならば、「ただし、サイズがゼロのセクションでは__secendは<セクション名>の末尾アドレスを参照します。」

    と考えて頂きたく。。。

  • エビスクラウンさん

    「__secend("<セクション名>")は __sectop("<セクション名>")に セクションサイズを加算したものです」の方がすっきりしませんか?

  • すとさん

    ご指摘の通りです。その説明が正しく、一番すっきりした言い方ですね!

    担当者に伝えておきます。

  •  皆さんこんにちは

     RX621では__secsize が追加されたので、これでカウントするのが確実でしょう。

     H8/3052には無かったキーワードです。