EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 4명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

임베디드! - 시리얼 살리기
글쓴이: EzDoum 글쓴날: 2005년 07월 24일 오후 07:18
하드웨어



JTAG를 사용하기 전엔 serial을 통해 모니터링했었다. 그런데 jtag을 사용하면서 부터 무슨 이유에선지 serial이 정상 동작을 안했었다. 처음 증상이 나타났을땐 시리얼이 먹통이지만 jtag이 되니까 시리얼을 무시하고 프로젝트를 진행을 계속했다. 그런데 c#으로 시뮬레이션 해보고 보드에 포팅한다 해도 실시간으로 보드에서 나오는 결과를 볼수 없다는 점이 답답했다. 방법은 메모리에 덤프 받고 jtag으로 뽑아 내면 되긴 하지만 이건 불편해!! 그래, 하루 정도만 시간을 투자해서 시리얼을 잡아 보자고 달려 들었다.

일딴 전에 임시 처방을 다 풀고 시리얼에서 문제가 발생해도록 돌려놓고, 분석에 들어갔다. 증상은 이랬다. 시리얼에 데이터를 쓰면 보드가 멈추는 것이었다. 소스를 이리저리 봐두 잘 돌던 것이라 문제가 없을것 같은데 왜 그럴까 싶었다. 그러다가 문제의 실마리를 우연히 찾았다. 보드가 멈춘 상태에서 visualdsp에서 cpu 멈춤 버튼을 눌렀더니 보드가 죽은게 아니라 serial쪽 루틴중 while 루프안에서 빠져나오질 못하는 것이었다.(다시 run 시켜보면 다른 인터럽트 카운트들은 잘 증가하고 있었음)

<pre>
int is_txchar_buff_full(void)
{
int temp;
temp = Utxhead + 1;
if (temp == UARTQUESIZE) temp = 0;
return (temp == Utxtail);
}


void uputc(char ch) /* send character to dte */
{
if(*pUART_LSR & THRE) {
*pUART_THR = ch;
Urt_Isr = 1;
}
else {
while (is_txchar_buff_full());
Utxque[Utxhead] = (ch & 0xff);
Utxhead++;
if (Utxhead == UARTQUESIZE) Utxhead = 0;
}
}
</pre>

문제가 되는 부분은 찾았지만 원인을 모르니, 다시 점검에 들어갔다. tx,rx버퍼를 보면, serial에서 입력이나 나가는 내용은 잘 들어가 있음을 확인 할 수 있었다. 왜 while (is_txchar_buff_full()); 이 무한루프가 걸리는 것일까? 결국엔 블랙핀에서 시리얼이 init하는 부분과 동작을 실제로 하는 부분인 인터럽트 루틴까지도 살펴보게 되었다.

아 jtag으로 변경하면서 바뀐게 하나 있는데, 이전엔 내부 sram을 data나 code로 사용하던것을 그냥 cache로 ldr파일을 변경했다. 즉 rx,tx 버퍼가 고속인 sram에 있었던것을 sdram으로 바뀐게 문제가 되나 싶었다. 전에 cache로 쓰는게 보드 전체의 성능에 더 좋아서 바꾼거라 이전으로 돌아가긴 싫었다. sdram에 있다고 안돌면 그게 말이 돼!! 그러면서 문득든 생각이 cache때문에 일관성에 문제가 생긴걸까? volatile 키워드를 적용하고 컴파일된 어셈블리 코드도 봤다. 여전이 안됨.

init하는 부분은 속도 맞추는거라 이게 제대로 안되면 rx버퍼에 pc에서 입력한 내용이 들어갈수 없으니, 정상이라 생각했고 인터럽트쪽을 점검해봤다. 블랙핀은 인터럽트 소스는 여러개이지만 ISR vector는 이 소스를 그룹핑해서 16개만 등록이 가능한다. 16개 중에서도 1/3 정도는 코어에서 정해진데로 써야하고 IVG7~IVG15만 사용자가 쓸수 있다. SPORT는 사용 안하니 무시하고 PPI를 가장 우선순위가 높게 설정하고 그 다음 Timer0, 시리얼(tx,rx), Timer1 이런 순으로 했다. ppi는 초당 30번 발생하는 빈도가 적은 인터럽트 이고, timer0는 주기가 짧아서 자주 발생하는 인터럽트이다. 오, 혹시 serial 인터럽트 처리하는 중에 timer0 인터럽트가 걸리면서 변경중인 serial자료구조에 일관성이 깨지는게 아닐까? 하는 의심이 들었다. 바로 인터럽트 우선순위 조정을 해서 테스트를 해봤다. 빙고! 원인은 좀 더 생각을 해봐야겠지만(timer0 인터럽트에서 시리얼로 내보내는 것은 없어서 서로 문제를 읽으킬것 같지는 않음) 인터럽트 우선순위를 조정하니 해결됐다.

시리얼이 동작하게 되어서 바로 닷넷에서 MSCOMM COM 객체를 등록해서 시리얼 통신이 가능하게 하고 보드랑 프로토콜을 정의해서 실시간으로 동작 상태를 볼 수 있도록 했다. 픽쳐박스도 여러개 만들어서 누적치라던지 보고 싶은 정보만 따로 가공해서 볼 수 있도록도 했다. 닷넷 만세!!

  • 첨부 파일: SNAG-0015.png SNAG-0015.png (18 KiB(18,133 Bytes))

    [Image Size 688 x 392]
    SNAG-0015.png



    [분류: 하드웨어 인쇄용 페이지 본문 email로 보내기 ]

  • <  SoCRobotwar 2005 - 인공지능 | 인터넷 프로그래밍 (ATL 관련)  >

    답장 쓰기
    글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

    검색
    Google

    분류
    ·공지 (6)
    ·인터넷 (87)
    ·하드웨어 (260)
    ·C/C++ (65)
    ·어셈블리 (7)
    ·리눅스 (136)
    ·리눅스 커널 (67)
    ·윈도우즈 (25)
    ·데이터베이스 (20)
    ·보안 (16)
    ·.NET (25)
    ·그래픽 (13)
    ·책소개 (42)
    ·호기심 천국 (80)
    ·잡담 (111)
    ·사랑 (3)

    전체 본문수: 963
    전체 답장수: 525


    분류 : 하드웨어
    최근글
    최근글
    가장 많이 읽은 글
    ·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
    뜨거운 감자
    ·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

    EzDoum투표
    이지도움 어때요?
    이게 뭐야. 다시 안올란다. --;
    아이 좋아라~ +_+;
    관심없다.
    먼가는 있는거 같은데 뭐하는 곳이지?
    기타 (자유게시판에 글로 남겨 주세요)
    [ 결과 | 투표 ]

    랜덤 링크
    http://kldp.net


     Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
     Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum