태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Implement mobile phone system on EMDK4000 uC/OS-II - 핸드폰 구현

Posted on 2008.01.11 00:02
Filed Under Project

목차


 

[프로젝트 일반사항]#

<개 요>

프로젝트 명: EMDK4000을 이용한 휴대폰 구현

프로젝트 참여 인원: 윤수리, 박지훈, 조경호

프로젝트 기간: 2007. 09 ~ 2008. 01


<목 표>

EMDK 4000와 uC/OS-II를 사용하여 음성 통화 착신/발신과 문자메세지 송/수신 할 수 있는 프로그램을 구현한다.


<내 용>

uC/OS-II의 멀티태스크 환경을 이용하여 EMDK-4000의 터치패드 인터페이스를 기반으로 GUI를 이용하여

휴대폰의 핵심기능인 통화, SMS 를 실제 휴대폰과 유사하게 사용할 수 있도록 제작.


[개발환경]#

Target board : EMDK–4000 (s3c2440)

O/S
Host : Windows XP
Target : uC/OS-II

IDE
- Visual Studio 2005
- ADS 1.2

Output Compiler
- ADS 1.2


[특징 / 기능]#

<요구 기능>

  1. 전화 수신/발신

  • 요구하는 전화번호를 입력받아 수신/발신

  • 발신자 표시 기능

2.  SMS 송신/수신

  • 최대 80자 이내의 메시지를 상대방에게 전달

  • 수신메세지가 도착했을 경우 보여주기


< 제약 사항 >

  1. 전화번호 입력 길이 제한 - 20자

  2. 전화번호 목록, SMS수신 목록 미저장

  3. 이전 상태의 저장 불가 (ex : 전화 거는중 전화가 올 경우)

  4. 문자메세지 문자열 중앙 삽입 삭제 불가 (뒤부터 추가,삭제만 가능)

  5. SMS 패킷 구조의 미숙으로 데이터 깨짐 발생 (몇 자 짤림)

  6. Flash 메모리를 사용하지 않기 때문에 SMS 수신데이터의 손실


[태스크 설계 / 구현]#

 태스크 우선 순위 생성 이유
 TASK_Start 10 TASK 생성 및 초기화
 TASK_Rx  11  CDMA 모뎀으로 부터의 데이터 수신
 TASK_Tx  12  CDMA 모뎀으로 데이터 송신
 TASK_UI  14  전반적인 유저 인터페이스
 TASK_Timer  15  시간을 표시해주는 태스크


<TASK_Start>

가장 먼저 생성되는 태스크로, 기본적인 하드웨어 초기화를 한 후 나머지 태스크들을 생성한다.

태스크를 생성하고 나면, 1초에 한 번씩 깨어나 모뎀을 체크한다.


<TASK_Tx>

Call Manager로부터 데이터를 전달받으면 그것을 AT Command로 변환하여 모뎀에 전송한다.


<TASK_Rx>

모뎀으로부터 데이터가 들어오면 UART1 ISR에 의해 포스트되며, RX 큐에 있는 내용을 꺼내서

데이터를 해석하고, 그에 맞는 행동을 취하게 된다.


<TASK_UI>

독립된 UI모듈에게 상황에 맞는 화면 그리기를 명령한다.


<TASK_Timer>

특별한 기능은 없는 태스크로 매 1초마다 모뎀으로부터 현재 시간을 얻어오는 태스크이다.

 멀티태스킹 환경을 위해 삽입한 태스크라고 할 수 있다.


[라이브러리 / 모듈 구성]#

<모듈 설계>

GUI 관리 모듈 : Graphic 입출력 인터페이스를 관리한다.

GUI 아이템 모듈 : 버튼, 메뉴, 화이트 보드 등이 정의되어 생성된다.

Calibration 모듈 : LCD 터치패드 캘리브레이션을 당담.


<라이브러리 구성>

  • 2440lcd.c

기존에 프레임버퍼에 바로 기록하던 방식을 가상버퍼에 기록하여 Dump()를
통해 프레임버퍼에 기록하는 더블버퍼링 추가.


  • GUI_Base.h

Component 구조체 - GUI를 관리하는 인스턴스를 생성

Tree 구조체 - GUI에 등록된 아이템들을 관리하기 위한 구조체 정의
BaseElement 구조체 - GUI에서 아이템의 정보를 주고받기위한 일반화 구조체


  • GUI_Usertype.h

T_Window 구조체 - 가상 LCD 타입의 아이템
T_Button 구조체 - 버튼 타입의 아이템
T_Whiteboard 구조체 - LCD 안에 그릴수 있는 아이템
T_Menu 구조체 - 메뉴 타입의 아이템
T_MenuItem 구조체 - 메뉴가 가지는 요소의 아이템
T_MenuTree 구조체 - 메뉴요소들을 관리하기 위한 구조체


  • GUI_Manager.c - GUI 관리자에 대한 동작을 정의

  • GUI_Menu.c - GUI 메뉴에 대한 동작을 정의

  • GUI_Whiteboard.c - GUI 화이트보드에 대한 동작을 정의

  • GUI_Declaration.c - GUI 관리자와 아이템들을 선언,등록

  • calibration.c - LCD 터치패드 캘리브레이션

  • XMT_Lib.c - 개발 시 편의를 위한 함수 선언

  • XMT_Uart.c - UART 관련 코드

  • Cm.c - Call Manager로서 전반적인 내부적 기능에 대한 동작 수행

  • Queue.c - Rx/Tx/SMS 송수신을 위한 버퍼 큐 구성


[결과 분석]#

[느낀 점]

  1. uC/OS-II 의 태스크 운용 설계가 일반적인 멀티태스킹과 틀려 많은 실수가 있었다.  

  2. 새로운 경험이였고 제작하면서 C 의 저수준에 대한 이해도가 조금 더 높아졌다.  

  3. 임베디드 상에서 메모리 제약과 수행시간에 대한 민감도를 체험하였다.  

  4. 핸드폰 구현을 하면서 실제 휴대폰의 통신에 대해 자세히 알 수 있었다.


[개선 사항]

  1. SMS문자열 입력시 중간 수정(삭제,추가) 가 불가능 한 부분에 대한 추가. 

  2. GUI 의 비효율적인 구조와 난해한 코드에 대한 보수. (재사용성 고려)  

  3. 버튼 터치 효과가 불안정함. ( ISR UP/DOWN에 직접 버튼 이미지를 선택한 문제 )  

  4. 외부 이벤트 (전화 수신, SMS 수신) 에 대해 지금 상태를 저장/불러오기. 

  5. Rx/Tx 태스크의 커맨드 버퍼로 연결리스트 구조의 큐 구현  

  6. 공유자원 접근 문제를 해결하기 위한 세마포어와 크리티컬 섹션 적용  

  7. SMS 수신 시 별도의 자료구조(큐)에 저장을 하고 검색할 수 있는 기능 적용



[COMMENT]#

이번 방학중 교육때 프로젝트로 선택하여 원래 3인 프로젝트였지만 두명이서 끝낸 결과물입니다.

저는 GUI 부분, 그리고 팀 형 한명은 통화, SMS 처리부를 당담했습니다.

서로 의사소통도 많이 안하면서 완전히 별개로 작업하다가 서로 최소한의 연결고리는 미리 준비했던 상태라 제출일날 소스를 서로 합쳤는데 별탈없이 금새 끝냈을때는 미묘한 쾌감이 들더군요. 이게 팀으로 하는 묘미인가 봅니다.

한참 미뤄두다 몇일만에 끝낸거라 소스도 난잡하고 제가 맡은 GUI 쪽은 완전히 그야말로 난장판입니다.


그도 그럴것이 사실 당초에 기본적인 기능과 설계는 C++ 기준으로 구조체를 클래스처럼 사용했는데 C로 오니까 죄다 불가능 ㅡㅡ;

구조체에 멤버함수가 되는가가 궁금했는데 C++은 되고 C는 안됩니다. 이걸 못랐던 저의 불찰... ㅠㅠ 결국은 함수포인터 써가면서 강제로 클래스 처럼 좀 써볼려고 발버둥 쳤다만 그로 인해 더더욱 개판이군요.


별로 참고할 만한 소스는 안되지만 혹시나 경고하건데 보면 미궁에 빠질지도 모릅니다.

일단 SMS 송,수신 그리고 전화송신,수신은 잘 되긴 합니다.

조금 불안정한게 있긴 하지만 나머지 미흡사항과 몇몇 부분들은 나중에 보완할 예정입니다.

신고

댓글을 달아 주세요

  1. 윤수리 2008.11.01 16:41 신고  댓글주소  수정/삭제  댓글쓰기

    너가 고생 많이 했어...

About



모바일 페이지 QR 코드

Counter

· Total
: 468,751
· Today
: 103
· Yesterday
: 142


DNS server, DNS service