본문 바로가기
uC/OS2 포팅 완료까지의 절차가 어떻게 되죠?

뭘 알아야 이해를 하지

네 번째, 어플리케이션 프로그램 단계랍니다. 어플리케이션 프로그램 개발까지 가려면 우선 가장 기본적인 포팅 과정을 거쳐야 해요.
개발자가 uC/OS2 포팅을 위해서는 아래의 순서대로 하시면 된답니다. 여기서 3번째가 바로 어플리케이션 프로그램 개발 단계랍니다.

Startup.s 파일이 제일 먼저 실행되어야 하는 파일이죠. 이 파일은 개발자가 어떻게 프로그램 하느냐에 따라 조금씩 달라지지만 반드시 해야 되는 부분만 정리해 볼게요.
와치독 디세이블(Watchdog disable)을 먼저하고, 인터럽트 디세이블(Interrupt disable)과 시피유 및 주변 장치 클럭 설정을 해 주세요. 그리고 에스디 램이 접근 가능하도록 해야 스택 공간이 확보가 되겠죠. 끝으로 초기화 되지 않는 변수들을 초기화를 해 주고 나면, 씨 언어의 main함수로 진입을 하게 한답니다.

소스 코드를 확인해 보죠.

A단계, 와치독 디세이블을 하기 위해서는 와치독 관련 레지스터 주소와 데이타 값을 알아야 하죠. WTCON을 시피유 데이타 시트에서 찾아보니 0x5300 0000 주소이며, 0 bit 값이 '0' 으로 입력이 되면 디세이블이 된다고 나와 있군요.


이제 프로그램을 하면 아래와 같아요.


B단계, 인터럽트 디세이블과 시피유 및 주변 장치 클럭 설정을 해 주세요.
Main Interrupt에 대한 레지스터 설명을 보니 아래와 같이 나와 있군요. 디세이블을 하기 위해서는 모두 0xFFFF FFFF값으로 넣어 주면 되지요.


Sub Interrupt가 있답니다. 여기도 마찬가지로 0x7FF 값으로 넣어 주세요.

이제 다음으로 클럭 설정이랍니다. 제일 먼저 클럭 분주를 설정해야 하는데 FCLK, HCLK, PCLK 3개로 구성되어 있어요. FCLK는 주로 ARM920T 프로세서에서 사용되고, HCLK는 AHB bus 또는 ARM920T 프로세서, 메모리 컨트롤러, 인터럽트, 엘시디 컨트롤러, DMA와 USB Host에서 사용된답니다. PCLK는 APB 버스에서 사용되는 페리퍼럴쪽인데 WTD, IIS, I2C, PWM timer, MMC interface, ADC, UART, GPIO, RTC 그리고 SPI에서 사용됩니다. 각각 분주는 1:1:1이 기본값이지만 1:2:4를 추천한다고 되어 있어요. 개발자 마음이지만 이왕이면 추천하는 대로 해야 안전하지요. 마지막으로 Input frequency를 설정한답니다. MPLL이라고 하죠.

C 단계, 이제 에스디 램을 읽고 쓰기를 할 수 있는 메모리 컨트롤러 설정이랍니다. BWSCON은 0x4800 0000 번지이고 데이타 값을 입력하면 되죠. 데이타 값은 Bus width & wait status 과 같은 값이랍니다. 이처럼 메모리 컨트롤러에 해당 되는 모든 내용을 설정해 주면 되지요.


D단계, 다음으로는 암 코어에는 6개의 모드가 있는데, 각 모드에서 스택을 사용해야 하기 때문에 스택 주소를 지정하게 한답니다.


E단계, 초기화 되는 않는 변수를 초기화 시켜 준답니다.
예를 들면,


이러한 변수들을 말하지요.


F단계, 이제 마지막으로 mian.c 함수로 점프를 한답니다.

main.c에서는 가장 먼저 인터럽트를 인에이블을 시켜 주시고, 인터럽트 서비스 루틴을 등록을 한 후 uC/OS2 시작 함수로 가보자구요. ㅎㅎ

이제 어플리케이션을 만들어 보도록 하죠.
개발자는 여기서부터 어플리케이션을 만들면 된답니다. 어플리케이션 개발의 첫 단계가 uC/OS2 초기화 과정을 거친 후 어플리케이션에 해당하는 태스크를 생성하면 된답니다. OSInit 함수에서 OS_TaskIdle, OS_TaskStat 라는 두 개의 태스크를 만든답니다. 그리고 APP_vMain 함수 마지막에서 "TaskStart"라는 태스크를 만들어요.


여기서 Task1과 Task2의 태스크를 만들고 본격적으로 어플리케이션이 실행하게 되죠.



Task1에 대한 어플리케이션이랍니다.

Task2에 대한 어플리케이션이랍니다.


이렇게 해서 Task10까지 만들어 보고, 하드웨어 디버거인 JTAG 장비를 통해서 디버깅 환경을 만들어 Task의 상태를 보도록 해 보죠. JTAG 장비를 이용해서 디버깅을 하기 위한 스크립트가 필요하답니다.

하드웨어 디버거로 TASK 상태를 확인해 보니 아래와 같이 보이네요.

각 태스크의 스택 사용량에 대하 알아 보니 아래와 같이 나오는 군요.

TaskStart 태스크의 TCB를 보도록 하죠. 현재 태스크의 스택 사이즈나 우선 순위 값들을 자세히 볼 수가 있군요.

여기까지 해서 uC/OS2 포팅 과정을 마무리 하도록 할게요.


Startup.s – “301” 인터럽트 – “206” 변수 초기화 – “303” 하드웨어 디버거 – “207”

Linked at 친절한 임베디드 시스템 개발자.. at 2010/08/15 23:19

... sp; 402 ARM Processor에 uC/OS2 포팅을 위한 준비사항은? 403 uC/OS2 포팅 완료까지의 절차가 어떻게 되죠? 404 ARM 프로세서에 Linux 포팅을 위한 준비사항은? &nbs ... more

Commented by highseek at 2010/08/15 23:32
에.. 어플리케이션 단계에서 중간에 좀 많이 빠졌는데요.

typedef 도 새로 해줘야 하고, 스택프레임도 하드웨어에 맞게 새로 잡아야 하고.. 컨텍스트 스위칭 부분도 어셈블리로 되어있어, 타겟에 맞게 맞추어야 합니다. 내부구현을 새로 해야 할 함수가 꽤 될 텐데요.. (OSStartHighRdy, OSCtxSw, OSIntCtxSw, OSTickISR 등)

이미 다 arm용으로 맞추어놓은 소스를 쓰는 것으로 가정하신 건가요?
Commented by soto at 2010/08/16 06:06
네..
제가 그 부분에 대한 내용은 언급을 하지 않았네요.
ARM 용 uc/os2를 사용해야 합니다.
uc/os 웹페이지에 들어가시면 ARM920t에 맞게 만들어진 source가 있답니다.
감사요~~!!
Commented by highseek at 2010/08/16 16:40
음. 굳이 설명까지는 하지 않더라도, 언급은 하시는 게 좋을 것 같습니다. 최소한 그런 게 있다 정도는 알아야 할 것 같네요.

또 실제 웹에 포팅소스가 없는 보드에 해야 할 때도 있어서..(...)
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.
친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -