손이 고생을 많이 해서 그렇지 소스는 별로 많지 않다..다만 다 손으로 치라구 하니 힘들었을 뿐[[BR]] 여하튼 그래서 주요부분의 소스는 다 보여준 것 같다. 사실 U_C_OS 도 주석과 쓰잘대기 없는 코드가 좀 많다. 그리고 세마포어와 이벤트에 관한 코드는 대부분 비스므레 하다...이유는 거의 동기화하는 방법이 비슷하게 때문이다. 그래서 중요코드를 보면 그렇게 많지 않다..거기다 U_C_OS-I에서 U_C_OS_II로 가는 도중의 호환성 때문에 많은 주석이 더 필요했졌다...암튼 그래서..내 코드는 짧다.... {{{~cpp #if !defined(LIB_STACK_CPP) #define LIB_STACK_CPP void LIB_STACK_INIT (void (*task)(void),INT16U * Stack) { *Stack-- = 0x0000; *Stack-- = (INT16U)FP_SEG(task); *Stack-- = (INT16U)FP_OFF(task); *Stack-- = (INT16U)0x0202; // Flag Register *Stack-- = (INT16U)FP_SEG(task); *Stack-- = (INT16U)FP_OFF(task); *Stack-- = (INT16U)0xAAAA;// AX *Stack-- = (INT16U)0xBBBB;// BX *Stack-- = (INT16U)0xCCCC;// CX *Stack-- = (INT16U)0xDDDD;// DX *Stack-- = (INT16U)0xEEEE;// ES *Stack-- = _DS; *Stack-- = (INT16U)0x0000;// SI *Stack-- = (INT16U)0x0000;// DI *Stack-- = (INT16U)0xFFFF;// BP } }}} 스택 사이즈 구하는 부분 {{{~cpp INT16U LIB_STACK_SIZE (INT16U *Stack) { int size = 0; for (int i = 0 ; i<256 ; i ++){ if ( (*Stack--) != 0 ) size++; } return size; } #endif }}} 다음은 TCB 구조체 모양이다.... TCB는 TASK CONTROL BLOCK의 약자.. 한마디로 태스크에 대한 정보를 담고 있는 구조체 {{{~cpp #if !defined(LIB_STRU) #define LIB_STRU #include "LIB_DATA.H" struct LIB_TCB { // Task Priority INT8U *Task_Name; INT8U priority; // Task Stack INT16U StackSeg; INT16U StackOff; INT16U *Stack; // Task Delay int delay; // Task Status INT8U Task_Status; // Event Ptr; LIB_TCB *NextEvent; }; }}} 이벤트에 관한 블럭 {{{~cpp struct LIB_ECB { void *Event_Ptr; LIB_TCB *Wait_TCB; INT8U Event_Type; INT16U Sema_Count; }; #endif }}} --- ["REAL_LIBOS"]