データ用に固定フラッシュセクションを予約するにはどうすればよいですか?

ベルギ

データの大きなチャンクをフラッシュメモリに保存する必要があります。フラッシュメモリでは、頻繁に読み取られ、SPMを使用して時々書き換えられます。ポインタを使用__flashpgm_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]

編集
0

コメントを追加

0

関連記事

分類Dev

データセクション(RAM)のメモリ範囲を予約し、そのメモリを使用する同じアプリケーションのヒープ/スタックを防ぐにはどうすればよいですか?

分類Dev

ファウンドリのフュージョンシートからデータセットを作成するにはどうすればよいですか?

分類Dev

フラッター-固定サイズのグラデーションをクリップして、可能であればアニメーション化するにはどうすればよいですか?

分類Dev

制約されたジェネリック型を持つアクションデリゲートをC#のタイプセーフコレクションに格納するにはどうすればよいですか?

分類Dev

データをプッシュするときにLaravelセッションの永続性を提供するにはどうすればよいですか?

分類Dev

予約フォームのシート値をデクリメント/デクリメントするにはどうすればよいですか?

分類Dev

UITableViewのセクションにデータを入力するにはどうすればよいですか

分類Dev

k-medoidsアルゴリズム(PAMなど)を使用してクラスタリングソリューションを別のデータセットに適用するにはどうすればよいですか?

分類Dev

テーブルビューセクション間の間隔を作成するにはどうすればよいですか?(すべてのセクションのヘッダーとフッターはすでにカスタムビューです)

分類Dev

Mojoliciousで、セッションのデータを表示するにはどうすればよいですか?

分類Dev

PHPでデータセッションを使用するにはどうすればよいですか?

分類Dev

Pythonデータクラスをハッシュ可能にするにはどうすればよいですか?

分類Dev

コンテナのセクションにフラッターでテキストを追加するにはどうすればよいですか?

分類Dev

フラスコセッションをクリアするにはどうすればよいですか?

分類Dev

動的に成長するデータセットにブラッシングを適用するにはどうすればよいですか?

分類Dev

アプリケーション用にポートを予約するにはどうすればよいですか?

分類Dev

SwiftUI Pickerオプションの下にセクションフッターテキストを追加するにはどうすればよいですか?

分類Dev

SwiftUI Pickerオプションの下にセクションフッターテキストを追加するにはどうすればよいですか?

分類Dev

ImageMagickで画像にグラデーションを適用するにはどうすればよいですか?

分類Dev

Web APIからテーブルビューセクションに特定のデータを取得するにはどうすればよいですか?

分類Dev

アイコンにグラデーションフィルターを適用するにはどうすればよいですか?

分類Dev

上下のグラデーションシャドウで画像をフラッターで表示するにはどうすればよいですか?

分類Dev

シードスタックでデフォルトのアセンブラを指定するにはどうすればよいですか?

分類Dev

DAXを使用して、2つのテーブルの予約ディメンションと到着日のディメンションでフィルタリングするにはどうすればよいですか?

分類Dev

MobaXtermセッションを別のコンピューターにエクスポートするにはどうすればよいですか?

分類Dev

Facebookユーザーのログインセッションをフラッターアプリに保存するにはどうすればよいですか?

分類Dev

「システムの予約済みパーティションを更新できませんでした」というWindowsUpdateのエラーメッセージを修正するにはどうすればよいですか?

分類Dev

フラッターの丸いコンテナに線形グラデーションを追加するにはどうすればよいですか?

分類Dev

about セクションをヘッダーの下に、フッターの上に配置するにはどうすればよいですか?

Related 関連記事

  1. 1

    データセクション(RAM)のメモリ範囲を予約し、そのメモリを使用する同じアプリケーションのヒープ/スタックを防ぐにはどうすればよいですか?

  2. 2

    ファウンドリのフュージョンシートからデータセットを作成するにはどうすればよいですか?

  3. 3

    フラッター-固定サイズのグラデーションをクリップして、可能であればアニメーション化するにはどうすればよいですか?

  4. 4

    制約されたジェネリック型を持つアクションデリゲートをC#のタイプセーフコレクションに格納するにはどうすればよいですか?

  5. 5

    データをプッシュするときにLaravelセッションの永続性を提供するにはどうすればよいですか?

  6. 6

    予約フォームのシート値をデクリメント/デクリメントするにはどうすればよいですか?

  7. 7

    UITableViewのセクションにデータを入力するにはどうすればよいですか

  8. 8

    k-medoidsアルゴリズム(PAMなど)を使用してクラスタリングソリューションを別のデータセットに適用するにはどうすればよいですか?

  9. 9

    テーブルビューセクション間の間隔を作成するにはどうすればよいですか?(すべてのセクションのヘッダーとフッターはすでにカスタムビューです)

  10. 10

    Mojoliciousで、セッションのデータを表示するにはどうすればよいですか?

  11. 11

    PHPでデータセッションを使用するにはどうすればよいですか?

  12. 12

    Pythonデータクラスをハッシュ可能にするにはどうすればよいですか?

  13. 13

    コンテナのセクションにフラッターでテキストを追加するにはどうすればよいですか?

  14. 14

    フラスコセッションをクリアするにはどうすればよいですか?

  15. 15

    動的に成長するデータセットにブラッシングを適用するにはどうすればよいですか?

  16. 16

    アプリケーション用にポートを予約するにはどうすればよいですか?

  17. 17

    SwiftUI Pickerオプションの下にセクションフッターテキストを追加するにはどうすればよいですか?

  18. 18

    SwiftUI Pickerオプションの下にセクションフッターテキストを追加するにはどうすればよいですか?

  19. 19

    ImageMagickで画像にグラデーションを適用するにはどうすればよいですか?

  20. 20

    Web APIからテーブルビューセクションに特定のデータを取得するにはどうすればよいですか?

  21. 21

    アイコンにグラデーションフィルターを適用するにはどうすればよいですか?

  22. 22

    上下のグラデーションシャドウで画像をフラッターで表示するにはどうすればよいですか?

  23. 23

    シードスタックでデフォルトのアセンブラを指定するにはどうすればよいですか?

  24. 24

    DAXを使用して、2つのテーブルの予約ディメンションと到着日のディメンションでフィルタリングするにはどうすればよいですか?

  25. 25

    MobaXtermセッションを別のコンピューターにエクスポートするにはどうすればよいですか?

  26. 26

    Facebookユーザーのログインセッションをフラッターアプリに保存するにはどうすればよいですか?

  27. 27

    「システムの予約済みパーティションを更新できませんでした」というWindowsUpdateのエラーメッセージを修正するにはどうすればよいですか?

  28. 28

    フラッターの丸いコンテナに線形グラデーションを追加するにはどうすればよいですか?

  29. 29

    about セクションをヘッダーの下に、フッターの上に配置するにはどうすればよいですか?

ホットタグ

アーカイブ