フラッシュメモリは、どのシステムにとっても重要なコンポーネントであり、フラッシュメモリに効率的にアクセスできることが重要です。このドキュメントでは、現在使用されている2つの主要なタイプのフラッシュ、NANDフラッシュとNORフラッシュの違い、フラッシュの消去方法とアクセス方法について説明します。次に、両方のタイプのフラッシュに使用できるMQX flashxドライバーを見ていきます。
NOR および NAND フラッシュへのアクセス
フラッシュメモリには主に2つのタイプがあり、1つ目は「フラッシュ」、2つ目は「nand」です。インターフェイスの観点からは、主な違いはデータへのアクセス方法です。Nor Flashは、ランダムデバイスと同様に完全なアドレスおよびデータバスであり、NANDデバイスは、コマンド、アドレス、およびデータを多重化して同じバスを共有するioバスを使用しています。これは、デバイスで接続性を必要とするピンの数を大幅に減らしますが、ソフトウェアとデータアクセスの観点からは、2つのタイプのメモリの間にはさらに大きな違いがあります。
基本的には、各ビットは異なる技術知識を使用して保存されています。nor フラッシュ では、メモリ領域はブロックと呼ばれる等しいサイズの単位で分割されます。今日のテクノロジーにおける各ブロックのサイズは、約32kバイトから128kバイトの範囲ですが、これは完全にデバイスの選択に依存しており、これは何年にもわたって変更されます。Norフラッシュの内部回路により、RAMまたはEEPROMに格納されたバイトをアドレス指定できるのと同じ方法で、デバイスの各バイトを個別にアドレス指定できるため、フルバスがNorフラッシュとともに使用されます。ただし、これはバイトの読み取りまたは個々のバイトのプログラミングにのみ適用され、 レーシングスキミングはブロックレベルで行う必要があるため、レース状態のロックを解除するにはブロック全体が影響を受ける必要があります。
しかし、ナンドフラッシュは、ストレージ密度を高めるために意図的に異なる方法で設計されています。それも、ブロックの等しいサイズに分割されたメモリ領域を持っていますが、これらのブロックのそれぞれは、ページと呼ばれるsamll領域にさらに分割され、ページは通常2kバイトのサイズで、ブロックは、多くの場合、64ページを持っているので、128キロバイト、リードデータに、あなたはまだブロックレベルで作業している、 ただし、Flashの一部を読み取り、プログラムしたい場合は、ページごとに行います。
ただし、一度に 1 ページずつデータを格納または取得することは、実際には多くのアプリケーションにとって利点です。あなたはしばしば電話、曲、アプリなどの大きなファイルを扱っているので。したがって、これはより効率的になります。当時の主な欠点は、バイトに個別にアクセスできないことで、nandフラッシュを使用して、実行したいプログラムコードをその場で保存できないことです。CPUは単一の命令を読み取る必要があるため、CPUがこの配置を特にサポートできる場合を除きます。あなたが知っているかもしれないnandフラッシュが、最初のダウンサイジングは、ページを読むときにビットエラーを取得することですが、これは音楽ファイルの障害ではないかもしれませんが、明らかにデータファイルやあなたのイメージのバックアップには受け入れられません。
これを補うために、フラッシュの各ページには2つのセクションがあり、1つ目はデータが保存される場所、2つ目はエラー修正コードが保存される小さなセクションです。エラーを検出して修正するために使用される差分アルゴリズムがありますが、理想は、ECCに格納されたデータがアルゴリズムによってデータのエラーを検出し、場合によってはデータフィールドのエラーを修正するために使用されます。検出できる破損の量には制限がありますが、シングルビットエラーなどの小さなエラーは 、アプリケーションがそれを認識することなく定期的に処理されます。
nandの2番目の問題は、障害のあるビットを開発する傾向があることに注意する必要があります。そして、これによりブロック全体が不良と宣言され、実際には新しいフラッシュデバイスでも不良なブロックの割合がわずかになり、時間の経過とともにアクティブなブロックの一部が不良になる可能性があります。フラッシュデバイスの回路は、消去またはプログラムサイクル中にブロックの不良を検出し、不良ブロックマネージャーがこれを追跡します。不良ブロックは自動的に再マッピングされますが、これは背後で発生するため、ソフトウェアのインターフェースは違いを知りません。
したがって、 nor と nand の主な違いを要約すると、 nand を使用してページ内のデータにアクセスする必要があることがわかりました これは bytes 単位の randly アクセスです。また、Flashから消去、書き込み、読み取りを行うためのアクセス時間にも違いがあります。フラッシュデバイスが書き込みのために上昇し続ける容量は安定した速度ですが、現在、最大のNANDデバイスの容量は最大NORデバイスの10倍です。また、問題がアプリケーションコードに影響を与えないという点では、nandフラッシュの不良ブロック管理とエラー訂正コードが発生し、障害率に対処するために、ピン数が多くなり、インターフェイスのタイプが与えられていないため、容量が異なるため、より高価になります。そして、メモリの使用方法によっては、選択したデバイスの予想されるライフサイクルについて考慮したかもしれません。
フラッシュの消去
ドライバに入る前に、フラッシュで作業するときに出くわすかもしれない唯一の他のことは、消去プロセスに関係しています、メモリの消去された部分はすべてゼロであるが、実際には消去されたフラッシュメモリは、すべてのビットが高状態に設定されていることを読み戻すことを期待することができます。 そのため、消去されたバイトをFFとして読み戻しました。
アドレス位置にデータを書き込むとき、対応するビットはゼロである必要があり、論理ゼロとしてプログラムされ、効率的にこの場所を最初に消去して書き換えることができます。最初にブロックを消去せずに、同じブロック内の別のアドレスに書き込むこともできますが、ほとんどの場合、1バイトではなく大きなデータのチャンクを書き込むため、通常は、データの書き込み先としてデータを追跡するのは面倒なことではありません。また、ブロックについては、書き込みを行うかどうかの前に消去する必要があります。これはドライバーが行うことであり、アプリケーションは非常にシンプルに保たれますが、適切なコマンドに関連するオーバーヘッドが常に一貫しているとは限らないことに注意してください。消去と書き換えのサイクルに耐えられることもあれば、耐えられないこともあります。
Flashxドライバーが存在する場所
MQXには2つのドライバーグループがあり、最初のグループにはioドライバーが含まれ、ioサブシステムを経由します。また、ブロックモードドライバーとバイトモードドライバーが含まれています。2番目のグループは、ADCや軽量GPIOドライバーなどの低レベルドライバーのセットです。フラッシュドライバーは大きなチャンクのデータの書き込みと読み取りをサポートしているため、ブロックモードドライバーとして分類されます。MQXのSDK版では、ioサブシステムは制限されています。ただし、フラッシュドライバーはまだブロックモードドライバーと見なされます。
これまで見てきた他のドライバーの構造と同様に、フラッシュドライバーには上位層と下位層のコンポーネントがあります。また、Dirver の使用を開始する前に、Dirver をインストールする必要があります。設定ファイルを使用してフラッシュを選択した場合、MQXは起動時にフラッシュドライバーを自動的にインストールします。そして、install functionが呼び出されると、上位のinstall関数には下位の設定情報へのポインタが渡されます。
インストールされた関数は、IOサブシステムにコールバック関数を登録し、関連付けが行われると、アプリケーションコードはフラッシュデバイスにアクセスする通常の高レベルの呼び出しを使用できます。したがって、たとえば、フラッシュドライバーを使用する前に、フラッシュドライバーを開く必要があります。これにより、以前に開いていない場合、フラッシュチップの内部構造が設定されます。そして、このデバイスのアドレスを取得します。その後、高レベルのコマンドを使用して、フラッシュからの読み取りやフラッシュへの書き込みを好きなように行うことができます。
Flash へのアクセス
ただし、ドライバーの使用を進める前に、フラッシュ自体にアクセスする方法を確認すると役立ちます。フラッシュは一連のブロックに編成されており、それらを異なるグループに構造化できます。kinetisプロセッサを使用し、flashxドライバを使用して内部フラッシュにアクセスしている場合は、少なくともコード・ベース用のスペースを確保し、データ用の分散領域を確保する必要があります。
また、フラッシュを同じサイズのバンクに設定したり、フラッシュを整理したい場合でも、これらの領域の境界をフラッシュのブロック境界に落ちる必要があることを念頭に置いてください。これらの各領域は、実質的にフラッシュのパーティションであり、flashxドライバは、各パーティションがファイルであるか、またはファイルに使用するフラッシュの領域がアドレスの観点から連続していないかもしれないことをmonentで見ています、しかし、アプリケーションの観点からは、それは連続的なメモリ空間と見なすことができます。
Flash へのアクセス
Mqxは、ファイルにインデックスをマイタンし、ファイルから読み取ると、読み取りはインデックスから開始されます。同様に、ファイルに書き込むと、インデックスポイントから書き込みを開始し、インデックスコマンドが、より多くのデータを書き込むにつれて開始されます。あなたのアプリケーションコードは、 fseek 関数を使用して位置インデックスを調整でき、 starndard C ライブラリのフォーマットされた io セクションにある fseek 関数に精通しているかもしれません。mqx の fseek 関数も同じように使用されます。これを使用して、ファイルの先頭からのオフセット、このファイルの末尾からのオフセット、またはインデックスの現在位置からのいずれかの方向のオフセットを提供するようにインデックスを設定できます。
データ構造
flashxドライバーがどのように機能するかを理解するには、使用するいくつかの主要なデータ構造を使用して農業を行う必要があります。最初にカバーするのは、フラッシュがどのように構成されているかを定義するブロック情報構造です。一部のフラッシュには、内部に異なるサイズのブロックがあるか、アドレス指定の間にギャップがある可能性があります。これがフラッシュインフラストラクチャを定義する方法です。
デバイスは配列またはブロック情報構造体で表され、フラッシュが連続したアドレス指定を行い、すべてのブロックが等しいサイズであるセクションごとに1つのセクションが作成されます。ここではターミナルが少し混乱しており、フラッシュの各セクション内にはいくつかのブロックがあり、mqxはセクターを消去可能な最小単位と見なすため、データ構造はセクターと呼ばれます。
この構造体の次の要素は、このセクションの開始アドレスであり、その後にサイズ セクションが続きます。最後の要素は、特別なフラグ用に予約されており、現在は使用されていません。
フラッシュには多数のファイルを含めることができ、ファイルブロック構造はファイルを定義するために使用され、ファイルの名前、ファイルの開始アドレス、およびファイルの終了アドレスを持つことができます。
そして、init構造体と呼ばれる3番目のデータ構造体は、すべてを結び付けるために使用されます、これにはブロック情報構造体の配列へのポインタ、およびファイルブロック構造体の配列へのポインタが含まれ、これにはフラッシュデバイスのベースアドレスと、フラッシュアドレスベース全体にアクセスするために使用されるいくつかの追加要素も含まれています。
フラッシュドライバAPI
したがって、ドライバーコードを見る前に要約すると、フラッシュへのアクセスは非常に簡単です。ファイルは fopen 関数 で開く必要があり、flashx ドライバー では、通常、フラグは使用されません。ファイルから読み込むには、格納するデータの読み込みと、読み込むバイト数を指定します。また、フラッシュを書き込むには、書き込むデータへのポインタと、転送するバイト数を提供する必要があります。そして、最後に使用した関数は ioctl 関数で、さまざまなパラメーターを取得または変更するために使用できます。ioctl 関数を使用する場合は、使用するコマンドを指定します。そして、パラメータとして値を要求した場合に結果が配置される場所へのポイント。では、どのようなソースコードを作成できますか。ベースアドレスやセクタ数など、さまざまな値を取得できます。バッファのフラッシュ、バッファリング機能の制御、フラッシュチップの全部または一部の消去、セクタキャッシングの制御、または書き込み保護の制御を行うことができます。
このドキュメントは、「MQX RTOSアプリケーション開発の要点」トレーニング・コースの第19回です。詳しくはvedioをご覧ください
Hi CSMG:
OK、最初に確認させていただき、後で更新します。
よろしくお願いします。
Daniel
Hi danielchen@fsl,
FlexNVM用のFlashXドライバーを使用しようとしています。元の投稿はこちらです。
https://community.nxp.com/message/993610?commentID=993610&et=watches.email.thread#comment-993610
これを調べていただけますか?
PS:ビデオリンクが壊れています。ここは。
よろしくお願いいたします
サルマ
このドキュメントは、フラッシュ構造について理解を深めてくれます、ありがとう