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