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