2011년5월12일...SourceInsight3.5을 사용해 코드를 분석하여 I/O헤더파일을 만들어 보자.
http://www.sourceinsight.com/ 에 접속하여,
Trial Version을 클릭한다.
Continue…클릭
Download Now를 클릭…
저장 후 실행한다. (파일명이 다른 이유는 묻지 말 것…)
동의 클릭
환영! Next클릭..
Next클릭
Next클릭
Next클릭
Next클릭
인스톨 준비 Next
Finish
(등록 과정 생략)
새로운 프로젝트 생성…
Browse...를 클릭하여 프로젝트 경로를 설정함.
프로젝트 이름을 적고 OK버튼 클릭
OK버튼 클릭…
main.c만 선택 후 Add버튼 클릭
헤더파일을 추가하기 위해 C드라이브의 WIN-AVR이 설치된 경로로 찾아 들어감.
C:\WinAVR-20100110\Avr\Include\Avr에 있는 모든 헤더파일을 추가하기 위해 Add All버튼을 클릭
많은 헤더파일들이 추가되었다.
C:\WinAVR-20100110\Avr\Include에 있는 모든 헤더파일을 추가하기 위해 Add All버튼을 클릭
하위 디렉토리의 헤더파일들은 모두 추가하였으니 체크를 해제하고 OK버튼을 클릭
11개의 파일을 프로젝트에 추가할 것이냐고 물으면 OK!
Close버튼 클릭
Project메뉴의 Synchronize Files…을 선택
OK버튼을 클릭
Main.c파일을 더블클릭
SIGNAL( ) 위에서 컨트롤키를 누른 상태로 클릭
두 번째 Interrupt.h파일을 선택
C++이 아니니 150행의 #else이후에 있는,
# define SIGNAL(vector) \
void vector (void) __attribute__ ((signal, __INTR_ATTRS)); \
void vector (void)
을 복사하여 main.c에 갖다 붙임.
iom128.h파일을 열어 타이머/카운터0의 오버플로우 인터럽트 벡트가 어떻게 되는지 알아봄.
타이머/카운터0의 오버플로우 벡터는 16이군.
_VECTOR(16)위에서 컨트롤키를 누른 상태에서 클릭
_VECTOR(N)은 __vector_ ## N이다.
Str_defs.h파일은 뭘까;
__vector_ ## N에서 ##은 빼고 N에 16을 넣어 __vector_16을 main.c에 있는 vector와 바꿈.
void vector (void)를 void __vector_16 (void)로 바꾸었다.
다음은 옆에 빨간 __INTR_ATTRS를 바꿀 차례다.
__INTR_ATTRS위에서 컨트롤키를 누른 채로 클릭
위에꺼 선택
#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문의 내용으로 바꾸면 된다.
컴파일러의 버전을 확인하여 보자.
> make gccversion
명령을 입력하여 확인하여 보니 4. 3 .3이다.
그러므로 #if문에 있는 used, externally_visible을 __INTR_ATTRS자리에 넣으면 되겠다.
최종적으로 아래와 같이 되었다.
# 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)의 내용이 있는 곳에 붙인다.
SIGNAL(SIG_OVERFLOW0)이 void __vector_16 (void)으로 바뀌었다.
마지막으로 모든 #include문을 지우고 #include “ATmega128.h”를 추가하고 컴파일하면,
에러 없이 잘 된다.
(동작 영상은 나중에 추가)
<추가>
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)가 없다. 어느게 맞는 것일까?
그리고 이상하게 코드가 되다 안되다 이런다. ㅠㅠ