์ด๋ฒ์ ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ฅผ ํตํด ์ปจํ
์คํธ ์ค์์นญ์ด ์ด๋ฃจ์ด์ง๋ ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ ๊ดํ
์ฝ๋๋ฅผ ์ดํด๋ณผ๊น ํ๋ค.
์จ์์๋ 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();