C 프로그램에서는 반드시 main() 함수가 하나 있어야 한다. 그 이유는 C 프로그램은 main() 함수로부터 시작되기 때문이다. 즉, 프로그램의 진입점으로 규정했기 때문에 반드시 main() 함수가 있어야 한다. 만약 main() 함수가 없으면 프로그램이 어디서부터 시작되어야할지 모르기때문에 컴파일러는 main() 함수가 없다고 에러를 발생하게 된다. 그러나 이미 앞에서 링커 스크립트를 설명할 때 main() 함수가 실행되기 이전에 처리해 두어야 하는 내용들이 있다고 하였다. 즉, ROM에 있는 .data 섹션을 RAM으로 복사해주고, .bss 섹션을 0으로 초기화 해주어야 한다. 이러한 일련의 초기화 코드를 crt0라고 통칭한다. AVR 프로그램에 들어있는 crt0 코드는 어떻게 생겼는지 분석해 보..
일반적으로 컴퓨터에서 실행되는 어플리케이션 프로그램을 C나 C++같은 언어로 개발할 때에는, 만들어진 실행파일이 물리적으로 어디에 저장되어 있는지, 실행될 때 메모리의 어느 주소에 어떤 구조로 로드되는지 몰라도 프로그램을 실행하는데 전혀 문제될 것이 없다. 하지만, 임베디드 시스템 프로그램을 개발할 때에는 얘기가 조금 달라진다. 프로그래머는 CPU에 따른 메모리 맵이 어떻게 생겼는지 알아야 하고, 이러한 메모리 맵에 맞도록 실행파일을 만들어야 한다. 이번 글에서 설명하고자 하는 링커 스크립트라는 것이 바로 CPU의 메모리 맵에 따라 실행파일을 어떻게 생성할 것인지를 알려주게 된다. 이 블로그의 입문과정 첫번째 글인 "hello, world"에서 컴파일 과정을 전체적으로 간단히 설명하였는데, 마지막 단계가..
Flash 메모리 프로그램의 첫번째 단계는 'Erase'라고 bootloader 프로젝트에서 이미 언급하였다.Bootloader 프로그램은 Self-programming 방법이므로 page 단위로 erase를 하였으나, ISP에서는 page 단위의 erase 명령어가 없고, chip erase만 제공한다.따라서 ISP 프로젝트에서는 항상 chip erase만 사용하게 된다. #define CHIP_ERASE0 0xAC #define CHIP_ERASE1 0x80 static void erase_chip(void) { cmd_data[0] = CHIP_ERASE0; cmd_data[1] = CHIP_ERASE1; cmd_data[2] = 0; cmd_data[3] = 0; isp_cmd(); _delay_..