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바이트)를 한번에 쓰고, 지울 수 있다.


 

 

+ Recent posts