~cpp // 형 재정의 typedef ungisned char BOOLEAN; typedef unsigned char INT8U typedef signed int INT16S ... // 형 재정의 (#define이용) #define BYTE INT8S ...
~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 하게 선언된다는 것을 알 수 있다.
~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
~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
~cpp INT16U time; PC_ElapsedInit(); . . PC_ElapsedStart(); PC_DispChar(40, 24, 'A', DISP_FGND_WHITE); time = PC_ElapsedStop();