改行がうまく行かないので、もう一度書きます。
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には無かったキーワードです。