Programming/8051

8051( 중급 5부 - pre-processor )

청솔1 2009. 11. 29. 11:34

8051( 중급 5부 - pre-processor )


지난 4부에서 define에 대한 설명을 했다.
C 언어에서 #define, #include, #pragma, #if 등 '#'가 붙어 있는 것을 pre-processor라고 한다.
pre-processor에 대한 용어 설명은 IAR compiler manual상에 설명되어 있는것을 인용하는것으로 대신한다.

본 강좌는 C 문법을 위한 강좌가 아니기 때문이다. 보다 자세한 내용은 일반 C 컴파일러에 대한 책에서 공부 하기 바란다.

The pre-processor is the part of the C compiler that evaluates keywords which begin with a "#".
Such keywords are evaluated prior to the compiler's code-generating pass, so that macro ( created
with #define) and #include files (etc) are fully evaluated.

대충 설명하자면 컴파일러가 code를 만들기 전에 선행해서 처리하는 키워드 라는 것이다.

그래서 일부 책에서는 전처리 함수라는 용어로 설명 되기도 한다.

본 강좌에서 pre-processor를 설명코자 한것은 #pragma를 설명코자 함이다.

#pragma memory=code
unsigned char Ver_compare1[] = "VERSION";
unsigned char Ver_compare2[] = 'version";
unsigned char Reset1[] = "RESET";
unsigned char Reset2[] = "reset";
#pragma memory=default


위의 내용을 보면 Ver_compare1, Ver_compare2, Reset1, Reset2라는 변수는 모두 code memory영역에 배치하라고 컴파일러에 알려 주는 것이다.

\여기에서 code memory라 함은 8051의 program memory 영역을 뜻하므로 ROM에 배치된다.

8051이 아닌 PC등에서는 RAM을 활용하기 때문에 constant unsigned char ....
라는 표현으로 사용하게 된다.

여기에서 유의할 사항은 위의 변수들은 모두 code memory, 즉 ROM에 배치 되기 때문에 modify가 되지 않는다는 점이다.

#pragma memory=default
xdata int Ver_count;
xdata int Reset_count;


위의 변수들은 xdata 영역, 즉 외부 RAM 영역에 배치한다는 뜻이다. 만일 xdata를 안붙이게 되면 내부 RAM
에 변수를 배치 하게 된다.( tiny model의 경우임. 본 강좌는 tiny model로만 진행함. )

/* code memory에 배치하는 변수 */
#pragma memory=code
unsigned char Ver_compare1[] = "VERSION";
unsigned char Ver_compare2[] = 'version";
unsigned char Reset1[] = "RESET";
unsigned char Reset2[] = "reset";
/* 외부 RAM에 배치 하는 변수 */
#pragma memory=default
xdata int Ver_count;
xdata int Reset_count;
/* 내부 indirect RAM에 배치 하는 변수 */
#pragma memory=idata
/* NV RAM( non-volatile RAM : 불휘발성 RAM )에 배치 하는 변수 */
/* 이 경우는 startup 루틴에서 초기화 시키지 않는 변수이다     */
#progma memory=no_init
/* 인터럽트 함수 */
#pragma function=interrupt
/* 일반 함수 */
#pragma function=default


주로 많이 사용되는 pragma에 대한 예를 들어 보았다.
이렇게 명시적으로 pragma를 선언 하지 않아도 compiler는 자동으로 알아서 배치를 해준다.
하지만 명시적으로 선언해 두었을때 일단 프로그래머는 자신의 변수들이 어떠한 영역에 배치되고
있는지 알고 있게 되고 나중에 디버깅 할때도 확실히 어떠한 영역에서 움직이고 있는지를 확연히
알수 있게 되어 보다 readable 하다 하겠다.

이번 강좌에서 시험할 프로그램은 산적 본인이 즐겨 하는 방식을 소개 한다.
산적은 appilcation program을 EPROM에 넣지 않고 RAM이나 flash ROM에 다운 로드 하는 방식을 선호한다.

이 방법은 간혹 프로그램이 망가지는 경우도 있긴 하지만 RS-232 케이블만 있으면 버젼업이 용
이하고 매번 ROM writer를 사용하고 하는 번거러움이 없어 많이 사용하는 방식이다.

응용 프로그램을 실행중 현재 프로그램의 버젼을 알아 보는 기능, 현재 응용 프로그램을 정지 하고
모니터 프로그램으로 돌아 가게 하는 기능이 포함 되어 있다.

#pragma memory = code
unsigned char Ver_compare1[] = "version";
unsigned char Ver_compare2[] = "VERSION";
unsigned char Reset1[] = "reset";
unsigned char Reset2[] = "RESET";
unsigned char Ver_str[] = " chapter. 5 : C programming of sanjeok's 8051> ";
unsigned char User_reset[] = " User reset!!! wait for a while...> ";
#pragma memory = default
xdata int Ver_count, Reset_count;
[ -------------- 중 략 ------------ ]
void COM1_process( void ) {
    unsigned char c;
    c = COM1_read();
    COM1_putc( c );     /* echo */
    if( ( c == Ver_compare1[ Ver_count ] ) || ( c == Ver_compare2[ Ver_count ] ) ) {
        Ver_count ++;
        /* "version"이 7바이트 이므로 7이 되면 7글자 모두 맞았다는 야그 */
        if( Ver_count == 7 ) {
            COM1_putc( 13 );    /* carrage return */
            COM1_putc( 10 );    /* line feed */
            COM1_puts( Ver_str );
            Ver_count = 0;
            }
        }
    else Ver_count = 0;
    if( ( c == Reset1[ Reset_count ] ) || ( c == Reset2[ Reset_count ] ) ) {
        Reset_count ++;
        if( Reset_count == 5 ) {
            COM1_putc( 13 );    /* carrage return */
            COM1_putc( 10 );    /* line feed */
            COM1_puts( User_reset );
            EA = 0;     /* 인터럽트를 해제 시킨다. */
            for(;;);    /* 아무일도 하지 않고 watchdog timer에 의해 reset이 걸리도록 대기 */
            }
        }
    else Reset_count = 0;
    }


실제 프로그램은 프로그램 소스 자료실에 압축화일로 올린다.
이 프로그램은 이번에 맹근 starter2 보드에 의해 시험을 거친 프로그램이다.

그리고 PC 화면상에서 실행 상태를 갈무리 한것은 다음과 같다.

 chapter. 5 : C programming of sanjeok's 8051> version 소문자로 입력 한 경우
 chapter. 5 : C programming of sanjeok's 8051> VERSION 대문자로 입력 한 경우
 chapter. 5 : C programming of sanjeok's 8051> reset
 User reset!!! wait for a while...> 


참고로 newscm.exe에서 Alt-U를 누르면 시리얼 포트를 통해 수신되는 모든 문자를 화일로 저장할수 있다.

STX( 02H ), ETX( 03H )는 "STX_", "_ETX_"로 저장이 되며 20H~7FH 까지의 ASCII문자는 그대로,
나머지는 16진값이 대괄호 안에( 예를 들면 "[0A]", "[8F]" )넣어 진다.
저장을 종료 하려면 Esc 키를 누르면 된다. 화일 이름은 default로 SCM.TXT로 된다.

 

<< 전자기기 개발 --- 건강기기, 통신기기,각종 전자회로 개발, PCB ARTWORK >>

 

 

'Programming > 8051' 카테고리의 다른 글

8051( 중급 7부 - RS485 )   (0) 2009.11.29
8051( 중급 6부 - RS485 )  (0) 2009.11.29
8051( 중급 4부 - define )  (0) 2009.11.29
8051( 중급 3부 - 함수 )  (0) 2009.11.29
8051( 중급 2부 - C 프로그램 맛보기 )  (0) 2009.11.29