E D R , A S I H C RSS

Chapter I - Sample Code

RenameThisPage : 페이지 이름 수정 필요. 궁리중 --1002


1. Chapter 1

1.1. Sample Code

이런저런 소개들. (컴파일러는 무엇을 사용한다. 머 어쩌구저쩌구.)

1.2. Installing uCOS-II

인스톨하는 방법인데 별 필요 없을듯.. 우리가 직접 uCOS-II 를 설치하진 않을꺼니까.. 차라리 소스를 구해다가 컴파일을 하면 몰라도.

1.3. INCLUDES.H

모든 .c 파일에서 인클루드되는 헤더파일이다. 이 파일의 내용은 타겟프로세서마다 다르게 적용시켜야한다.

1.4. Compiler-Independent Data Types

프로세서마다 각각 가지고 있는 특성이 다르기 때문에 우리가 포팅하려는 타겟 CPU에 맞춰 여러가지 글로벌 변수를 선언해줘야 한다. (글로벌 변수라기보다는 키워드 재정의라고 말하는게 더 맞겠다)

각각의 프로세서마다 int 형 데이터의 크기 char 형 데이터의 크기.. 등등이 다르기 때문에 다음과 같은 식으로 재정의를 해준다.
~cpp 
   // 형 재정의
   typedef ungisned char BOOLEAN;
   typedef unsigned char INT8U
   typedef signed int INT16S
   ...
   // 형 재정의 (#define이용)
   #define BYTE INT8S
   ...
  

1.5. Global Variables

OS 를 작성하다보면 전역변수가 필요한 경우가 있다. 전역변수는 어떻게 선언하는가? extern 키워드를 사용하면 된다. 하지만 uCOS-II 에서는 extern 키워드마저 #define 해서 다른 매크로로 사용한다.
~cpp 
 #ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT_extern
#endif
   
위처럼 다음과 같이 매크로 정의를 해 놓고 다음과 같은 소스를 적용시킨다고 해 보자
~cpp 
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
  
그럼 실제 코드는 (컴파일시) 다음과 같이 적용된다는것을 알 수 있다.
~cpp 
extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;
  
만약 다음과 같이 OS_GLOBALS라는 매크로를 미리 적용시키면 형 정의가 되지 않은 상태이므로 (위의 #ifdef~#else 에서 #else 절에 걸리게 된다) 다음과 같은 코드가 된다.
~cpp 
#define OS_GLOBALS
#include "inlcudes.h"
  
실제 적용은 아래와같이
~cpp 
INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;
  
즉, 변수는 Local 하게 선언된다는 것을 알 수 있다.

1.6. OS_ENTER_CRITICAL and OS_EXIT_CRITICAL

OS에서 공유자원이나 특정코드가 수행되는 도중에 다른 프로세스에 의해 interrupt 되는것을 방지하기 위해 크리티컬 섹션을 사용하게 된다. 이는 윈도우즈 프로그래밍에서 스레드관련 처리를 해 줄 때에도 나오는 용어이다. uCOS-II에서는 단순히 매크로함수를 이용해 크리티컬섹션에 들어오기와 나오기를 한다. 매크로함수가 하는 일은 단순히 인터럽트를 무효화, 유효화 시키는것 뿐이다.
~cpp 
#define OS_CRITICAL_METHOD

#if OS_CRITICAL_METHOD == 1 // OS_CRITICAL_METHOD 는 어디선가 이미 정의되어있다. 아마 CPU에 따라 다르게 값이 정해져 있을것이다.
#define OS_ENTER_CRITICAL() asm CLI
#deifne OS_EXIT_CRITICAL() asm STI
#endif

#if OS_CRITICAL_METHOD == 2
#define OS_ENTER_CRITICAL() asm {PUSHF; CLI}  // PUSHF가 몬지는 잘 모르겠다. 아마 스택에 무얼 집어넣는것 같은데.
                                              // PUSHF는 CPU레지스터를 하나씩 일일이 스택에 넣는 작업을 간편하게 하기 위하여 호출 하는 ASM명령으로 정해진 순서에 
                                              // 의해 모든 레지스터의 내용을 스택에 PUSH하는 명령임. 반대는 POPF로 PUSHF의 역순으로 스택에서 꺼낸 데이터로 각각의                                            // 레지스터를 변경 시킴. 항상 이 두 명령은 한쌍이 되어 사용 되어야 한다.
#deifne OS_EXIT_CRITICAL() asm STI
#endif
  

1.7. PC-Based Services

주절주절 궁시렁궁시렁..

1.7.1. Character-Based Display

디스플레이는 문자기반으로 한다. x, y값을 이용해서 아스키문자와 특수문자를 출력할 수 있다. 1글자 출력에 사용되는 바이트수는 2이다. 1바이트는 글자이고, 나머지 1바이트는 포그라운드/백그라운드 컬러이다. (상위 4비트가 백그라운드이고 하위 4비트가 백그라운드 컬러이다)
~cpp 
PC_DispClrScr()        // Clear the screen
PC_DispClrLine()     // Clear a single row (or line)
PC_DispChar()       // Display a single ASCII chracter anywhere on the screen
PC_DispStr()       // Display and ASCII strin anywhere on the screen
  

1.7.2. Elapsed Time Management

수행시간 측정은 한 task 의 수행시간을 측정하기 위해서 한다. (당연한거 아냐?). 이 측정은 PC의 82C52 타이머 2번을 통해 수행된다. 수행시간 측정을 위한 함수로는 PC_ElapsedStart()와 PC_ElapsedStop()이 있다. 하지만 이 두 함수를 사용하기 전에 PC_ElapsedInit()를 호출해야한다. 이 함수는 두 함수와 관련된 오버헤드를 측정하는데 사용된다. 이렇게 하면 PC_ElapsedStop 함수에 의해 수행시간이 리턴된다(마이크로세컨드). 이 두 함수는 모두 리엔터런트(주 : 몇 개의 프로그램이 동시에 하나의 task나 subroutine을 공유하여 쓰는 것에 대해 말함, from 한컴사전) 하지 않아야한다. 다음은 PC_DispChar()함수의 측정시간을 구하는 예이다.
~cpp 
INT16U time;

PC_ElapsedInit();
.
.
PC_ElapsedStart();
PC_DispChar(40, 24, 'A', DISP_FGND_WHITE);
time = PC_ElapsedStop();
  

1.7.3. Miscellaneous

uCOS-II는 여타의 DOS Application 과 비슷하다. 다른말로는 uCOS-II의 코드는 main 함수에서부터 시작한다. uCOS-II는 멀티태스킹과 각 task 마다 고유의 스택을 할당하기 때문에, uCOS-II를 구동시키려면 이전 DOS의 상태를 저장시켜야하고, uCOS-II의 구동이 종료되면서 저장된 상태를 불러와 DOS수행을 계속하여야 한다. 도스의 상태를 저장하는 함수는 PC_DosSaveReturn()이고 저장된 DOS의 상태를 불러오는것은 PC_DOSReturn() 함수이다. PC.C 파일에는 ANSI C 함수인 setjmp()함수와 longjmp()함수를 서로 연관시켜서 도스의 상태를 저장시키고, 불러온다. 이 함수는 Borland C++ 컴파일러 라이브러리를 비롯한 여타의 컴파일러 라이브러리에서 제공한다.

uCOS-II를 끝내기 전에 PC_DOSSaveReturn 함수를 호출해야한다. 그렇지 않으면 DOS가 curruped mode 가 되어버리고 이것은 당신의 windows에 영향을 줄 수도 있다.

1.8. uCOS-II Examples

1.9. Example 1

1.9.1. main()

1.9.2. TaskStart()

1.9.3. TaskN()

1.10. Example 2

1.10.1. main()

1.10.2. TaskStart()

1.10.3. TaskN()

1.11. Example 3

1.11.1. main()

1.11.2. Tasks

1.11.3. Notes


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:51
Processing time 0.0372 sec