4: 2009-08-04 (火) 03:46:21 takaboo | 5: 2009-08-04 (火) 12:58:25 takaboo | ||
---|---|---|---|
Line 210: | Line 210: | ||
マイコンに内蔵されたEEPROMの読み書きを行う。操作及び状況の確認はシリアル通信にて行う。 | マイコンに内蔵されたEEPROMの読み書きを行う。操作及び状況の確認はシリアル通信にて行う。 | ||
- | 内蔵EEPROM関連のサブルーチン等 avr/eeprom.h に定義される。 | + | 内蔵EEPROM関連のサブルーチン等は avr/eeprom.h に定義される。 |
#include <avr/eeprom.h> // EEPROM関連 | #include <avr/eeprom.h> // EEPROM関連 | ||
+ | EEPROMへのアクセスを行う際はそれ以前の内部的なEEPROMへの処理が完了している必要があるため eeprom_busy_wait 関数にて処理完了を待ち、さらにアクセス中は他の処理に影響が及ぶとの事で割り込み等は禁止にする必要がある。 | ||
+ | cli (); | ||
+ | eeprom_busy_wait (); | ||
+ | eeprom_write_byte ((uint8_t *)i, c); | ||
+ | sei (); | ||
+ | **smpl11(CONSTMEM).c [#gc65cc96] | ||
+ | avr-libcで提供される特殊なメモリアクセス方法の紹介。 | ||
+ | |||
+ | AVRはハーバードアーキテクチャーであるため、プログラムコード領域(フラッシュROM)とワーク領域(SRAM)が分離されている。つまり連続・不連続に関わらず同一のメモリマップ上には配置されないため、一般的なC言語の記述ではフラッシュROM上に置かれたデータ類へのアクセスが出来ない。~ | ||
+ | 例えば | ||
+ | const char hoge[] = "TEST DATA\n"; | ||
+ | といった宣言を行うとフラッシュROM内にhogeのデータが確保され、プログラムの実行が開始される際にhogeをSRAM上にコピーしたものがアクセス対象となる。つまり、ある程度サイズに余裕のあるフラッシュROM上に不変の固定データを置いたつもりでも、それと同等のサイズのデータがSRAM上に別途確保されるので、非常に小さいSRAMを圧迫する結果となる。~ | ||
+ | avr-libcにはSRAMにコピーせずにフラッシュROM上に確保したデータへアクセスするために、宣言時と利用時に特殊な命令が用意されている。 | ||
+ | const char gyao[27000] PROGMEM = {0,0,0,0,0,0,}; | ||
+ | **smpl12(BUZZER).c [#e8471f5c] | ||
+ | **smpl13(SPI_MOTOR).c [#j47c03d0] | ||
+ | **smpl14(RCSERVO).c [#l9555243] |