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

Slides:



Advertisements
Similar presentations
C 언어 Sun Moon University 1 of 25 C 언어 : 강의소개 강의실 : 산 211 담당교수 : 고경철 ( 정보통신공학과 ) 사무실 : 산학협력관 105B 면담시간 : 수업후 1 시간
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
myCortex-LM8962 #2 LM3S8962의 개발환경 구축 BARAM 2010–2-3 바람 16기 이우석
MicroC/OS-II Structure
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
05. gcc, make, gdb.
제6장 FUSING.
개발 환경 개발 환경 개요 PXA270과 타겟 시스템 툴체인 환경 구축 JTAG 유틸리티 미니컴 Make 유틸리티
크로스 컴파일 환경 구축.
Makefile의 이해 ㈜FALinux 박진호.
제4장 Cross Compiler 설치.
누구나 쉽게 즐기는 C언어 콘서트 한남대학교 컴퓨터공학과 이 재 광 교수.
FUSING.
임베디드 프로그래밍 Lecture #
디바이스 드라이버.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
Linux를 이용한 Embedded 장비 개발
쉽게 풀어쓴 C언어 Express 제9장 함수와 변수 C Express.
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
MicroC/OS-II 1. Miscellaneous
임베디드 시스템 개론 3주차 Embedded System..
FND (Flexible Numeric Display)
Embedded System Porting (2)
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Step Motor Device Driver
Micro C/OS-II 2. Task Management
Audio, Mic, WLAN, CF, MPEG 경희대학교 컴퓨터공학과 조 진 성.
누구나 즐기는 C언어 콘서트 제2장 기초 사항.
부트 로더 (blob pre2 중심) Lecture #8.
개발 환경.
1장. 프로그래밍 언어, C 프로그래밍.
Geek-OS Project 정영진
UniSQL/X 실습과제 (1) ■ 실습 기간: ~
커널 모듈 프로그래밍 (Kernel Module Programming)
HBE-SMIII-SV210 리눅스 커널과 디바이스 드라이버
전자의료시스템 및 실습 C-언어 구 환 경희대학교 전자정보대학 동서의료공학과.
제 3 장 상수와 변수
임베디드 소프트웨어 설계.
1주차: 프로그래밍언어란 무엇인가? C 언어란? C 프로그래밍을 위한 준비
제 11 장 전처리기.
adopted from KNK C Programming : A Modern Approach
문자 디바이스 드라이버 임베디드 시스템.
Chapter 2 Lexical Elements, Operators, and the C System
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
cafe.naver.com/embeddedcrazyboys
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
Lecture Notes on Computer Networks 주 홍 택 컴퓨터공학과 계명대학교
5. Semaphores ㈜아이티즌 기술연구소
4. Time Management 아이티즌 기술연구소
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
쉽게 풀어쓴 C언어 Express 제2장 프로그램 개발 과정 C Express.
뇌를 자극하는 C 프로그래밍.
GDB - GNU Debugger 김진용.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Windows System Programming
Makefile
C.
Virtual Machine Management
어서와 C언어는 처음이지 제22장.
Lecture 7 7-Segment LED controller using u-controller
프로그래밍 기법 최적화 프로그래밍.
C프로그래밍 도구 컴퓨터공학과 강성인.
Presentation transcript:

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

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

MicroC/OS-II 설치 (Window)

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

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

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 코드

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

MicroC/OS-II Example #1

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

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 512 /* 각 Task의 스택 크기(WORD 항목 단위) */ #define N_TASKS 10 /* 같은 코드를 이용해서 생성할 Task 수 */ OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Task 스택 */ OS_STK TaskStartStk[TASK_STK_SIZE]; char TaskData[N_TASKS]; /* 각 Task에 넘겨줄 전달인자 */ OS_EVENT *RandomSem;

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) */ }

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를 생성해야만 한다.

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초 지연 */

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를 시스템에 추가한다.

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) }

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) */ }

MicroC/OS-II 설치 (Linux)

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

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)

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

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 512 /* Size of each task's stacks (# of WORDs) */ #ifdef DEVICE_CTRL #define N_TASKS 1 /* Number of identical tasks */ #else #define N_TASKS 4 /* 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참조)

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"); }

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

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 */ }

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: 표준 라이브러리를 사용하지 않는다

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

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

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