組み込みテクノロジーの IAP、私がそれを持っているので、上司はもう私のコードについて心配する必要はありません。(真ん中)

前回の記事では、IAP の動作原理と、IAP の 3 つの重要な機能であるデータ インタラクション、データ ストレージ、プログラム ジャンプについて学びました。

これら 3 つの重要な機能を「 IAP の 3 軸」と呼びます。次に、これら 3 つの軸がどのような詳細を実現し、どのように実装するかを見てみましょう。画像の説明を追加してください

1. データ相互作用

データ インタラクションの機能は、IAP の中核機能の 1 つです。この機能の機能は、デバイスが外部とのデータ インタラクションを完了できるようにすることです。データ インタラクションの主な目的は、新しいバージョンのプログラム ファームウェアを取得することです
ここに画像の説明を挿入
通常、IAP データのやり取りには 2 つの方法があります。1 つはファイルを読み取る方法もう 1 つはデータを送受信する方法です
ここに画像の説明を挿入
ファイルの読み取り方法とは、デバイスがインターフェースを介して記憶媒体を読み取り、更新するプログラムファームウェアを取得することを意味します。このようにして、デバイスは USB インターフェイスを使用して U ディスクを読み取り、カード リーダー インターフェイスを使用して SD カードを読み取ることができます。

ファイルを読み取る方法では、デバイスがファイル システム機能(FatFs ファイル システムなど) を備えている必要があり、この方法では、新しいバージョンのプログラム ファームウェアが特定の名前の記憶媒体に保存され、記憶媒体がファイルがデバイスのストレージ インターフェイスに挿入されている場合、特定の名前のファイルが検出された場合にのみ、デバイスは特定の名前のファイルの内容に従ってプログラム ファームウェアを更新します。この方法では、メモリが 1 つだけ必要です (他のデバイスを接続する必要はありません)。小規模なバッチでファームウェアをオフラインで更新するのに非常に適しています。
ここに画像の説明を挿入
データの送受信方法とは、機器が通信インターフェースを介して外部と通信し、更新するプログラムファームウェアを取得することを意味します。このように、デバイスは 485 インターフェイスまたはイーサネット ポートを使用して、外部とデータを送受信できます。

たとえば、デバイスはネットワーク ポートを使用してクラウド サーバーからデータを受信します。サーバーは新しいバージョンのファームウェア プログラム ファイルを n 個の小さなデータ パケットに分割し、デバイスに送信します。データを受信した後、デバイスはデータを保存します。 1 つずつ更新して完全なプログラム ファームウェアを取得し、更新操作を実行します。この方法は、無人アップグレードに適しており、大規模なオンライン ファームウェア アップデートにも非常に適しています。ここに画像の説明を挿入
IAP データ通信ではデータを送受信する方が一般的ですが、この方法については次に詳しく説明しますデータ伝送の本質は通信であり、その通信機能は基盤となるハードウェアと通信プロトコルによって実現されます。基盤となるハードウェアは、485 インターフェイス、イーサネット ポート、Bluetooth インターフェイスなどです。通信ではデータを一定のフォーマットに従ってパッケージ化して送信・解析する必要があるため、通信プロトコルを策定する必要があります データ送受信のポイントは、通信プロトコルの策定と通信プロトコルの機能の実現です。
通信プロトコルを実装するには、共通プロトコルを使用する方法とカスタム プロトコルを使用する方法の 2 つがあります。

IAPに適した一般的な通信プロトコルには、XModem、YModem などがあり、これらのプロトコルは比較的単純で、小さなファイルの転送に非常に適しています。共通プロトコルを使用する最大の利点は、特定のホスト コンピュータ ソフトウェアを設計する必要がなく、既製のソフトウェア ツールを直接使用してファイルを転送できることです。たとえば、ソフトウェア ツール SecureCRTPortable は XModem、YModem などをサポートできます。プロトコル。
ここに画像の説明を挿入
カスタム通信プロトコルとは、企業がニーズに応じて一連の専用通信プロトコルをカスタマイズすることを意味しますこのようにカスタマイズされたプロトコルは、デバイスに非常に適しており、デバイスのファームウェアプログラムソフトウェアの開発により容易であるが、この方法は、上位コンピュータのファイル送信機能を実現する上位コンピュータエンジニアを必要とする。

共通通信プロトコルが使用されるかカスタム通信プロトコルが使用されるかに関係なく、通信プロトコルには少なくとも次の通信命令が含まれている必要があります。
1. アップグレード要求命令。アップグレードの前に、アップグレード要求を送信して、双方のデバイスを準備完了状態にします。
2. データパケット要求命令。これは、アップグレード プロセス中にファームウェア データを 1 つずつ送受信することを指します。
3. 要求コマンドを終了します。これは、ファームウェアデータが送信された後、デバイスにデータが送信されたことが通知され、デバイスは通知を受信した後、自らファームウェアを更新することを意味します。
ここに画像の説明を挿入

2. データストレージ

データ ストレージは IAP の中核機能の 1 つです。この機能の主な機能は、デバイスの内部メモリにアクセス (読み取り/書き込み) することです。データ ストレージの主な目的は、アプリ プログラムのファームウェアの新しいバージョンをデバイスに書き込むことです。デバイスの内部メモリの指定された場所をデータ形式で保存します
ここに画像の説明を挿入
データストレージの基本動作はメモリの読み書きですが、現在、組み込み機器の内部メモリはNOR-FLASH(オンチップフラッシュ)が一般的であり、機器上で動作するファームウェアはNOR-FLASHに格納されています。 NOR-FLASH 命令 (XIP) を直接実行できますオンチップ FLAHS はファームウェアだけでなく他のデータも保存できます。したがって、データストレージの基本動作は FLASH の読み出しと書き込みであり、FLASH の読み出しと書き込みには次の特徴があります:
1. 最小消去単位はセクタ。
2. データを書き込む前に 1 つのセクターを消去する必要があります。セクタ消去後、データはオール 1 になります。
3. データ書き込み操作では、データは 1 から 0 にのみ書き込めますが、0 から 1 には書き込めません。セクタ データがすでに書き込まれている場合は、データを消去してから書き込む必要があります。
以下の図は、STM32 シリーズ MCU の内部 FLASH データ テーブルです: ここに画像の説明を挿入
FLASH 間隔の計画は、データ ストレージの重要な部分です。通常、FLASH次の間隔に分割されます:
1. ブートローダー インターバルには、ブートローダー プログラム ファームウェアが保存されます。
2. アプリセクションには、アプリプログラムを実行するために必要なファームウェアが保存されます。
3. アプリバックアップセクションには、受信したアプリプログラムファームウェアの最新バージョンが保存されます。
4. 更新フラグビット間隔には、更新フラグビットが格納されます。ここに画像の説明を挿入
このうち、ブートローダー間隔、アプリ間隔、更新フラグ間隔が必要であり、アプリのバックアップ間隔は実際の状況に応じて選択できます。

データ ストレージの重要な機能は、最新のアプリ プログラムのファームウェアをデータの形式でアプリ領域に書き込むことです。アプリ領域にデータを書き込むには、次の 2 つの方法があります:
1. シングル パケット書き込み。デバイスはデータ パケットを受信した後、データ パケットをアプリ領域メモリに書き込みます。つまり、データ パケットを受信するたびにデータ パケットをアプリ領域に書き込みます。通常、各パケットのデータ長は固定されています (最後のパケットは 0XFF で埋めることができます)。このとき、データを書き込む前にセクターが消去されていることを確認するために、セクターに含まれるパケットの数を計算する必要があります。
2. パッケージ全体を書き込みます。デバイスがデータパケットを受信できるようになると、まずデータのパケットをアプリのバックアップ領域メモリに書き込み、すべてのパケットを受信した後、アプリのバックアップ領域のデータをセクタ単位でアプリ間隔に書き込みます。
ここに画像の説明を挿入
アプリデータの書き込み後、FLASH更新フラグ領域にフラグを書き込む必要があり、ブートローダーはフラグを読み取ってアプリデータを更新するかどうかを判断できるため、アップグレード完了フラグを完了してアップグレードを確認する必要がありますフラグ。安定性を高めるため、フラグはマジックナンバーの列をフラグとして使用しており、例えばフラグのビット間隔の最初の5データは更新が必要な場合は0x13、0x14、0x17、0x55、0x20、更新が必要な場合は最初の5データとなります。フラグビット区間のデータは更新する必要はなく、0xFF、0xFF、0xFF、0xFF、0xFFです。

3. ジャンプ

IAP 機能には通常 2 つのプロジェクト コードが必要です。最初のプロジェクト コードはブートローダーと呼ばれるコードの製品機能操作部分を実行しません。2 番目のプロジェクト コードは実際の製品機能を実行します。コードのこの部分はアプリと呼ばれます。ブートローダー コードとアプリ コードの両方が同時にフラッシュに書き込まれ、チップの電源がオンになると、最初にブートローダー コードが実行を開始し、次にジャンプしてアプリ コードが実行されます。

プログラム ジャンプは IAP の中核機能であり、プログラム ジャンプの主な目的は、ブートローダー プログラムから APP プログラムにジャンプし、APP プログラムを実行させることです。プログラム ジャンプは IAP で最も理解が難しい部分でもあり、段階的に明らかにする必要があります。
ここに画像の説明を挿入

3.1 プロジェクトの開始

各リセットの後、MCU は書き込まれたファームウェア (MCU 内部フラッシュに書き込まれた) を再起動できます。この現象を実現する基本的な動作ロジックには、主に 2 つの理由があります。 1.
MCUがリセットされた後、PC レジスタは強制的に初期値(通常は 0X00000000) に設定されるため、MCU はアドレス 0X00000000 から最初の命令を取得します。
2. プロジェクトをコンパイルするとき、通常はプロジェクト構成コードのダウンロードの開始位置(通常は 0X00000000)、コンパイルされたファームウェアには開始位置の情報が含まれます。FLASH プログラミング ツールを使用してファームウェアをダウンロードすると、プログラミング ソフトウェアは、開始位置情報に従って、指定された開始位置から FLASH へのファームウェアのプログラミングを開始します。
MCU の内部 FLASH にダウンロードされたコードの開始位置は 0X00000000 であり、MCU がリセットされた後の PC の値も 0X00000000 であるため、各リセット後に MCU の内部 FLASH ファームウェアの書き込みを最初から開始できますMCU リセット後の起動プロセスは次のとおりです。
画像の説明を追加してください
STM32 シリーズ MCU を例に挙げると、リセット後、まずアドレス 0x00000000 から値を取り出して MSP に強制入力(MSP 初期化)し、次にアドレス 0x00000004 から値を取り出し、強制的に PC に挿入し、アドレス 0x00000004 からデータに対応するアドレスを取得して実行します。
ここに画像の説明を挿入
STM32 シリーズ MCU のメイン フラッシュ メモリは、STM32 の内蔵フラッシュ (チップ フラッシュ) です。通常の動作モードでは、メインの内蔵フラッシュ アドレス 0x08000000 を 0x00000000 にマップします。そのため、コード開始後は、 0x08000000から始まります。下図はSTM32シリーズのプロジェクトでコンパイルしたHEXファイルで、FLASHアドレス0x08000000(プログラムの開始位置)からHEXファイルがプログラムされることがわかります。
ここに画像の説明を挿入

3.2 ジャンプ原理

リセット後、PC 値は 0X00000000 に割り当てられ、フラッシュ内のファームウェアの開始位置は 0X00000000 となるため、各リセット後にファームウェアを確実に再起動できます。次に、ファームウェア コード B を 0X0000Y000 にダウンロードし、PC 値を 0X0000Y000 に設定すると、ファームウェア コード B にジャンプしますか?
ここに画像の説明を挿入
この考えは完全に正しいです。実際、これが IAP ジャンプの動作原理です。ブートローダー ファームウェア コードは 0X00000000 にダウンロードされ、アプリ ファームウェア コードは 0X0000Y000 にダウンロードされます。リセット後、最初にブートローダーが実行され、次にブートローダー コードが実行されます。 PCを実行して0X0000Y000に設定し、アプリのファームウェアコードにジャンプします。

IAP ジャンプの動作原理には 2 つの重要なポイントがあります。
1. プロジェクト コードのダウンロード開始位置を変更します。
2. リセット プロセスをシミュレートし、PC 値を強制的に変更してジャンプ アクションを完了します。

プロジェクトコードの開始位置の変更
通常、プロジェクトパラメータを設定することでプロジェクトコードのダウンロード開始位置を変更できます。STM32 シリーズ MCU を例として、KEIL 開発環境を使用します。プロジェクト設定をクリックし、IROM1 の初期値を 0x8020000 に変更します。このとき、プロジェクトはコード ダウンロードの初期位置を 0x8020000 に変更します (MCU は 0x08020000 を 0x00020000 にマップします)
ここに画像の説明を挿入
プロジェクトの IROM1 の初期値を構成した後、プロジェクトをコンパイルし、HEX ファイルを開くと、ダウンロードの初期場所が 0x0802000 であることがわかります。
ここに画像の説明を挿入
PC 値を変更してジャンプを完了します

では、ジャンプ アクションを完了するためのリセット プロセスをシミュレートするにはどうすればよいでしょうか? STM32 シリーズ MCU がリセットされた後、まずアドレス 0x00000000 から値を取り出して MSP に強制的に組み込み (MSP 初期化)、次にアドレス 0x00000004 から値を取り出して PC に強制的に組み込み、その後、対応するアドレスからフェッチして実行します。アドレス 0x00000004 のデータ。
したがって、シミュレートされたリセット プロセスは、最初に MSP の初期化を完了し、次に PC 値を強制的に書き込みます。シミュレートされたリセット プロセスのジャンプ コードは次のとおりです。コードから、プログラムはまずアドレス 0x00020004 の値を関数 Jump_to_application に変換します
ここに画像の説明を挿入
。 、その後、アドレス 0x00020000 に値が MSP に割り当てられ、最後に Jump_to_application 関数が実行されます。jump_to_application 関数の実行は、アドレス 0x00020004 の値に対応するコードにジャンプすることと同じです。
ここに画像の説明を挿入
プロジェクトを逆アセンブルし、実行命令の実行フローを分析すると、次の図に示すようにコードが逆アセンブルされます
ここに画像の説明を挿入
コア アセンブリ コードの分析は次のとおりです。

MOV      r0,#0x20000    ; 将立即数0x20000存入r0
LDM      r0,{
    
    r0,r4}		; 将地址0x20000中的数据存入r0,地址0x20004中的数据存入r4
BLX      r4			; 跳转至r4指向的地址,即地址0x20004中的数据指向的地址

アセンブリ内のジャンプ命令(分岐命令)を使用すると、プログラムの実行フローを変更したり、サブルーチンを呼び出したりすることができます。ARM アーキテクチャでは、プログラム フロー ジャンプを実現する方法が 2 つあります。
1. 分岐命令を使用する
。 2. ターゲット アドレス値をプログラム カウンタ PC に書き込む。
4G(32ビット系)のアドレス空間でのジャンプは、プログラムカウンタPCにジャンプアドレスを書き込むことで実現でき、分岐命令を使用することでジャンプ空間を制限します。ARMアーキテクチャにおけるジャンプ命令は以下のとおりです。 :
ここに画像の説明を挿入

3.3 サンプルを構築する

コードのダウンロード開始位置の変更と、ジャンプを完了するために PC 値を変更するシミュレーション リセット プロセスの 2 つの知識ポイントを組み合わせて、STM32 シリーズ MCU を例として IAP プロジェクトを構築します。このプロジェクトには、ブートローダーの 2 つのプロジェクトが含まれていますプロジェクトアプリプロジェクト

プロジェクト コードのダウンロード開始位置が設定されます: ブートローダー プロジェクトはデフォルト構成の 0x08000000 を使用し、アプリ プロジェクトの構成は 0x08020000 です。2 つのプロジェクトの構成は次のとおりです。

ここに画像の説明を挿入
ブートローダー プロジェクトで必要な関数を完了した後、 iap_jump_to_app 関数を呼び出して、アドレス 0x08020000 の値が指す場所にジャンプしてコードを実行します。

ここに画像の説明を挿入
ブートローダー プロジェクトとアプリ プロジェクトが完了した後、2 つのプロジェクトをコンパイルして MCU にダウンロードすると、MCU が最初にブートローダー ファームウェアを実行し、次にアプリ ファームウェアを実行して、IAP プロジェクトの構築が完了することがわかります。ファームウェアをダウンロードするときは、必ず [Erase Full Chip] オプションを削除してください。そうしないと、2 番目のファームウェアをダウンロードするときにフラッシュ全体が消去されるため、最初にダウンロードしたファームウェア (以前のファームウェア) も消去されます

ここに画像の説明を挿入

3.4 注意事項

前のセクションでは、単純な IAP プロジェクトを構築し、MSP と PC をブートローダーに設定し、MCU がアプリのファームウェアにジャンプしましたが、このジャンプ プロセスは実際にリセット プロセスをシミュレートしましたMCU にアプリ ファームウェアの実行を開始させます。通常、アプリ ファームウェアの前にスタートアップ コードが実行され、そのスタートアップ コードによって RAM などの周辺機器が初期化されます。

ただし、実際のリセットはハードウェアによって開始され、ハードウェアはすべての周辺機器をデフォルト設定に設定します。通常、すべての周辺機器はデフォルトでオフになり、GPIO は入力状態に設定されます。アプリのファームウェアはブート コードを実行しますが、すべての周辺機器はブートローダー ファームウェアに設定された状態を保存します。これらの周辺機器 (USART、ADC、TIMER など) がブートローダーで構成され有効になっている場合、アプリに影響します。この操作は異常な影響を与えるため、ブートローダーがジャンプを実行する前に、ブートローダーで使用されるすべての周辺機器をオフにする必要があります。
ここに画像の説明を挿入
ブートローダーがジャンプを実行する前にペリフェラルをオフにすることに加えて、MCU の割り込みベクトルを再マップする必要もあります

割り込みベクトルは、コンピュータ システムのハードウェアによって生成される割り込みエントリ アドレスを指します。中断とは、コンピュータプログラムの実行中に特別な要求が発生した場合、コンピュータが現在実行中のプログラムを停止し、これらの特別な要求を処理するプログラムにジャンプし、処理が終了した後、プログラムの中断された部分に戻って実行を継続することを意味します。完成しました。ここに画像の説明を挿入
ARMアーキテクチャプロセッサでは、割り込みベクタのサイズは4バイトであり、そこに格納されるのは割り込みルーチンサービスプログラムのエントリアドレスではなくジャンプ命令である。割り込みが発生すると、ハードウェアは対応する割り込みベクタでジャンプ コードを自動的に実行し、対応する割り込みサービス プログラムのエントリ アドレスにジャンプします。
割り込みベクトルは、割り込みサービスのエントリ アドレスを指定します。このエントリ アドレスはハードウェアによって決定されます。ブートローダ プロジェクトはデフォルト構成を使用し、割り込みベクトルはブートローダ プロジェクト コードと一致します。アプリ プロジェクトにジャンプした後、割り込みベクトルは変更されていないため、アプリ プロジェクトで割り込みが発生した場合、プログラムはこの時点でブートローダー プロジェクト コードにジャンプしますしたがって、アプリ プロジェクトの開始後に割り込みベクトルをリセットする必要があります。そうしないと、プログラムが異常に実行されます。

ペリフェラルと割り込みベクトルが適切に動作しない場合はどうなりますか? 次に反例を使用して、結果がどうなるかを確認します。
ブートローダー プロジェクトのコア コードは次のとおりです

ここに画像の説明を挿入
ブートローダーのコードを見ると、システムがティック タイマーを開始し、ティック タイマー割り込み関数で印刷情報が出力され、設定が完了した後、ジャンプ関数が実行されてアプリのファームウェアにジャンプすることがわかります。

アプリ プロジェクトのコア コードは次のとおりです

ここに画像の説明を挿入
アプリのコードを見ると、ティックタイマーがシステムによって有効化されており、ティックタイマー割り込み関数で印刷情報が出力されていることがわかります。設定が完了すると、 whlie(1) プロセスに入り、印刷情報を出力します。定期的に。
プロジェクトを実行した結果は次のようになります

ここに画像の説明を挿入
シリアル ポート情報に従って、アプリ コードの実行中にティック タイマーは割り込みを生成してブートローダー コードにジャンプし、ブートローダーコードでティック タイマー割り込み関数を実行します

4. まとめ

この記事では、IAP の 3 つの重要な機能、データ対話、データ ストレージ、プログラム ジャンプについて説明します。そして、簡単な IAP プロジェクトを構築し、IAP プロジェクトを設計する際の注意点を説明します。次の記事では、IAP 関数コードを完成させ、完成した IAP プロジェクトをビルドする方法を詳しく紹介します。
ここに画像の説明を挿入
作成は簡単ではありません。友達が「いいね」、転送、コメント、フォローしてくれることを願っています!
あなたの「いいね」、転送、コメント、注目が私の継続的な更新の原動力になります!
CSDN: https://blog.csdn.net/li_man_man_man
今日のヘッドライン: https://www.toutiao.com/article/7149576260891443724

おすすめ

転載: blog.csdn.net/li_man_man_man/article/details/128344319