์ด๋ฒ์ ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ฅผ ํตํด ์ปจํ
์คํธ ์ค์์นญ์ด ์ด๋ฃจ์ด์ง๋ ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ ๊ดํ
์ฝ๋๋ฅผ ์ดํด๋ณผ๊น ํ๋ค.
์จ์์๋ interrupt๋ ์์ฝ์ด๋ก ํจ์๋ฅผ ์ธํฐ๋ฝํธ ์ฝ์ด ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋ด ๊ฒฝ์ฐ ์ปดํ์ผ์ ํด ๋ณด๋ฉด ํ์ ์ ํธ์ถ์ด RET๊ฐ ์๋ IRET๋ก ๋๋๊ฒ ๋๋ค.
๊ทธ๋ด ๊ฒฝ์ฐ IRET ๋ก ๋๋ ๊ฒฝ์ฐ CS:IP FLAGS๋ฅผ ์คํ์์ PUSHํ๊ฒ ๋๋ค.
PS RET๋ก ๋๋ ๊ฒฝ์ฐ CS:IP๋ง PUSHํ๊ฒ ๋๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณผ๊น ํ๋ค.
์จ์์๋ interrupt๋ ์์ฝ์ด๋ก ํจ์๋ฅผ ์ธํฐ๋ฝํธ ์ฝ์ด ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋ด ๊ฒฝ์ฐ ์ปดํ์ผ์ ํด ๋ณด๋ฉด ํ์ ์ ํธ์ถ์ด RET๊ฐ ์๋ IRET๋ก ๋๋๊ฒ ๋๋ค.
๊ทธ๋ด ๊ฒฝ์ฐ IRET ๋ก ๋๋ ๊ฒฝ์ฐ CS:IP FLAGS๋ฅผ ์คํ์์ PUSHํ๊ฒ ๋๋ค.
PS RET๋ก ๋๋ ๊ฒฝ์ฐ CS:IP๋ง PUSHํ๊ฒ ๋๋ค.
ํํ ๋ ์ค๋๊ฐ๋ง์ ๋ดค๋๋ ๋๋ ๋ฌด์จ ํจ์์ง ๋ชจ๋ฅด๋ ๊ฒ์ด ์๊ตฐ..
~cpp
void interrupt LIB_ISR(...){
LIB_ENTER_CRITICAL();
(*oldtimer)();
LIB_INT_COUNT++;
/////////////// Decrease Time Dly
for ( int i = 0 ; i < suspend_tcb_ptr + 1; i++ ){
pSuspend_heap[i]->delay--;
if ( High_Task->priority < pSuspend_heap[i]->priority && pSuspend_heap[i]->delay < 0 ) {
pSuspend_heap[i]->delay = 0;
LIB_resume_task(pSuspend_heap[i]->priority);
}
}
/////////////// CONTEXT SWITCHING
asm {
MOV S_SEG,SS
MOV S_OFF,SP
}
High_Task->StackSeg = S_SEG;
High_Task->StackOff = S_OFF;
LIB_Schedul();
S_SEG = High_Task->StackSeg;
S_OFF = High_Task->StackOff;
asm {
MOV SS,S_SEG
MOV SP,S_OFF
}
///////////////////////////////////
LIB_EXIT_CRITICAL();
}
์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ ์ด๊ธฐํ ํด์ฃผ๋ ํจ์๋ก
์์ ํ์คํฌ๋ฅผ ์ด๊ธฐํ ํ๊ณ ์ธํฐ๋ฝํธ ๋ฒกํฐ ํ ์ด๋ธ์์ ํ์ด๋จธ์ CS:IP์
๋ถ๋ถ์ ์์ LIB_ISR๋ก ๋ฐ๊ฟ์ค๋ค.
ํ์ด๋จธ ๋ฒกํฐ์ ์์น๋ฅผ ๊ตฌํด ๊ทธ ๋ถ๋ถ์ ํ์ด๋จธ๋ฅผ ์ ์ฅํด ๋๋ค..๋ง์ฝ์ ๋ณต๊ท๋ฅผ ์ํด..^^;
์ฐ์ ๊ฐ์ฅ ์์์ ํ์คํฌ๋ฅผ ์ฐพ๊ฒ ์ง?? ์๋ง ๊ทธ๊ฑด
High_Task ๋ก ์ง์ ๋ ํ์คํฌ์ผ ๊ฒ์ด๋ค. ๊ทธ ํ์คํฌ์ ์คํ ์์น๋ฅผ ์ฐพ์ ์คํ ํฌ์ธํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
์์ ํ์คํฌ๋ฅผ ์ด๊ธฐํ ํ๊ณ ์ธํฐ๋ฝํธ ๋ฒกํฐ ํ ์ด๋ธ์์ ํ์ด๋จธ์ CS:IP์
๋ถ๋ถ์ ์์ LIB_ISR๋ก ๋ฐ๊ฟ์ค๋ค.
~cpp
void LIB_INIT_ISR(){
LIB_INT_NESTING = 0;
INT16U Time_Vect = 0x08 * 4;
High_Task = &START_TCB;
START_TCB.priority = 0;
START_TCB.StackSeg = 0;
START_TCB.StackOff = 0;
๊ฒ ๋ฒกํฐ์์ 0x08 ๋ฒ์งธ์ ํ์ด๋จธ ๋ฐฑํฐ ๊ทธ๋ฆฌ๊ณ 4๋ฐ์ดํธ๊ฐ ํ์ํด์ *4๋ฅผ ํด์ํ์ด๋จธ ๋ฒกํฐ์ ์์น๋ฅผ ๊ตฌํด ๊ทธ ๋ถ๋ถ์ ํ์ด๋จธ๋ฅผ ์ ์ฅํด ๋๋ค..๋ง์ฝ์ ๋ณต๊ท๋ฅผ ์ํด..^^;
~cpp
// Get Vecter Table oldtimer
asm {
MOV BX,Time_Vect
MOV AX,0
MOV DS,AX
MOV SI,BX
MOV AX,DS:[SI]
MOV DX,DS:[SI+2]
MOV DI,offset oldtimer
MOV BX,seg oldtimer
MOV ES,BX
MOV ES:[DI],AX
MOV ES:[DI+2],DX
}
์ด์ ์
ํ์ด๋จธ๋ฅผ ํด์ค๋ค...~cpp
// Set Timer Vector Table
asm {
MOV AX,0
MOV ES,AX
MOV DI,Time_Vect
MOV AX,offset LIB_ISR
MOV ES:[DI],AX
MOV AX,seg LIB_ISR
MOV ES:[DI+2],AX
}
}
์ด ํ๋ก๊ทธ๋จ์ด ๋ณต๊ท ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ๊ฒฝ์ฐ TSR์ ์ด์ฉํ๋ค..๊ทผ๋ฐ ์ง๊ธ์ ํ์ ์๋๋ฏ...~cpp
void LIB_TSR() {
union REGS regs;
regs.x.dx=4000;
int86(0x27,®s,®s);
}
์ด์ ์ฌ๊ธฐ์๋ถํฐ ์ค์ ์ ์ธ ์ปจํ
์คํธ ์ค์์นญ์ด ์ผ์ด๋๋ค.์ฐ์ ๊ฐ์ฅ ์์์ ํ์คํฌ๋ฅผ ์ฐพ๊ฒ ์ง?? ์๋ง ๊ทธ๊ฑด
High_Task ๋ก ์ง์ ๋ ํ์คํฌ์ผ ๊ฒ์ด๋ค. ๊ทธ ํ์คํฌ์ ์คํ ์์น๋ฅผ ์ฐพ์ ์คํ ํฌ์ธํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
~cpp
void interrupt LIB_context_sw(){
LIB_ENTER_CRITICAL();
/////////////// CONTEXT SWITCHING
asm {
MOV S_SEG,SS
MOV S_OFF,SP
}
High_Task->StackSeg = S_SEG;
High_Task->StackOff = S_OFF;
LIB_Schedul();
S_SEG = High_Task->StackSeg;
S_OFF = High_Task->StackOff;
asm {
MOV SS,S_SEG
MOV SP,S_OFF
}
///////////////////////////////////
LIB_EXIT_CRITICAL();









