+スターの公開アカウントをフォローして、エキサイティングなコンテンツを見逃さないようにしましょう
著者 | 黃強
WeChat パブリック アカウント | 埋め込み列
当社の製品は、お客様のニーズやご提案に基づいて随時アップグレード(バグの最適化、機能の追加・削除)が行われますが、その際にソフトウェアのバージョンが非常に重要になります。
開発プロジェクトでは通常、ソフトウェアにバージョン情報を追加しますか? 最近、何人かの友人が関連した問題について話し合っているようですので、簡単に共有したいと思います。
実際にはさまざまな方法がありますが、基本的にはソフトウェアのバージョン情報を指定された記憶領域(フラッシュ)に書き込むことであり、ここでは代表的な方法の 1 つを紹介します。
実装
この記事では、一般的かつ最も基本的なヒントを共有します。それは、 Keil MDK環境では、ソフトウェア コードを通じて指定されたアドレスをフラッシュに直接マッピングして保存するというものです。
内容: ソフトウェア バージョン、コンパイル日、コンパイル時間。コードは次のとおりです。
#define VERINFO_ADDR_BASE (0x0800FF00) //存放FLASH的地址
const char Software_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Software: 1.0.0";
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
みんなはこのコードを理解できますか?
原理は非常に単純で、フラッシュ アドレスを書き込む同様の方法は他にもあります (ここではまだ説明しません)。
これには、以下で説明するいくつかの重要な知識ポイントが含まれています。
__attribute__ 構文
「属性」と訳されるアトリビュートは、C 言語のキーワードであり、構文形式は次のとおりです。
__attribute__ ((attribute-list))
__attribute__ は、関数属性 (Function Attribute)、変数属性 (Variable Attribute)、および型属性 (Type Attribute) を設定できます。
この部分を深く理解する必要はありません。使い方を知っていれば十分です。より深く理解するために、オンラインには多くの学習リソースがあります。
C言語の標準定義
コード内:
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
日付と時刻を表す __DATE__ と __TIME__ が表示されます。
実際、これら 2 つは C 言語の特別な標準定義です。
__DATE__ : 「2021 年 4 月 13 日」などのコンパイル時の日付文字列
__TIME__ : コンパイル時の時刻文字列 (「20:00:00」など)
これら 2 つに加えて、実際には次のような同様の標準定義が多数あります。
__FILE__ : コンパイル中のファイルのファイル名
__LINE__ : コンパイル中のファイルの行番号
__STDC__ : ファイルが標準 C プログラムかどうかを判断します
この部分については、私の記事「C 言語におけるいくつかの特別な標準の定義と使用法」を参照してください。
[常にコンパイルする]バージョンファイル
Keil MDK では、デフォルトでソース ファイルは変更されず、コンパイルは 1 回だけ行われます。
したがって、バージョン、日付、時刻を正しくコンパイルするには、常にコンパイルを設定する必要があります。
次のように設定します。
ファームウェアのサイズ
生成された Hex ファイルは、未使用の Falsh を 0x00 で埋めます。次に例を示します。
0x00 を埋めた後、この 16 進数は比較的大きくなるため、16 進数ファームウェアのサイズを削減するには 2 つの方法があります。
1. FLASH を格納するアドレスは適切な位置に設定する必要がありますが、コードサイズが 1K しかない場合、アドレスをオフセットするのは 50K だけであり、オフセットが大きすぎます。
#define VERINFO_ADDR_BASE (0x0800FF00) //存放FLASH的地址
2. インターネット上には、「ROM サイズ」を変更する方法もあります。
しばらくすると、0x00 が実際に削除されたことがわかりました。
実はこの 2 つの方法にはリスクがあり、コード量が増え続けると問題が発生する可能性があります。したがって、皆さんは主に Flash アドレスを設定する必要があります。
実際には、Hex ファイル形式に関する記事がここにあります: 「bin、hex、axf、elf ファイル形式を簡単に理解する」の記事を読むことをお勧めします。
------------ 終了 ------------
公式アカウントをフォローして「グループを追加」と返信するとルールに従って技術交流グループに参加でき、「1024」と返信するとさらにコンテンツが閲覧できます。
さらに共有を表示するには、「元のテキストを読む」をクリックしてください。