2011年8月16日 星期二

WinAVR SRAM常數與FLASH區常數的定義與讀取

定義SRAM區常量與變數的定義基本相同,在前面加上const
const uint_t s_val = 0x01;

Falsh
區的整數變數的定義如下: 資料類型  變數名 PROGMEM = 
由於FLASH的變數是不能改變的,因此最好在定義時加上const,其實FLASH區變數應叫FALSH區常量可能更合適, 我喜歡叫FLASH常數.
const uint8_t f_val PROGMEM  = 0x01;
應用(讀取)方面,SRAM常量直接使用即可: : PORTB = s_val;
對於Flash區的常數的讀取,avr_libc<avr/pgmspace.h>提供的讀取函數:
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
#define pgm_read_dword(address_short) pgm_read_dword_near(address_short
定義及讀取測試代碼如下:

//M48,
晶振11.0692M
//
程式運行後,PD0PD7交替閃亮
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

const uint8_t s_val = 0x01; //
定義SRAM區常量
const uint8_t f_val PROGMEM  = 0x80; //
定義FLASH區常量

int main(void)
{
  int i;
  DDRD = 0xFF;
  while(1)
  {
    PORTD = s_val; 
    for (i=0; i<50; i++)
  _delay_ms(10);
    PORTD = pgm_read_byte(&f_val);
    for (i=0; i<50; i++)
  _delay_ms(10);
  }
}

從編譯後得到的LSS檔可知,SRAM區常量,也是存放在FALSE,但程式啟動代碼段複製到SRAM,在程式運行時讀取的是SRAM中的資料
FLASH區常量,自始至終一直都在FLASH區中,由於AVR單片機是屬於哈佛結構,定義在FLASH中的常量也就不能用SRAM中的常量資料的
讀取方法了,也就是說FLASH中的常量與SRAM中的常量,在讀取時應當注意之間的區別.

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。