STLB 란
내가 자발적으로 처음으로 시작한 프로젝트이다. 'ST LINUX BOX' 의 약자로서, 현재 개발하고 있는 DAC5000 소스를 리눅스에 포팅하는 것을 목표로 시작했다.
프로젝트 설명
가장 먼저, 내가 해야 할일은 기존의 프로그램이 어떤 방식으로 동작하는지, 어떻게 컴파일되는지 이해하는 것이다.
크게 프로젝트의 순서는 다음과 같다.
- DAC5000 소스의 프로그램 수정 및 이해
- 미정
다른 아키텍처에 포팅하기 위해서는 최대한 현재의 ST 코드를 사용하지 않아야 한다.
그래서 기존의 DAC5000 에서 대부분의 파일들을 삭제한 후에 내가 직접 만든 소스코드를 넣기로 했다.
현재 디렉토리의 구조는 다음과 같다. 참고로 c:\stm\ 경로 아래에 있다.
디렉토리 | 설명 |
5517ref | 단순히 ST 라이브러리를 만들기 위해 존재하는 디렉토리 |
DAC5000 | 부팅 소스 코드를 위해 필요 |
ST20R1.9.6 | 컴파일러와 ST 시스템 콜을 위해 필요 |
STLB | 메인 디렉토리 |
STLB 은 다음의 디렉토리로 구성되어 있다.
디렉토리 | 설명 |
config | 부팅시 필요한.cfg 파일 |
include | 각 디바이스별 include 파일 |
lib | 5517ref 에서 만든 라이브러리 파일 |
make | gmake 설정 파일 |
obj | 소스 파일을 컴파일하면 생성되는 오브젝트 파일 |
src | 각 모듈별 소스 파일 |
그외 | 환경 설정을 위한 .bat 파일 |
문제점 및 해결
컴파일을 위한 설정 및 문제
처음 DAC5000 에서 /src 아래의 모든 파일을 지우고, 새롭게 내가 만든 main.c 파일을 작성했다. 물론 이 때, 컴파일을 위해서는 몇가지 선행되어야 할 작업들이 몇개 있다.
- setup.bat , st20.bat 파일 수정
- makefile 수정
나는 특히 makefile 수정에서 에러가 많았다. 주의해야 할 부분은 컴파일할 파일들을 나열하는 부분에서
ifdef ENABLE_TRACE ST20_OBJS += trace.tco CFLAGS += -DENABLE_TRACE endif
이 부분은 남겨둬야 한다는 것이다. 아직 정확한 원인을 모르겠지만, 지우면 .lku 파일을 만들지 못했다.
hello world 프로그램
내가 가장 먼저 했던 것은 바로 hello world 프로그램이었다. 예상대로 도스 프롬프트에 hello world 가 찍혔다.
타겟보드를 초기화하는 아무런 루틴도 넣지 않고, 단지 hello world 를 넣었는데도 말이다. 아마도 JTAG 이 실제 프로그램이 올라가기 전까지의 루틴을 자동으로 수행해주기 때문인 것 같다.
그러고 보면, 일반적으로 부팅을 수행하는 루틴 자체는 두 번 수행하는 것 같다.
- JTAG 으로 기본적인 하드웨어 세팅과 SDRAM 을 체크한다.
- DAC5000 의 main() 에서 부팅 루틴을 수행한다.
물론 위 두가지 일이 거의 같다고 보진 않는다. 하지만, JTAG 이 프로그램이 타겟보드에 올라가서 실행할 수 있는 최소한의 단계까지는 만들어준다는 것만큼은 확실하게 알 수 있다.
하지만, 후에 내가 main.c 에 좀더 복잡한 것들을 구현하려 할 때, 컴파일 과정에서 에러를 냈다. 에러의 내용은 부팅할 때의 부팅 파티션을 제대로 지정해주지 않았다는 것이었다. 앞의 내용을 단적으로 보여주는 예다.