MPLAB C30 컴파일러에서는 __attribute__ 키워드를 이용하여 컴파일러로 하여금 특정 변수 또는 함수에 대해 특정 속성을 갖도록 할 수 있다.
변수 선언 속성 매크로
C30 컴파일러에서 특정 메모리를 특정 메모리 영역에 할당하도록 선언 할 수 있다.
(참고로 인자 N은 2의 제곱 값으로만 입력되어야 한다.)
#define _XBSS(N) __attribute__((space(xmemory), aligned(N)))
#define _XDATA(N) __attribute__((space(xmemory), aligned(N)))
#define _YBSS(N) __attribute__((space(ymemory), aligned(N)))
#define _YDATA(N) __attribute__((space(ymemory), aligned(N)))
#define _EEDATA(N) __attribute__((space(eedata), aligned(N)))
#define _PERSISTENT __attribute__((persistent))
#define _NEAR __attribute__((near))
변수 선언 속성 매크로 사용 예
정수형 데이터 16개를 갖는 배열을 32바이트 어드레스에 정렬되도록 하기 위한 선언
int _XBSS(32) xbuf[16];
특별한 정렬 옵션 없이 EEPROM에 정수형 배열을 할당하기 위한 선언
int _EEDATA(2) table[] = { 0, 1, 2, 3, 4 };
디바이스가 리셋 될 때 변수의 값을 초기화 하지 않고 기존 값을 유지하기 위한 선언
int _PERSISTENT var1, var2;
특정 어드레스에 변수를 할당하기 위한 선언
int __attribute__((address(0x900))) buf1[128];
함수 선언 속성
C30 컴파일러에서는 함수에서도 특정 어드레스에 할당 할 수 있다.
void __attribute__((address(0x2000))) func() { }
프로그램 메모리에 상수 할당 옵션 (space(psv))
프로그램 메모리의 특정 영역에 상수를 할당하기 위해서는 다음과 같이 space(psv)속성을 사용하여 상수 값들이 PSV영역에 할당되도록 선언해야 한다.
const unsigned __attribute__((space(psv), address(0x2000))) table[5] = {1, 2, 3, 4, 5};
데이터 메모리에 상수 할당 옵션
데이터 메모리의 특정 영역에 상수를 할당하기 위해서는 다음과 같이 space(data) 속성을 사용하여 상수 값들이 데이터 메모리 영역에 할당되도록 선언해야 한다.
const unsigned __attribute__((space(data), address(0x900))) table[5] = {1, 2, 3, 4, 5};
EEPROM에 데이터 할당
EEPROM 메모리에 변수를 할당하기 위해서 __EEDATA(align) 매크로를 이용할 수 있다.
unsigned int _EEDATA(2) table[4] = {0x1234, 0x5678, 0x9ABC, 0xDEF0};
여기서 정렬(alignment) 옵션으로 사용한 _EEDATA(2)는 워드(2바이트) 단위로 데이터를 쓰고 지우기를 하겠다는 의미이다.
unsigned int _EEDATA(32) table[16] = { 0 };
_EEDATA(32)이기 때문에 데이터를 쓰고 지우는 단위가 32바이트이다. 이는 정수형 데이터 16개(총 32바이트)를 한번에 쓰고, 지울 수 있다.
'PIC' 카테고리의 다른 글
C30 컴파일러의 I/O 포트 액세스 (0) | 2011.04.04 |
---|---|
C30 컴파일러 속성(Attribute) 사용 예제 (0) | 2011.04.01 |
MPLAB IDE - C30 컴파일러 사용 [PIC24FJ128GA010] (0) | 2011.03.31 |