2011년5월12일...SourceInsight3.5을 사용해 코드를 분석하여 I/O헤더파일을 만들어 보자.

 

http://www.sourceinsight.com/ 에 접속하여,

image

Trial Version을 클릭한다.

 

image

Continue…클릭

 

image

Download Now를 클릭…

 

image image

저장 후 실행한다. (파일명이 다른 이유는 묻지 말 것…)

 

 image

동의 클릭

 

image

환영! Next클릭..

 

image

Next클릭

 

image

Next클릭

 

image

Next클릭

 

image

Next클릭

 

image

인스톨 준비 Next

 

image  너무 빨리 끝나버렸다..

 

image

Finish

 

(등록 과정 생략)

 

image

새로운 프로젝트 생성…

 

image

Browse...를 클릭하여 프로젝트 경로를 설정함.

 

image

프로젝트 이름을 적고 OK버튼 클릭

 

image

OK버튼 클릭…

 

image

main.c만 선택 후 Add버튼 클릭

 

image

헤더파일을 추가하기 위해 C드라이브의 WIN-AVR이 설치된 경로로 찾아 들어감.

 

image

C:\WinAVR-20100110\Avr\Include\Avr에 있는 모든 헤더파일을 추가하기 위해 Add All버튼을 클릭

 

image 

많은 헤더파일들이 추가되었다.

 

image

C:\WinAVR-20100110\Avr\Include에 있는 모든 헤더파일을 추가하기 위해 Add All버튼을 클릭

 

image

하위 디렉토리의 헤더파일들은 모두 추가하였으니 체크를 해제하고 OK버튼을 클릭

 

image  11개의 파일을 프로젝트에 추가할 것이냐고 물으면 OK!

 

image

Close버튼 클릭

 

image

Project메뉴의 Synchronize Files…을 선택

 

image

OK버튼을 클릭

 

image

Main.c파일을 더블클릭

 

image

SIGNAL( ) 위에서 컨트롤키를 누른 상태로 클릭

 

image

두 번째 Interrupt.h파일을 선택

 

image

C++이 아니니 150행의 #else이후에 있는,

#  define SIGNAL(vector)                    \
    void vector (void) __attribute__ ((signal, __INTR_ATTRS));        \
    void vector (void)

을 복사하여 main.c에 갖다 붙임.

 

image

 

 

image

iom128.h파일을 열어 타이머/카운터0의 오버플로우 인터럽트 벡트가 어떻게 되는지 알아봄.

 

image

타이머/카운터0의 오버플로우 벡터는 16이군.

image

_VECTOR(16)위에서 컨트롤키를 누른 상태에서 클릭

 

image

_VECTOR(N)은 __vector_ ## N이다.
Str_defs.h파일은 뭘까;

__vector_ ## N에서 ##은 빼고 N에 16을 넣어 __vector_16을 main.c에 있는 vector와 바꿈.

 

image

void vector (void)를 void __vector_16 (void)로 바꾸었다.
다음은 옆에 빨간 __INTR_ATTRS를 바꿀 차례다.

 

image

__INTR_ATTRS위에서 컨트롤키를 누른 채로 클릭

 

image

위에꺼 선택

 

image

#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
#  define __INTR_ATTRS used, externally_visible
#else /* GCC < 4.1 */
#  define __INTR_ATTRS used
#endif

GCC컴파일러의 버전이 4이상이면 #if문의 #define문이고,
GCC컴파일러의 버전이 4.1이하이면 #else의 #define문의 내용으로 바꾸면 된다.

컴파일러의 버전을 확인하여 보자.

image

> make gccversion
명령을 입력하여 확인하여 보니 4. 3 .3이다.
그러므로 #if문에 있는 used, externally_visible을 __INTR_ATTRS자리에 넣으면 되겠다.

 

image

최종적으로 아래와 같이 되었다.

#  define SIGNAL(vector)                    \
    void __vector_16 (void) __attribute__ ((signal, used, externally_visible));        \
    void __vector_16 (void)

33행의 SIGNAL(SIG_OVERFLOW0)는 지운다.
36행의 void __vector_16 (void)를 복사하여, SIGNAL(SIG_OVERFLOW0)의 내용이 있는 곳에 붙인다.

image

image

SIGNAL(SIG_OVERFLOW0)이 void __vector_16 (void)으로 바뀌었다.

 

image

마지막으로 모든 #include문을 지우고 #include “ATmega128.h”를 추가하고 컴파일하면,

 

image

에러 없이 잘 된다.

 

(동작 영상은 나중에 추가)

 

 

<추가>

image

google검색하여 불꽃동자님의 티스토리 포스트를 보니…
내꺼,
void __vector_16 (void) __attribute__ ((signal, used, externally_visible));    
void __vector_16 (void)
{
}
와 다르게

void __vector_16 (void) __attribute__ ((signal, used, externally_visible));
void __vector_16
{
}
이렇게 (void)가 없다. 어느게 맞는 것일까?

 

그리고 이상하게 코드가 되다 안되다 이런다. ㅠㅠ