プログラムをダウンロードする時 EEPROM を初期化する
テクニカル・ノート 32477
アーキテクチャ:
STM8
コンポーネント:
compiler
更新日:
2018/08/13 0:56
はじめに
本テクニカルノートでは、IAR Embedded Workbench for STM8とEEPROMの初期化について説明します。以下のように代入を行った場合、
__eeprom char array[] = {0X1C,0X1F,0X9F,0XFF};
以下のコンパイラエラーメッセージが表示されます。
Error[Ta004]: __eeprom variable must be __no_init
これは、コンパイル時においてEEPROMの変数に値を代入できないことを意味します。
解決方法
static char型として変数を宣言します。この変数を、「my_eeprom」というEEPROMセクションに配置します。
char array[]@ "my_eeprom" = {0X1C,0X1F,0X9F,0XFF};
そして、リンカの設定ファイルを以下のように変更します。
place in Eeprom { rw section .eeprom.noinit,
rw section my_eeprom };
注意事項
配列変数に__eepromメモリ属性を指定することはできません。つまり、配列からの読み出しは問題ありませんが、配列への代入については、コンパイラによって通常の__nearメモリ書き込みとして出力されます(この場合、一般に__eeprom属性は何の効力も持ちません)。ユーザはEEPROMへの書き込み用に作成した独自のルーチンを呼び出さなければなりません。また、C言語の通常の代入が行われていないことを確認するようにしてください。
背景
__eeprom変数は、__no_initでなければなりません。
その理由は、初期化された__eeprom変数を使用する場合、通常の変数とは異なる初期化ルーチンを必要とするためです。
EEPROMメモリは永続的なストレージであると仮定されているため、自動初期化の必要はありません。
EEPROMメモリは、アプリケーション(またはシステム)が初期化する必要があります。
しかしながら、将来リリースされるIAR Embedded Workbench for STM8では、初期化された__eeprom変数をサポートすることを予定しています。
全ての製品名は、それぞれの所有者の商標または登録商標です。