한때에는 임베디드 시스템 프로그램을 RTOS를 기반으로 개발하는 것이 일반적이었던 때가 있었다. RTOS의 종류로는 VxWorks, pSOS와 같은 고가의 상용 제품과 더불어 uC/OS, FreeRTOS, RTEMS 등 소스가 공개되어 무료 또는 저가의 라이센스 비용만 지불하면 사용할 수 있는것들을 포함하여 그 수가 헤아릴수 없을 정도이다. 그러나, 최근에는 UNIX 계열 OS인 리눅스를 임베디드 시스템의 OS로 적용하는 것이 대세이기 때문에 점차 상용 RTOS는 사양길로 접어들고 있다. 서버 컴퓨터용 OS인 리눅스가 어떻게 임베디드 시스템 OS 시장을 장악하게 되었는지 그 이유를 따져본다면 다음과 같은 이유때문이 아닐까 싶다. 아마, 가장 큰 이유는 리눅스가 무료이기 때문일것이다. 게다가 소스코드까지 ..
입문 과정중에 인터럽트의 개념과 간단한 사용법, 그리고 인터럽트가 발생하는 시점부터 어떤 절차를 거쳐 인터럽트가 종료되는지 설명하였다. 이번 글에서는 Atmel Studio에서 제공하는 인터럽트 코드를 사용하지 않고, 프로그래머가 직접 인터럽트 서비스 코드를 만드는 방법에 대해서 설명하도록 하겠다. 이번 글을 위한 프로젝트는 앞에서 설명한 startup 프로젝트를 그대로 사용하도록 하겠다. 즉, startup.S 코드는 다음과 같다. #include .section .vectors .global _start _start: clr r1 out AVR_STATUS_ADDR, r1 ldi r28,lo8(__stack) ldi r29,hi8(__stack) out AVR_STACK_POINTER_HI_ADDR,..
이번 글에서는 앞에서 설명한 링커 스크립트 파일과 crt0를 응용하여 startup 코드를 직접 만들어 보는 방법에 대해서 설명하도록 하겠다. 먼저 링커 스크립트 파일부터 만들어 보도록 하겠다. OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr") OUTPUT_ARCH(avr:5) ENTRY(_start) MEMORY { flash (rx) : org = 0, len = 32K sram (rw!x) : org = 0x800100, len = 2K } SECTIONS { .text : { *(.vectors) *(.text) . = ALIGN(2); *(.text.*) . = ALIGN(2); } > flash .data : { __data_start = .; *(.d..