내 친구 매버릭 9편. UART - 2009/02/10 23:05
관련교재(EP93xx_Users_Guide_UM1.pdf) : CHAP14( ~ page14.36)
독자들이 ARM 에 대한 어느 정도의 사전(선행) 지식이 있다고 생각하고 글을 쓰겠다고 본 칼럼을 시작할 때에 지면을 통해 먼저 약속 했었다.
그렇긴 하지만, 지금에 와서 내가 쓴 글을 스스로 보고 있노라면 글의 내용이 누구를 타게팅 하고 있는지 점차 희미해 짐을 느끼게 된다. 글의 수준이 임베디드 입문자(초보)의 눈높이에 맞춰져 있는 것도 아니고 한번 정도는 마이크로 프로세서를 사용 해본 이들을 대상으로 한 글인것 같기는 한데 지금와서는 그것도 아닌것만 같다.
그 이유를 찬찬히 분석해 보자면, 너무 내용을 핵심 요점만 추려서 이야기 하다 보니 내용의 전달에 있어 자세한 부연 설명의 생략 결과 오해의 소지가 있고 또 그런것이 아닐까 ? 하고 이렇게 자문해 본다. 이것도 나의 귀찬이즘 때문이던가?.
다만, 한가지 다행스런 것은 내가 현재 쓰고 있는 글은 1차목표. 부트로더포팅, 2차목표. 주변장치제어 라는 분명한 목표를 가지고 있다는 것이고 2단계에서 등장하게 될 소프트웨어 소스코드가 내가 일부 칼럼의 내용중 자세한 설명을 하지 못한 것을 보완 해 줄 것이라 생각되며 또한 '현재 내가 쓰고 있는 칼럼의 내용이 너무 짧게 서술 된 것들이었다면 , 그 내용은 정말 중요하다고 생각되는 것만 내가 적지 않았을까' 라고 한편으로는 위안을 삼아 본다.
내가 현재 쓰고 있는 글이 그리고 앞으로 적을 글이 적어도 천덕 꾸러기 혹은 외면 당하는 글이 아니고만 싶다.
EP9302의 내장 UART 는 몇가지의 특징을 가지고 있다. 첫번째, 비교적 큰 용량의 FIFO 채택이다. 16레벨의 송수신 버퍼를 가지고 있어서 데이타 전송, 수신시 마이크로 프로세서의 부하(LOAD) 를 줄일 수 있도록 설계되어 있는 것을 알 수있다. 두번째, FIFO와 더불어 DMA 도 함께 사용하여 더욱 그 성능을 배가 시킬 수도 있다. 세번째, 루프백 모드의 지원을 들 수 있는데 별도의 테스트 지그나 환경이 없이도 UART 의 동작의 상태를 점검 할 수 있다. 즉, 자가진단(Selftest) 기능이 있다고 보면 되겠다.
열거한 특징 외에는 일반적인 UART의 구조와 비교. 더 이상 특이한 것은 없다고 봐도 좋겠다. 교재에는 UART에서 HDLC나 IrDA 같은 것도 함께 소개 하고 있는데 이는 부트로더를 만들고저하는 본 과정의 목표와는 전혀 관련이 없는 관계로 과감히 제낀다.
통상 UART는 TIMER와 더불어 부트로더(BOOTLOADER)나 모니터 프로그램(MONITOR PROGRAM) 혹은 RTOS 의 BSP같은 임베디드 개발 환경이나 툴로서 사용되는 프로그램의 기본 재료로 사용된다. UART 장치는 콘솔(CONSOLE)의 기능 그리고 프로그램 코드의 다운로드 하는 인터페이스 장치로서도 사용되며, TIMER 장치는 향후 상주되어 동작 할 커널의 시계로서 사용 된다.( 주/의/사/항. 임베디드 리눅스는 커널 상주후 사용할 UART나 TIMER 장치 드라이버를 운영체제 자체적으로 가지고 있고 부트로더의 그것을 사용하지는 않는다. 앞서의 설명은 RTOS 같은 운영체제를 사용할 시를 예시로 설명하고 있다).
UART 드라이버 작성시의 체크포인트
UART 드라이버는 다음과 같은 것들이 포팅 혹은 코드 작성시에 주목 할 만한 것들이 된다.
첫째, 전송 환경 설정(초기화)으로서 BAUDRATE 속도 결정, DATA, PARITY, STOP BIT, Hardware Flow Control 등의 사용 유무 결정이다.
대개 UART의 일반적으로 많이 사용되는 기본 설정 값은 DATA 8비트, PARITY 없슴, STOP 1비트, 하드웨어 흐름제어 없슴이다.
둘째, 송수신 버퍼를 확인하고 또한 FIFO의 유무도 함께 확인한다. 많은 임베디드 UART장치 드라이버가 들어 있는 오픈소스(GNU) 들을 보면 호환성을 위하여 FIFO 처리 코드가 아예 생략되어 있거나 옵션으로 처리 하고 있슴으로 혹시 자신이 하려는 시스템이 UART 의 성능을 최적화 해야 하는 것이라면 이를 꼬옥 확인하기 바란다. FIFO의 동작 유무에 따라 성능에 많은 차이가 있다.
셋째, 일반적인 UART 드라이버는 그 활용을 위하여 선형 원형큐버퍼(Circula Queue Buffer)를 설계하여 사용하곤 한다. 이를 해당 프로그램에 적용한다.
넷째, 마이크로 프로세서의 부하를 적게 하기 위해 그리고 프로그램을 유연하게 만들기 위하여 데이타 송수신 처리를 인터럽트 동작 방식으로 구현 한다. 송신(TX)의 경우 전송 버퍼가 비었을 경우(Transimit Buffer 'Empty') 그리고 수신(RX)의 경우 수신 버퍼에 데이타가 들어 왔을 경우(Receive Buffer 'Full')에 각각 Tx/Rx 인터럽트가 발생 하도록 구현한다.
앞으로 진행될 2차 단계의 부트로더 포팅시 UART 드라이버 프로그램에서 금번 회차 칼럼의 내용이 각각 어떻게 구현되었는지를 살펴 보면 아마도 좋은 공부나 참고가 될 것으로 생각된다. 그럼..
NEXT. . .
posted by 가일(GUILE)
♡ 포스팅이 유익 하셨다면 E-mail로 가일의 임베디드 스쿨을 구독하세요-> 




