티스토리 뷰
이번 단계에서 설명하고자 하는 내용은 startup 코드가 제대로 작성되었는지, 그리고 간단하지만 회로에는 문제가 없는지 확인해 보기위한 초기화 코드를 만들어 보는 것이다.
megaOS 프로젝트를 진행하기 위하여 세개의 header 파일이 필요하다. OS에서 사용하는 각종 매크로와 구조체, 함수 prototype을 정의하기 위한 os.h 파일과, ATmega328이라는 MCU에 해당되는 내용을 담고있는 arch.h 파일, 그리고 보드 의존적인 내용을 정의하기 위한 board.h 파일이다.
이들 header 파일은 inc 라는 폴더에 분리시켜 작성하도록 하겠다.
코드 작성의 편의성을 위하여 프로젝트 속성 창에 이들 header파일이 있는 폴더를 등록하도록 하겠다.
위의 그림처럼 프로젝트 속성창에서 Toolchain > AVR/GNU C Compiler > Directories를 선택한다. 그런다음 그림의 빨간 박스로 표시되어 있는 아이콘을 클릭하면 다음과 같은 다이얼로그 박스가 나타난다.
오른쪽 끝에 있는 버튼을 누르면 폴더 선택창이 나타나게 되는데 "inc" 디렉토리를 선택하고 "폴더 선택" 버튼을 눌러 선택한 폴더가 적용되도록 한다.
위의 그림처럼 "../inc" 디렉토리가 적용된것을 볼 수 있다.
그럼, 먼저 보드마다 달라질 수 있는 내용을 header 파일에 작성해 보도록 하겠다.
inc/board.h 파일에 다음과 같은 내용을 추가한다.
4번 줄의 SYS_CLOCK은 AVR의 동작 클럭값을 설정한다. 이 값은 보드마다 달라질수 있는 값이므로 현재 AVR이 어떤 클럭값으로 동작되고 있는지 확인하여 정확한 값을 입력하여야 한다.
9번 줄은 UART 를 설정할 때 사용하기 위한 buad rate 값이다. 가급적 높은 baudrate값을 사용하는것이 좋다. 115200 bps가 임베디드 시스템에서 주로 사용하는 값이다.
10번줄에 있는 값은 UART 설정시 error 값을 최소화 하기 위해 사용하는 보정값이다. 왜 이값을 사용하게 되는지는 입문 과정중 시스템 클럭 글을 참고하면 이해할 수 있을것이다.
15번 줄은 LED를 제어하기 위하여 몇번째 비트값에 연결되어 있는지 설정하는 값이다.
다음으로는 inc/arch.h 파일을 다음과 같이 작성한다.
1~2는 SREG 레지스터에 있는 global interrupt enable 비트를 set 하거나 clear하기 위한 매크로이다.
8~9는 I/O 레지스터의 offset 주소를 알려주는 코드이다.
16~21은 PORT 설정을 위한 구조체를 만든것이다.
26~51은 UART 구조체와 그 안에 있는 레지스터를 설정하는데 필요한 값들을 미리 만들어 놓은 것이다.
마지막으로 inc/os.h 파일은 다음과 같은 내용을 추가한다.
아직까지는 본격적으로 커널을 만들기 이전이므로 주요 standard header 파일과 board.h, arch.h 파일을 include 하는 코드만 추가하면 된다.
header 파일 작성이 끝났으면, main() 함수에 다음과 같은 코드를 만든다.
먼저 MCU의 주요 블럭을 초기화하는 코드를 실행하게 한 후, 보드에 따른 초기화 코드를 실행하도록 한다. 초기화 코드를 수행한 후 UART 동작을 확인하기 위한 banner 메시지를 출력 해본다.
arch.c 파일에 다음과 같은 코드를 추가한다.
arch_init() 에서는 먼저 interrupt 발생을 제한하기 위하여 cli()를 실행한다. 그 다음으로는 uart를 초기화 하는 코드를 실행한다.
board.c 파일은 다음과 같이 작성한다.
board_init()에서는 MCU에 연결된 LED를 켜는 코드를 추가한다.
모든 코드 작성이 완료 되었으면, arch.c 파일과 board.c 파일을 프로젝트에 포함 시킨 후 빌드해본다.
에러없이 컴파일 된것을 확인하였으면, 실제 보드에서 실행시켜 본다.
LED에 불이 켜지고 UART 터미널에 다음과 같은 메시지가 출력되면 start 코드가 잘 만들어졌고, 또한 회로구성도 문제 없이 잘 연결된것을 확인할 수 있게 되었다.
'심화' 카테고리의 다른 글
megaOS - 4. Scheduler(스케줄러) (0) | 2016.10.22 |
---|---|
megaOS - 3. Double linked list (0) | 2016.10.20 |
megaOS - 1. 프로젝트 시작하기 (5) | 2016.10.17 |
megaOS - 0. 시작하기 전에 (0) | 2016.10.16 |
RTOS - Real Time Operating System (2) | 2016.10.15 |