データの大きなチャンクをフラッシュメモリに保存する必要があります。フラッシュメモリでは、頻繁に読み取られ、SPMを使用して時々書き換えられます。ポインタを使用__flash
しpgm_read_byte
てアクセスする方法、省略しない方法const
(書き込みにもかかわらず)、ループ内の配列に実際にアクセスして完全に最適化されないようにする方法(インライン化後)はすでに理解しています。、しかし、配列を宣言する方法がよくわかりません。
const uint8_t persistent_data[1024] __attribute__(( aligned(SPM_PAGESIZE),
section("mycustomdata") )) = {};
初期化したくないことを除いて、問題なく動作します。デバイス(Arduino ATmega328P)をプログラミングするときは、このセクションを保持して、アプリケーションによって以前に書き込まれたデータを保持するようにします。上記はゼロで初期化します。私の16進ファイルには、プログラマーがデータを上書きするために喜んで使用するゼロが含まれています。
__flash
代わりに修飾子を使用する__attribute__(( section("…") ))
と、配列を別の場所に配置し、配置する場所を制御できないことを除いて、ここではほぼ同じです。__flash
初期化を使用および省略した場合でも、これは実行されます(ただし、「初期化されていない変数 'persistent_data'がプログラムメモリ領域に配置されます[-Wuninitialized]」という警告が表示されます)。
今、私はイニシャライザーを省略しようとしています:
const uint8_t persistent_data[1024] __attribute__(( aligned(SPM_PAGESIZE),
section("mycustomdata") ));
予想外の結果が得られます。.lss出力からのセクションデータは
Idx Name Size VMA LMA File off Algn
…
1 mycustomdata 00000480 00800480 000055e2 00005700 2**7
CONTENTS, ALLOC, LOAD, DATA
2 .text 00005280 00000000 00000000 000000d4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
これにより、すべての初期化ゼロがロードメモリアドレス55E2の16進ファイルに(変数がpersistent_data
指すのではなく)配置されますが、仮想メモリアドレス(変数が指す)は0480を参照します-テキストセクションのコードの途中!!
(またconst
、、、const
およびとイニシャライザーを省略しようとしましたが、どちらもイニシャライザーのみを省略するのと同じ効果がありました)。
私は途方に暮れています。extern
多分使う必要がありますか?(そうしようとすると、「persistent_dataへの未定義の参照」エラーが発生しました)。リンカースクリプトを使用する必要がありますか?
persistent_data
他のデータで使用されていないプログラムメモリの場所を参照し、コンパイラがその場所の初期化データを16進ファイルで出力しないようにするにはどうすればよいですか?
実際には2つのバージョンのhexファイルが必要であることに気付いていないようです。1つはフラッシュを初期化する新しい(またはさらに悪いことに、再利用され、ランダムなフラッシュコンテンツを含む)チップへの「新規」インストールに適しています。解釈される可能性のある任意のデータがそこにないことを確認するセクションと、ユーザーによって既に変更されたデータを保持するために、このセクションを見逃す事前にプログラムされたチップを更新するために使用されるセクション。したがって、とにかくこのセクションを初期化するバージョンが必要になります。
これを実現する最も簡単な方法は、最初の例のように、データを初期化してコードの「ネイキッドチップ」バージョンを構築し、objcopyを使用してオブジェクトファイルからこの初期化されたセクションを削除するだけで「更新」バージョンを生成します(使用する場合) GNUツールチェーン)。-R
このツールのオプションを参照してください。
また、このデータセクションが固定アドレスにあることを確認してください。コード内で何かを変更するたびにデータセクションが移動することは望ましくありません。
再プログラミングの手間をかけるよりも、可能な場合はEEPROMを使用してみたほうがいいです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加