Micro COSII Lab Embedded System Lab II Contents
Micro. C/OS-II Lab. 경희대학교 컴퓨터공학과 조진성 Embedded System Lab. II
Contents n Micro. C/OS-II 설치 (Window 환경) n Micro. C/OS-II Example #1 n Micro. C/OS-II 설치 (Linux 환경) ü ü Micro. C/OS-II 설치 및 실행 Sample code를 통한 응용 프로그램 구조 이해 Task Scheduling 이해 Micro. C/OS-II 에서의 디바이스 제어 Embedded System Lab. II 1
Micro. C/OS-II 설치 (Window) Embedded System Lab. II
Micro. C/OS-II 설치 u. C/OS-II File Structure Embedded System Lab. II 3
Micro. C/OS-II 설치 (Window) (Cont’d) n Micro. C/OS-II 80 X 86에서 실행해보기 ü SOFTWARE 폴더의 내용 확인 Ø SOFTWAREBLOCKS Ø SOFTWARETO Ø SOFTWAREu. COS-IIEX 1_x 86 L Ø SOFTWAREu. COS-IIEX 2_x 86 L Ø SOFTWAREu. COS-IIEX 3_x 86 L Ø SOFTWAREu. COS-IIEXIx 86 L Ø SOFTWAREu. COS-IISOURCE Embedded System Lab. II 루트디렉터리 PC관련기능처리 유틸리티 메인디렉터리 예제 1 예제 2 예제 3 x 68리얼모드 포팅 u. COS-II 코드 5
Micro. C/OS-II 설치 (Window) (Cont’d) n Micro. C/OS-II 80 X 86에서 실행해보기 ü 예제 #1 실행 1) C: SOFTWAREUcos-iilx 86 LBC 45TEST 2) TEST. EXE 파일을 실행시킨다. Embedded System Lab. II 6
Micro. C/OS-II Example #1 Embedded System Lab. II
Micro. C/OS-II Example #1 (Cont’d) n Example #1, Test. C #include “includes. h” #define TASK_STK_SIZE #define N_TASKS OS_STK char OS_EVENT (1) 512 10 /* 각 Task의 스택 크기(WORD 항목 단위) /* 같은 코드를 이용해서 생성할 Task 수 Task. Stk[N_TASKS][TASK_STK_SIZE]; Task. Start. Stk[TASK_STK_SIZE]; Task. Data[N_TASKS]; *Random. Sem; */ */ /* Task 스택 */ /* 각 Task에 넘겨줄 전달인자 */ ü (1) Micro. C/OS-II 에는 #include 문이 하나만 있다. Ø 필요한 모든 헤더 파일을 마스터 헤더 파일인 ‘INCLUDES. H’에 포함되어 있음 Ø SOURCE 디렉토리의 ‘INCLUDES. H’에서 확인할 수 있음 Embedded System Lab. II 9
Micro. C/OS-II Example #1 (Cont’d) n Example #1, Test. C, Main() void main (void) { PC_Disp. Clr. Scr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* DOS 화면 지우기 */ OSInit(); /* u. C/OS-II 초기화 (1)*/ PC_DOSSave. Return(); /* DOS 환경 저장 */ PC_Vect. Set(u. COS, OSCtx. Sw); /* u. C/OS-II 문맥전환 벡터 설정 */ Random. Sem = OSSem. Create(1); /* Random Number용 세마포어 */ OSTask. Create(Task. Start, (void *)0, (void *)&Task. Start. Stk[TASK_STK_SIZE - 1], 0); (2) OSStart(); /* 멀티태스킹 시작 (3) */ } ü (1) 커널 서비스를 사용하기 전에 OSInit()함수를 호출해야 하는 것은 Micro. C/OS-II의 요구사항이다. Ø OSInit()함수는 Idle Task와 CPU 사용률을 계산하는 Task를 생성한다. Embedded System Lab. II 10
Micro. C/OS-II Example #1 (Cont’d) n Example #1, Test. C, Task. Start() void Task. Start (void *data) { UBYTE i; char s[100]; WORD key; data = data; /* 컴파일러 경고 방지 */ OS_ENTER_CRITICAL(); PC_Vect. Set(0 x 08, OSTick. ISR); PC_Set. Tick. Rate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); /* u. C/OS-II 클럭 틱 ISR 설치 /* 틱 주기 재설정 */ */ OSStat. Init(); Task. Start. Create. Tasks(); /* u. C/OS-II 통계모듈 초기화 for (; ; ) { if (PC_Get. Key(&key) == TRUE) { if (key == 0 x 1 B) { PC_DOSReturn(); } } OSCtx. Sw. Ctr = 0; OSTime. Dly. HMSM(0, 0, 1, 0); } } Embedded System Lab. II 12 (1) (2) */ /* 키가 눌렸는지 확인 /* 예, ESCAPE 키인지 확인 /* DOS로 복귀 */ */ */ /* 1초 지연 */
Micro. C/OS-II Example #1 (Cont’d) n Example #1, Test. C, Task. Start. Create. Tasks() Static void Task. Start. Create. Tasks ( void ) { INT 8 U i; for ( i = 0; i < N_TASKS; i++ ) { Task. Data [ i ] = ‘ 0’ + i ; OSTask. Create ( Task , ( void * ) & Task. Data[ i ] , &Task. Stk [ i ] [ TASK_STK_SIZE – 1], i+1); } } ü (1) 루프는 Task()라는 N_TASKS개의 동일 Task를 초기화한다. 각 Task는 1부터 10까지의 고유한 우선순위를 갖는다. Embedded System Lab. II 14 (1)
Micro. C/OS-II Example #1 (Cont’d) n Example #1, Test. C, Task() void Task (void *data) { INT 8 U x; INT 8 U y; INT 8 U err; for (; ; ) { OSSem. Pend(Random. Sem, 0, &err); /* 랜덤 넘버 함수를 사용하기 위해 세마포어 획득 x = random(80); /* 태스크 번호를 표시할 X 좌표 결정 y = random(16); /* 태스크 번호를 표시할 Y 좌표 결정 OSSem. Post(Random. Sem); /* 세마포어 반납 PC_Disp. Char(x, y + 5, *(char *)data, DISP_FGND_LIGHT_GRAY); OSTime. Dly(1); /* 1 클럭 틱 지연 (1) } */ */ */ } ü Micro. C/OS-II는 전형적으로 무한루프 형태이다. ü (1) Task()는 OSTime. Dly()를 호출해서 자신은 실행을 멈출 것이며 다른 Task를 실행하도록 Micro. C/OS-II에게 알려준다. Embedded System Lab. II 15
Micro. C/OS-II 설치 (Linux) Embedded System Lab. II
Micro. C/OS-II 설치 (Linux) (Cont’d) n Micro. C/OS-II (Linux) 설치 및 실행 ü 3. make 실행 후 u. C/OS-II 라는 이미지가 생성된 것을 확인한다. ü 4. Micro. C/OS-II가 실행되는 것을 확인하기 위해 jtag을 이용하여 Board에 Fusing한다. Ø Jtag) cable parallel 0 x 378 PXA 255 Ø Jtag) detect Ø Jtag) flashmem 0 u. C/OS-II ( 0번지 u. C/OS-II 이미지를 Fusing) Embedded System Lab. II 18
Micro. C/OS-II 설치 (Linux) (Cont’d) n Micro. C/OS-II (Linux) 설치 및 실행 ü 5. minicom을 실행 후 Board의 전원을 off, on 시킨다. Embedded System Lab. II 19
Micro. C/OS-II 설치 (Linux) (Cont’d) n Sample Code를 통한 응용 프로그램 구조 이해 #include "stdio. h" #include "includes. h" #include "pxa 255. h" extern void Serial. Init(void); #define TASK_STK_SIZE #ifdef DEVICE_CTRL #define N_TASKS #else #define N_TASKS #endif OS_STK 512 1 /* Number of identical tasks */ 4 /* Number of identical tasks */ Task. Stk[N_TASKS][TASK_STK_SIZE]; Task. Start. Stk[TASK_STK_SIZE]; #ifdef DEVICE_CTRL void Device_Ctrl_Task(void *data); extern void led_test(); extern void fnd_test(); extern char dev_ctl_main(); #else void Task. Start(void *data); Task 1(void *data); Task 2(void *data); Task 3(void *data); /* Size of each task's stacks (# of WORDs) */ /* Tasks stacks 응용 프로그램 종류에 (Device Control/Scheduling) 따라 선택적으로 확인하기 위해서 선언 (os_cfg. h참조) /* Function prototypes of Startup task /* Function prototypes of tasks #endif Embedded System Lab. II 20 */ */
Micro. C/OS-II 설치 (Linux) (Cont’d) n Sample Code를 통한 응용 프로그램 구조 이해 void main(void) { Serial. Init(); printf("n"); printf("|--------------------------------|n"); printf("| Welcome to u. C/OS-ll |n"); printf("|--------------------------------|n"); /* Initialize Serial OSInit(); printf("n[u. C/OS-ll OSInitialization] OSInit(). . . [ok]n"); /* Initialize u. C/OS-II */ #ifdef DEVICE_CTRL OSTask. Create(Device_Ctrl_Task, "Device_Ctrl_Task", &Task. Stk[0][TASK_STK_SIZE - 1], 3); #else OSTask. Create(Task. Start, (void *)0, &Task. Start. Stk[TASK_STK_SIZE - 1], 3); #endif printf("n[u. C/OS-ll OS Task Create] OSTask. Create(). . . . . [ok]n"); OSStart(); printf("n[u. C/OS-ll OS Start] OSStart(). . . . [ok]n"); /* Start multitasking } Embedded System Lab. II 21 */
Micro. C/OS-II 설치 (Linux) (Cont’d) n Sample Code를 통한 응용 프로그램 구조 이해 #ifdef DEVICE_CTRL void Device_Ctrl_Task(void *data) { printf("[u. C/OS-ll Task Start] Device_Control_Task(). . . . [ok]n"); OSTimer 0_Period_Setting(); OSTimer 0_Interrupt_Setting(); /* Timer Enable char key; for (; ; ) { while((key = dev_ctl_main()) != 0 ) { switch(key) { case '1': led_test(); case '2': fnd_test(); case 'q': printf("nexitn"); } } break; } } #else Embedded System Lab. II 22 */
Micro. C/OS-II 설치 (Linux) (Cont’d) n Sample Code를 통한 응용 프로그램 구조 이해 #else void Task. Start (void *data) { printf("[u. C/OS-ll Task Start] Task. Start(). . . . [ok]n"); OSTimer 0_Period_Setting(); OSTimer 0_Interrupt_Setting(); OSStat. Init(); printf("[u. C/OS-ll OS Stat Initialization] OSStat. Init(). . . . [ok]n"); /* Timer Enable */ /* Initialize u. C/OS-II's statistics */ OSTask. Create(Task 1, "Task 1", &Task. Stk[0][TASK_STK_SIZE - 1], 4); OSTask. Create(Task 2, "Task 2", &Task. Stk[1][TASK_STK_SIZE - 1], 5); OSTask. Create(Task 3, "Task 3", &Task. Stk[2][TASK_STK_SIZE - 1], 6); for (; ; ) { printf("n"); printf("--------------------n"); printf("Running Task : %5 dn", OSTask. Ctr); printf("Cpu Usage : %3 dn", OSCPUUsage); /* Display #tasks running */ /* Display CPU usage in % */ /* Display #context switches per second printf("Context Switches per Sec : %5 dn", (int)OSCtx. Sw. Ctr); printf("--------------------n"); OSCtx. Sw. Ctr = 0; OSTime. Dly. HMSM(0, 0, 1, 0); /* Wait one second } } Embedded System Lab. II 23 */ */
Micro. C/OS-II 설치 (Linux) (Cont’d) n Makefile CC = arm-linux-gcc OBJCOPY = arm-linux-objcopy NM = arm-linux-nm OBJDUMP = arm-linux-objdump INCLUDE = -I. / -mtune=xscale: xscale타입으로 최적화하라는 의미 -nostdinc: 표준 헤더 파일 디렉토리를 참조하지 말하는 의미 -msoft-float: 실수연산에 대한 처리는 코프로세스를 이용하지 않은 소프트웨어 연산을 처리하라는 의미 -fno-builtin: 표준 라이브러리와 링크되지 말고 단독으로 링크하라는 의미 CFLAGS = -O 1 -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 = u. COS-II Embedded System Lab. II -static: 공유 라이브러리를 포함하지 않고 모든 라이브러리는 실행 코드에 포함한다 -nostdlib: 표준 라이브러리를 사용하지 않는다 24
Micro. C/OS-II 설치 (Linux) (Cont’d) n Makefile all : $(OBJECT) os_cpu_a. o start_up. o $(CC) $(INCLUDE) $(CFLAGS) $(LDFLAGS) -o $(TARGET_IMAGE)-elf 32 start_up. o os_cpu_a. o $(OBJECT) -lgcc $(OBJCOPY) $(OCFLAGS) $(TARGET_IMAGE)-elf 32 $(TARGET_IMAGE) $(NM) $(TARGET_IMAGE)-elf 32 > $(TARGET_IMAGE). map $(OBJDUMP) -D $(TARGET_IMAGE)-elf 32 > $(TARGET_IMAGE). dis. c. o : $(COMPILE) -c $<. S. o : $(COMPILE) -c $< clean : rm -rf *. o rm -rf $(TARGET_IMAGE)-elf 32 rm -rf $(TARGET_IMAGE). dis $(TARGET_IMAGE). map rm -rf *. *. bak header/*. *. bak Embedded System Lab. II 25
Micro. C/OS-II 설치 (Linux) n Task Scheduling 이해 Os_cfg. h에 정의된 #define DEVICE_CTRL 을 주석처리 후 make 수행하여 얻어진 이미지 Embedded System Lab. II 26
Micro. C/OS-II 설치 (Linux) n Micro. C/OS-II에서의 Device 제어 Os_cfg. h에 정의된 #define DEVICE_CTRL 을 정의한 후 make 수행하여 얻어진 이미지 Device를 추가 및 수정하기 위해서는 해당 Memory map에 대한 고려가 필요하다. Embedded System Lab. II 27
- Slides: 28