Presentation is loading. Please wait.

Presentation is loading. Please wait.

MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.

Similar presentations


Presentation on theme: "MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성."— Presentation transcript:

1 MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성

2 Contents MicroC/OS-II 설치 (Window 환경) MicroC/OS-II Example #1
MicroC/OS-II 설치 (Linux 환경) MicroC/OS-II 설치 및 실행 Sample code를 통한 응용 프로그램 구조 이해 Task Scheduling 이해 MicroC/OS-II 에서의 디바이스 제어

3 MicroC/OS-II 설치 (Window)

4 uC/OS-II File Structure
MicroC/OS-II 설치 uC/OS-II File Structure

5 MicroC/OS-II 설치 (Window) (Cont’d)
MicroC/OS-II 80X86에서 실행해보기 MicroC/OS-II 설치 1) MicroC/OS-II 책 CD에 있는 소스(Ver 2. 52)를 설치 2) uCOSV252.exe를 누른다. 3) 그림1에서 확인 버튼을 누른다. 4) 그림2에서 Unzip을 누른다. 5) C:\software 폴더가 생김을 확인한다. 6) C:\Software 폴더의 내용 확인 그림 1 그림 2

6 MicroC/OS-II 설치 (Window) (Cont’d)
MicroC/OS-II 80X86에서 실행해보기 SOFTWARE 폴더의 내용 확인 \SOFTWARE 루트디렉터리 \SOFTWARE\BLOCKS PC관련기능처리 \SOFTWARE\TO 유틸리티 \SOFTWARE\uCOS-II 메인디렉터리 \SOFTWARE\uCOS-II\EX1_x86L 예제 1 \SOFTWARE\uCOS-II\EX2_x86L 예제 2 \SOFTWARE\uCOS-II\EX3_x86L 예제 3 \SOFTWARE\uCOS-II\EXIx86L x68리얼모드 포팅 \SOFTWARE\uCOS-II\SOURCE uCOS-II 코드

7 MicroC/OS-II 설치 (Window) (Cont’d)
MicroC/OS-II 80X86에서 실행해보기 예제 #1 실행 1) C:\SOFTWARE\Ucos-ii\lx86L\BC45\TEST 2) TEST.EXE 파일을 실행시킨다.

8 MicroC/OS-II Example #1

9 MicroC/OS-II Example #1
Example #1은 MicroC/OS-II의 기본적인 멀티캐스팅 수행 능력을 보여준다. 10개의 Task가 화면상 임의 위치에 각각 0에서 9사이의 숫자를 표시 Example #1은 13개의 Task로 구성된다. 내부적으로 Idle Task와 CPU 사용률을 계산하는 Task를 생성

10 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C (1) MicroC/OS-II 에는 #include 문이 하나만 있다. 필요한 모든 헤더 파일을 마스터 헤더 파일인 ‘INCLUDES.H’에 포함되어 있음 SOURCE 디렉토리의 ‘INCLUDES.H’에서 확인할 수 있음 #include “includes.h” (1) #define TASK_STK_SIZE /* 각 Task의 스택 크기(WORD 항목 단위) */ #define N_TASKS /* 같은 코드를 이용해서 생성할 Task 수 */ OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Task 스택 */ OS_STK TaskStartStk[TASK_STK_SIZE]; char TaskData[N_TASKS]; /* 각 Task에 넘겨줄 전달인자 */ OS_EVENT *RandomSem;

11 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, Main() (1) 커널 서비스를 사용하기 전에 OSInit()함수를 호출해야 하는 것은 MicroC/OS-II의 요구사항이다. OSInit()함수는 Idle Task와 CPU 사용률을 계산하는 Task를 생성한다. void main (void) { PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* DOS 화면 지우기 */ OSInit(); /* uC/OS-II 초기화 (1)*/ PC_DOSSaveReturn(); /* DOS 환경 저장 */ PC_VectSet(uCOS, OSCtxSw); /* uC/OS-II 문맥전환 벡터 설정 */ RandomSem = OSSemCreate(1); /* Random Number용 세마포어 */ OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0); (2) OSStart(); /* 멀티태스킹 시작 (3) */ }

12 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, Main() (2) 멀티캐스팅을 시작하기 전에 최소한 하나 이상의 Task를 생성해야만 한다 이 예제에서는 이 Task를 TaskStart()라고 하였다 Task를 생성하는 이유는 MicroC/OS-II가 이 Task를 관리하도록 하기 위해서이다. 참고) 우선순위의 수가 작을수록 실제 우선순위는 높다 각 Task는 서로 다른 크기의 스택 영역을 가질 수 있지만 예제를 단순히 만들기 위해 모두 같은 크기를 갖도록 함. (3) 멀티캐스팅을 시작하기 위해 OSStart()함수를 호출해서 MicroC/OS-II로 제어를 넘긴다. 참고) OSStart()를 호출하기 전에 반드시 1개 이상의 Task를 생성해야만 한다.

13 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, TaskStart() void TaskStart (void *data) { UBYTE i; char s[100]; WORD key; data = data; /* 컴파일러 경고 방지 */ OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); /* uC/OS-II 클럭 틱 ISR 설치 */ PC_SetTickRate(OS_TICKS_PER_SEC); /* 틱 주기 재설정 */ OS_EXIT_CRITICAL(); OSStatInit(); /* uC/OS-II 통계모듈 초기화 (1) */ TaskStartCreateTasks(); (2) for (;;) { if (PC_GetKey(&key) == TRUE) { /* 키가 눌렸는지 확인 */ if (key == 0x1B) { /* 예, ESCAPE 키인지 확인 */ PC_DOSReturn(); /* DOS로 복귀 */ } OSCtxSwCtr = 0; OSTimeDlyHMSM(0, 0, 1, 0); /* 1초 지연 */

14 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, TaskStart() (1) CPU의 성능을 측정하기 위해 OSStatInit()함수를 호출 이 함수는 모든 Task가 CPU를 실제 몇 %나 사용하는지 알 수 있도록 해준다. (2) TaskStart() 함수는 TaskStartCreateTasks()함수를 호출해서 MicroC/OS-II가 다른 Task를 관리하도록 한다. 이 함수는 N_TASKS개의 동일 Task를 시스템에 추가한다.

15 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, TaskStartCreateTasks() (1) 루프는 Task()라는 N_TASKS개의 동일 Task를 초기화한다 각 Task는 1부터 10까지의 고유한 우선순위를 갖는다. Static void TaskStartCreateTasks ( void ) { INT8U i; for ( i = 0; i < N_TASKS; i++ ) { TaskData [ i ] = ‘0’ + i ; OSTaskCreate ( Task , ( void * ) & TaskData[ i ] , &TaskStk [ i ] [ TASK_STK_SIZE – 1], i + 1 ) ; (1) }

16 MicroC/OS-II Example #1 (Cont’d)
Example #1, Test.C, Task() MicroC/OS-II는 전형적으로 무한루프 형태이다. (1) Task()는 OSTimeDly()를 호출해서 자신은 실행을 멈출 것이며 다른 Task를 실행하도록 MicroC/OS-II에게 알려준다. void Task (void *data) { INT8U x; INT8U y; INT8U err; for (;;) { OSSemPend(RandomSem, 0, &err); /* 랜덤 넘버 함수를 사용하기 위해 세마포어 획득 */ x = random(80); /* 태스크 번호를 표시할 X 좌표 결정 */ y = random(16); /* 태스크 번호를 표시할 Y 좌표 결정 */ OSSemPost(RandomSem); /* 세마포어 반납 */ PC_DispChar(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY); OSTimeDly(1); /* 1 클럭 틱 지연 (1) */ }

17 MicroC/OS-II 설치 (Linux)

18 MicroC/OS-II 설치 (Linux)
1. 알맞은 디렉토리에서 해당 소스 코드를 설치한다. 2. 설치한 디렉토리에서 make 명령어 수행

19 MicroC/OS-II 설치 (Linux) (Cont’d)
3. make 실행 후 uC/OS-II 라는 이미지가 생성된 것을 확인한다. 4. MicroC/OS-II가 실행되는 것을 확인하기 위해 jtag을 이용하여 Board에 Fusing한다. Jtag) cable parallel 0x378 PXA255 Jtag) detect Jtag) flashmem 0 uC/OS-II ( 0번지 uC/OS-II 이미지를 Fusing)

20 MicroC/OS-II 설치 (Linux) (Cont’d)
5. minicom을 실행 후 Board의 전원을 off, on 시킨다.

21 MicroC/OS-II 설치 (Linux) (Cont’d)
Sample Code를 통한 응용 프로그램 구조 이해 #include "stdio.h" #include "includes.h" #include "pxa255.h" extern void SerialInit(void); #define TASK_STK_SIZE /* Size of each task's stacks (# of WORDs) */ #ifdef DEVICE_CTRL #define N_TASKS /* Number of identical tasks */ #else #define N_TASKS /* Number of identical tasks */ #endif OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */ OS_STK TaskStartStk[TASK_STK_SIZE]; void Device_Ctrl_Task(void *data); extern void led_test(); extern void fnd_test(); extern char dev_ctl_main(); void TaskStart(void *data); /* Function prototypes of Startup task */ void Task1(void *data); /* Function prototypes of tasks */ void Task2(void *data); /* Function prototypes of tasks */ void Task3(void *data); 응용 프로그램 종류에 (Device Control/Scheduling) 따라 선택적으로 확인하기 위해서 선언 (os_cfg.h참조)

22 MicroC/OS-II 설치 (Linux) (Cont’d)
Sample Code를 통한 응용 프로그램 구조 이해 void main(void) { SerialInit(); /* Initialize Serial printf("\n"); printf("| |\n"); printf("| |\n"); printf("| Welcome to uC/OS-ll |\n"); OSInit(); /* Initialize uC/OS-II */ printf("\n[uC/OS-ll OSInitialization] OSInit() [ok]\n"); #ifdef DEVICE_CTRL OSTaskCreate(Device_Ctrl_Task,"Device_Ctrl_Task",&TaskStk[0][TASK_STK_SIZE - 1],3); #else OSTaskCreate(TaskStart, (void *)0,&TaskStartStk[TASK_STK_SIZE - 1], 3); #endif printf("\n[uC/OS-ll OS Task Create] OSTaskCreate() [ok]\n"); OSStart(); /* Start multitasking */ printf("\n[uC/OS-ll OS Start] OSStart() [ok]\n"); }

23 MicroC/OS-II 설치 (Linux) (Cont’d)
Sample Code를 통한 응용 프로그램 구조 이해 #ifdef DEVICE_CTRL void Device_Ctrl_Task(void *data) { printf("[uC/OS-ll Task Start] Device_Control_Task() [ok]\n"); OSTimer0_Period_Setting(); OSTimer0_Interrupt_Setting(); /* Timer Enable */ char key; for (;;) while((key = dev_ctl_main()) != 0 ) switch(key) case '1': led_test(); break; case '2': fnd_test(); break; case 'q': printf("\nexit\n"); break; } #else

24 MicroC/OS-II 설치 (Linux) (Cont’d)
Sample Code를 통한 응용 프로그램 구조 이해 #else void TaskStart (void *data) { printf("[uC/OS-ll Task Start] TaskStart() [ok]\n"); OSTimer0_Period_Setting(); OSTimer0_Interrupt_Setting(); /* Timer Enable */ OSStatInit(); /* Initialize uC/OS-II's statistics */ printf("[uC/OS-ll OS Stat Initialization] OSStatInit() [ok]\n"); OSTaskCreate(Task1,"Task1",&TaskStk[0][TASK_STK_SIZE - 1],4); OSTaskCreate(Task2,"Task2",&TaskStk[1][TASK_STK_SIZE - 1],5); OSTaskCreate(Task3,"Task3",&TaskStk[2][TASK_STK_SIZE - 1],6); for (;;) { printf("\n"); printf(" \n"); printf("Running Task : %5d\n", OSTaskCtr); /* Display #tasks running */ printf("Cpu Usage : %3d\n", OSCPUUsage); /* Display CPU usage in % */ /* Display #context switches per second */ printf("Context Switches per Sec : %5d\n",(int)OSCtxSwCtr); OSCtxSwCtr = 0; OSTimeDlyHMSM(0, 0, 1, 0); /* Wait one second */ }

25 MicroC/OS-II 설치 (Linux) (Cont’d)
Makefile CC = arm-linux-gcc OBJCOPY = arm-linux-objcopy NM = arm-linux-nm OBJDUMP = arm-linux-objdump INCLUDE = -I./ CFLAGS = -O1 -Wall -mcpu=xscale -mtune=xscale -msoft-float -fno-builtin -fomit-frame-pointer -mapcs-32 -nostdinc $(INCLUDE) OCFLAGS = -O binary -R .note -R .comment -S LDFLAGS = -static -nostdlib -e reset -Wl,-T,./ld-xscale COMPILE = $(CC) $(CFLAGS) CFILES = $(wildcard *.c) OBJECT = $(CFILES:%.c=%.o) TARGET_IMAGE = uCOS-II -mtune=xscale: xscale타입으로 최적화하라는 의미 -nostdinc: 표준 헤더 파일 디렉토리를 참조하지 말하는 의미 -msoft-float: 실수연산에 대한 처리는 코프로세스를 이용하지 않은 소프트웨어 연산을 처리하라는 의미 -fno-builtin: 표준 라이브러리와 링크되지 말고 단독으로 링크하라는 의미 -static: 공유 라이브러리를 포함하지 않고 모든 라이브러리는 실행 코드에 포함한다 -nostdlib: 표준 라이브러리를 사용하지 않는다

26 MicroC/OS-II 설치 (Linux) (Cont’d)
Makefile all : $(OBJECT) os_cpu_a.o start_up.o $(CC) $(INCLUDE) $(CFLAGS) $(LDFLAGS) -o $(TARGET_IMAGE)-elf32 start_up.o os_cpu_a.o $(OBJECT) -lgcc $(OBJCOPY) $(OCFLAGS) $(TARGET_IMAGE)-elf32 $(TARGET_IMAGE) $(NM) $(TARGET_IMAGE)-elf32 > $(TARGET_IMAGE).map $(OBJDUMP) -D $(TARGET_IMAGE)-elf32 > $(TARGET_IMAGE).dis .c.o : $(COMPILE) -c $< .S.o : clean : rm -rf *.o rm -rf $(TARGET_IMAGE) $(TARGET_IMAGE)-elf32 rm -rf $(TARGET_IMAGE).dis $(TARGET_IMAGE).map rm -rf *.*.bak header/*.*.bak

27 MicroC/OS-II 설치 (Linux)
Task Scheduling 이해 Os_cfg.h에 정의된 #define DEVICE_CTRL 을 주석처리 후 make 수행하여 얻어진 이미지

28 MicroC/OS-II 설치 (Linux)
MicroC/OS-II에서의 Device 제어 Os_cfg.h에 정의된 #define DEVICE_CTRL 을 정의한 후 make 수행하여 얻어진 이미지 Device를 추가 및 수정하기 위해서는 해당 Memory map에 대한 고려가 필요하다.


Download ppt "MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성."

Similar presentations


Ads by Google