C30 컴파일러에서는 I/O포트의 이름을 이용하여 포트 전체를 엑세스 할 수 있으며, 구조체를 이용하여 I/O 포트의 특정 비트도 엑세스할 수 있다. 이들 I/O 포트 변수들은 헤더 파일에서 각각 정의되어 있으며, 링커가 각각의 메모리 영역을 맵핑해 주고 있다. 디바이스 헤더파일 중 P24FJ128GA010.h 파일을 열어서 보면 PORTD의 각 비트들에 대해 구조체로 선언한 것을 볼 수 있다.


 링커스크립트 파일인 P24FJ128GA010.gld 파일을 열어 보면 다음과 같이 I/O포트 변수들의 어드레스를 선언한 것을 볼 수 있다. 이들 어드레스는 데이터 시트의 PORTD 어드레스와 동일한 값을 가지고 있다. 따라서 이들 I/O포트 변수를 이용하여 실제 I/O포트의 입출력을 제어 할 수 있다.



소스코드

#include <p24fj128ga010.h> 
#include <stdio.h>

int main(void) 

    TRISD = 0x0000; 
    PORTDbits.RD0 = 1; 
    
    while(1); 
}


결과

C 소스 코드

#include <stdio.h> 

// 프로그램 메모리 영역에 상수 위치 시키기 
const unsigned __attribute__ ((space(psv), address(0x2000))) 
    table[10] = {0,1,2,3,4,5,6,7,8,9};

// 데이터 메모리 영역에 변수 위치 시키기 
int __attribute__ ((address(0x900))) x = 5; 

// 프로그램 메모리 영역에 함수 위치 시키기 
int __attribute__ ((address(0x2100))) square(int a);

int main(void) 

    int i, y;

    y = square(x); 
    printf("square = %d\n", y);

    for(i=0;i<10;i++) 
    { 
        printf("table[%d] = %d\n", i, table[i]); 
    } 
    while(1); 


// square 함수 정의 
int square(int a) 

    return (a * a); 
}


결과
Watch창의 Address 필드에 P라고 되어있는 부분은 프로그램 메모리 영역이라는 표시이다.

'PIC' 카테고리의 다른 글

C30 컴파일러의 I/O 포트 액세스  (0) 2011.04.04
C30 컴파일러 속성(Attribute)  (1) 2011.04.01
MPLAB IDE - C30 컴파일러 사용 [PIC24FJ128GA010]  (0) 2011.03.31

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


 

 

MPLAB IDE 버전 : 8.63
(최신 버전은 Microchip사 홈페이지에서 다운로드)

1. MPLAB IDE 실행

2. Device 선택
2.1. Menu –> Configure –> Select Device 클릭
2.2. Select Device창에서 Device을 “PIC24FJ128GA010” 선택
2.3. OK버튼 클릭
 


3. 프로젝트 생성

3.1. Menu –> Project –> New 클릭
3.2. New Project창에서 Project Name과 Project Directory 입력
3.3. OK버튼 클릭


4. C30 컴파일러 선택
4.1. Menu –> Project –> Select Language Toolsuite 클릭
4.2. Select Language Toolsuite창에서 Microchip C30 Toolsuite 선택
4.3. OK버튼 클릭


5. 디바이스 링커 스크립트 파일 추가
5.1. Menu –> View –> Project 클릭
5.2. Project viewer에서 Linker Scripter 폴더에서 마우스 오른쪽 버튼 클릭해서 Add Files 클릭


5.3. p24fj128ga010.gld 파일 선택 후 열기버튼 클릭
링커 스크립트 파일 경로 –> C:\Program Files (x86)\Microchip\MPLAB C30\support\gld 
 


6. C 소스 코드 생성 및 프로젝트에 추가
6.1. Menu –> File –> New 클릭 (ctrl + n)
6.2. Menu –> File –> Save As 클릭
6.3. 파일 이름 입력하고 저장버튼 클릭

6.4. Project viewer에서 Source Files 폴더에서 마우스 오른쪽 버튼 클릭해서 Add Files 클릭
 

6.5. 프로젝트에 추가시킬 소스 파일 선택 후 열기버튼 클릭


7. C 코드 입력 

#include <stdio.h>

int g_value;

int main(void)

{

g_value = 99;

printf("g_value : %d\n", g_value);


while(1);

}


8. MPLAB LINK 30의 Heap size 입력
8.1. Menu –> Project –> Build Option –> Project 클릭 
8.2. Build Options For Project 창에서 MPLAB LINK 30 탭 선택
8.3. Heap size : 256 입력


9. Build 하기
9.1. Menu –> Project –> Build All (ctrl + F10)


10. MPLAB SIM 설정
10.1. Menu –> Debugger –> Select Tool –> MPLAB SIM 선택
10.2. Menu –> Debugger –> Settings 클릭
10.3. Simulator Settings 창에서 Uart1 IO 탭 선택
10.4. Enable Uart1 IO, Rewind Input, Windows 선택



11. MPLAB SIM 실행
11.1. Menu –> Project –> Build All (ctrl + F10) 클릭
11.2. Menu –> Debugger –> Run (F9) 클릭
11.3. Output Window –> SIM Uart1 탭에서 메시지 확인






'PIC' 카테고리의 다른 글

C30 컴파일러의 I/O 포트 액세스  (0) 2011.04.04
C30 컴파일러 속성(Attribute) 사용 예제  (0) 2011.04.01
C30 컴파일러 속성(Attribute)  (1) 2011.04.01

+ Recent posts