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