E D R , A S I H C RSS

LIB_2

์ด๋ฒˆ์—” ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด์— ๊ด€ํ•œ

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ ํ•œ๋‹ค.
์”จ์—์„œ๋Š” 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๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
~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,&regs,&regs);
}
์ด์ œ ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์‹ค์ œ์ ์ธ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ์ผ์–ด๋‚œ๋‹ค.
์šฐ์„  ๊ฐ€์žฅ ์ƒ์œ„์˜ ํƒœ์Šคํฌ๋ฅผ ์ฐพ๊ฒ ์ง€?? ์•„๋งˆ ๊ทธ๊ฑด

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();

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:38
Processing time 0.0042 sec