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.0103 sec