손이 고생을 많이 해서 그렇지 소스는 별로 많지 않다..다만 다 손으로 치라구 하니 힘들었을 뿐
여하튼 그래서 주요부분의 소스는 다 보여준 것 같다.
사실 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