Kernel

공부기록·2023년 10월 16일
0
post-thumbnail

Task Scheduling Overview

  • number of tasks : 64
  • static priority scheduling

Task State Transition

  • task state
    • dorment : OS에 등록되지 않은 task, OSTaskCreate()나 OSTaskCreateExt()을 이용하여 ready상태로 변경할 수 있다.
    • ready : running 상태로 바뀔 예정인 task
    • running : CPU에서 현재 실행중인 task
    • waiting : event를 기다리는 task들. 주로 pend()에 의해서 waiting되고 post()를 기다린다.
    • ISR : 인터럽트 실행중


TCB (Task Control Block)

Task control block

  • task의 정보를 담고있는 구조체

    OS_TCB structure

  • OSTCBStkPtr : top-of-stack을 가르키는 포인터

  • OSTCBExtPtr*

  • OSTCBStkBottom* : bottom-of-stack을 가르키는 포인터

  • OSTCBStkSize : stack size

  • OSTCBNext, OSTCBPrev : OS_TCB list의 앞/뒤의 TCB를 가르키는 포인터.

  • OSTCBDly

  • OSTCBStat : task state


  • OSTCBPrioTblp[] : task들을 관리하는 테이블, 실행중인 task의 주소가 할당되어있다.

  • OSTCBHighRdy : 가장 높은 우선순위를 갖는 task를 가르킨다.

  • OSTCBCur : 현재 실행중인 task를 나타낸다.

  • OSTCBFreeList 가장 앞의 있는 task가 실행되면 OSTCBList의 끝에 추가된다.



    Scheduler Function

    Task Scheduling

    • task 수준의 스케줄링은 OS_Sched()에 의해 수행된다.
   void OSSched (void){
        INT8U y;
        OS_ENTER_CRITICAL();
        /*
        	OSLockNesting : 스케줄링 락
            OSIntNesting : 인터럽트 설정 여부
            0이면 사용중인 것
        */
        if((OSLockNesing | OSIntNesting) == 0) { //스케줄링 잠금 해제 상태
            /*우선순위가 가장 높은 task를 찾음*/
            y = OSUnMapTbl[OSRdyGrp];
            OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
            /*현재 실행 TASK와 우선순위 높은 TASK가 같지않으면 SWITCH가 필요함.*/
            if (OSPrioHighRdy != OSPrioCur){
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                OSCtxSwCTR++;
                OS_TASK_SW(); //task switching 함수
            }
        }
        OS_EXIT_CRITICAL();
    }
  • ISR 수준의 스케줄링은 OSIntExit()에 의해 수행된다.


OS_TASK_SW( )함수의 실행 - Context Switch (이해부족)

  • OSTCBHighRdy는 다음에 선점될 task의 TCB를 가르킨다.

  • 높은 우선순위에 있는 task의 stack을 CPU로 LOAD한 후 현재 선점되어있는 task의 stack에 저장한다.

  • 가장 높은 우선순위를 가진 task의 stack의 register들은 pop되고 SP는 현재 선점된 우선순위가 높은 task의 stack top을 가르키게된다.

ISR

  • 과정
    • TCB의 모든 register값들을 저장한다.
    • IOIntEnter() 함수를 실행한다.
    • ISR 프로그램을 수행한다.
    • OSIntExit() 함수를 실행한다.
    • 모든 register값들을 CPU에 복구시킨다.
	void OSIntEnter(void){
    	/*인터럽트 활성화/비활성화 함수*/
    	OS_ENTER_CRITICAL();
        OSIntNesting++;
        OS_EXIT_CRITICAL();

  • ISR 수준의 Scheduling은 OSIntExit() 함수에 의해 수행된다.
	void OSIntExit(void){
    	OS_ENTER_CRITICAL();
        if((--OSIntNesting | OSLockNesting) == 0){
        	/*
            	가장 높은 task를 찾은 다음 OSPrioHighRdy에 넣는다.
            */
        	OSIntExitY = OSUnMapTbl[OSRdyGrp];
            OSPrioHighRdy = (INT8U)((OSRdyGrp] + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
            if(OSPrioHighRedy != OSPrioCur){
            	/*
                	현재 실행되는 task가 현재 가장 높은 task보다 우선순위가 낮으면 
                    context_switch가 발생한다.
                */
            	OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                OSCtxSwCtr++;
                OSIntCtxSw();
            |
        }
        OS_EXIT_CRITICAL();
    |

OSIntCtxSw( )

  • OSIntExit( )에서 context switch를 수행한다.
  • OSCtxSw( )와 유사하다. but 문맥저장이 없다.



Clock Ticks

  • OSTickISR( )
    • time-out이나 시간지연기능을 위해 사용된다.
    • 가장 많이 사용되는 interrupt
    • OSTCBDly : 이것이 설정되어 있으면 그 시간동안은 waiting 상태로 있어야된다. 0이 되는 순간 task를 ready 상태로 바꿔준다.
    • if SUSPEDN일 경우 계속 waiting 상태로 바꿔야한다.

0개의 댓글

관련 채용 정보