VPOS 를 디버깅 하는 내용들을 날짜 별로 정리한 곳이다.
여기서 디버깅은 버그를 수정하는 것 외에도, 내가 나름대로 소스코드를 추가하거나 삭제한 것들을 의미한다.
VPOS 와 관련한 모든 컴파일 및 디버깅은 Develop 서버에서 수행할 것이다. 사양은 다음과 같다.
OS | redhat 9 |
IP | 166.104.30.15 |
PORT | ssh, ftp |
여기서는 편의상 개발(Develop) 서버라 부르겠다.
2007. 1. 21
작업한 내용
VPOS 를 Develop 서버에서 컴파일하기 위한 환경 설정을 했다.
발생된 문제
Stong(수통) 서버에서 컴파일하여 만들어진 vpos.bin 파일은 타겟 보드에서 수행이 잘 되는데 반해, 개발 서버에서 만들어진 vpos.bin 파일은 제대로 작동하지 않았다.
살펴본 결과, 동일하게 컴파일 되어진 오브젝트 파일(objs/*.o) 과 링크 스크립트 파일을 참조해서 elf 파일을 만드는 부분(arm-linux-ld)에서 문제가 발생했다.
redhat 9 와 수통 서버(fedora 6) 에서 ls 명령시에 출력되어 지는 정렬 순서가 다르다.
arm-linux-ld -v -T../hal/cpu/vpos_kernel-ld-script -Bstatic *.o -o vpos_kernel-elf32 -L/usr/local/arm/lib/gcc-lib/arm-linux/2.95.3 -lgcc -lc
위의 같은 명령어를 사용해서 ELF 파일을 생성할 때, '*.o' 를 사용해서 오브젝트 파일을 참조하기 때문에, 순서대로 심볼테이블에 저장되지 않는다.
수정한 사항
vpos/objs 아래의 Makefile 을 다음과 같이 수정했다.
... OBJS = HAL_arch_startup.o barrier.o barrier_example.o cond.o cond_example.o ctype.o current_time_example.o \ dd.o device_driver_example.o exception_handler.o flash_write.o hal_hwi_handler.o hal_swi_handler.o \ kernel_start.o kmalloc.o machine_init.o malloc.o memtst.o message_queue.o message_queue_example.o \ msgqueue.o mutex.o mutex_example.o no_mutex_example.o parser.o port.o printk.o proc0.o pthread_create_example.o \ pthread_join_example.o queue.o rtc_time.o s3c2410_lcd.o scheduler.o semaphore.o semaphore_example.o \ serial.o stdlib.o string.o t20061228204805546.o t20061228204810796.o t20061228204814781.o thread.o \ time_api.o time_api_example.o timer.o vpsh.o ...
차후에, 새로운 오브젝트 파일이 추가될 시에 OBJS 의 끝에 추가시켜주면 된다.
2007. 4. 18
작업한 내용
CPU 의 클럭을 200 MHz 으로 조정했다. 기존의 세팅의 경우, 잘못된 값으로 설정되어 있었다.
바로 아래의 부분이다.
#define vh_MDIV_50 0x5c #define vh_PDIV_50 0x4 #define vh_SDIV_50 0x2 #define vh_MDIV_200 0x5c #define vh_PDIV_200 0x4 #define vh_SDIV_200 0x0 #define vh_vMPLLCON_50 ((vh_MDIV_50 << 12) | (vh_PDIV_50 << 4) | (vh_SDIV_50)) #define vh_vMPLLCON_200 ((vh_MDIV_200 << 12) | (vh_PDIV_200 << 4) | (vh_SDIV_200))
S3C2410 데이터시트를 보면, 7-17 페이지를 보면 클럭 테이블이 있다. 총 3 개의 값을 계산해서 PLL 을 구한다. 구하는 공식은 다음과 같다.
Mpll = (m * Fin) / (p * 2^s) m = (MDIV + 8), p = (PDIV + 2), s = SDIV, Fin = 12.00 MHz
S3C2410 은 200 MHz Chip 임에도 불구하고, 237.00 MHz 까지 오버클럭을 할 수 있다. 테스트 해본 결과, 시리얼 문자열이 깨지는 문제가 발생했다.
그나마 200 MHz 에서 정상적으로 출력되었다.
수정한 사항
hal/include/vh_cpu_hal.h 파일을 아래와 같이 수정했다.
#define vh_MDIV_50 0x5c #define vh_PDIV_50 0x4 #define vh_SDIV_50 0x2 #define vh_MDIV_200 0xa1 // 수정 #define vh_PDIV_200 0x3 // 수정 #define vh_SDIV_200 0x1 // 수정 #define vh_vMPLLCON_50 ((vh_MDIV_50 << 12) | (vh_PDIV_50 << 4) | (vh_SDIV_50)) #define vh_vMPLLCON_200 ((vh_MDIV_200 << 12) + (vh_PDIV_200 << 4) + (vh_SDIV_200)) // 수정
전보다 빨라진 것을 수치상으로 본 것은 아니지만, 전보다 DIVX 에서의 동영상이 좀 더 빨라진 기분은 들었다.