2016-05-19 2 views
3

私は、ARM V4.8.3用のGCCを使用している埋め込みCプロジェクトで作業しています。私が達成しようとしているのは、MCUのFLASH(ROM)メモリに構造体を配置することです。私のprevious post以来、定数(const)として認定された各オブジェクト識別子は.rodataセクションに配置されると考えていましたが、私の場合(likerスクリプトによると).textが入れ子になっています。領域。GCCは、定数ポインタと定数を異なるメモリ領域に入れます。

私は一定のポインタだった私のオブジェクト定義の一つにチェックので、私はそう考える傾向がある:

const char * const project_stringInvalidCharacter = "Invalid Character! \n"; 

定数としての資格あればポインタがFLASHの中に位置していたが。

しかし、int型の定数オブジェクト(const uint_8 myObj;)を定義すると、そのアドレスがRAMまたは.bss領域に属する数値であることがわかりました。

つまり、constはポインタとして機能しますが、整数型では機能しませんでした。作品では、以前のポストから推論して、すなわち識別子をFLASH(ROM)に「置く」ことが、私が期待することを意味します。

+0

私は報告された警告は一切誓っていません。 – Hairi

+0

@Olaf私はEclipse IDEを使用しています。環境設定 - > C/C++ - >コード解析の2つの警告ボックスのみが現在 '書式文字列の脆弱性'と '括弧で返される'チェックされていません。割り当てられていない読み取り専用データオブジェクトと関係があるという警告は表示されません。またはそのようなもの。 Eclipse IDE 3.8.1に精通している方は、有効にしてもらえますか? – Hairi

+1

Hmm ..私はちょうど確認した、あなたは本当に正しい(どのように恥ずかしい;-)グローバル変数の。申し訳ありませんが、私はこのメッセージを一度(長い時間前に)覚えていましたが、これは初期化されることが保証されていないため、非静的変数の場合のみです。何とか意味をなさない。だから、質問者は[mcve]を提供する必要があります。 (しかし、自動ローカルは、とにかく 'rodata 'に配置されない可能性が高い)。解決策は、静的な 'const'変数を常に初期化することです。 – Olaf

答えて

5

あなたの定数に値を割り当てないので、おそらくコンパイラは混乱します。 試してみてください。

const uint_8 myValue=42; 

、それが配置される場所を参照。

+1

これは私が壁に頭を打つ瞬間です。 – Hairi

関連する問題