본문 바로가기
STUDY/RTOS

[실시간 시스템] 시간(Time) 관리 함수

by 건강한 노동자 2020. 5. 14.

※ 모든 정보는 uC/OS ii 2nd Edition을 기준으로 함.

1. OSTimeDly()

- 사용자가 정한 시간만큼 태스크를 지연시키는 함수. 

- 호출 시 문맥 교환 발생(단, 가장 높은 우선순위의 태스크일 경우).

- 정한 시간이 다되거나, 다른 태스크가 OSTimeDlyResume() 함수로 지연을 취소하면 종료.

 

(1) ticks: 만약 주어진 ticks 값이 0이라면, 태스크를 지연시키지 않겠다는 의미. 바로 리턴. 

(2) 현재의 태스크를 Ready List에서 삭제

(3) ticks 값은 현재 태스크의 OS_TCB에 저장되며, OSTimeTick() 함수가 이 값을 계속해서 감소시킴. 

(4) OSSched(): 스케줄러가 다음으로 높은 우선순위의 태스크를 실행.

 

과정

(1) Tick interrupt: 10ms마다 발생.

(2) OSTickISR(): 현재 실행중인 다른 인터럽트가 없고, 실행가능한 인터럽트가 있다는 전제 하에 tick ISR 호출.

(3) All HPT(High Priority Task): eo지연된 태스크 다음으로 높은 우선순위의 태스크들을 실행.

(4) LPT(Low Priority Task): HPT 다음으로 LPT가 실행되고, 종료 시 OSTimeDly를 호출. 다음 tick 발생까지 sleep.

(5) OSTickISR(): 5ms 이후 tick 발생. OSTickISR() 실행. 

(6) 1 tick 동안 지연된 태스크 실행. 부하가 많은 시스템에서는 tick 발생 전 수십 마이크로 초동안 OSTimeDly(1)을 호출할 수 있어서 거의 바로 다시 스케줄링이 일어나므로 지연이 거의 없음. 최소 1 tick의 지연이 필요하다면 OSTimeDly(2)를 호출할 것. 

 

2. OSTimeDlyHMSM()

- OSTimeDly()보다 더 명확하게 지연시간을 지정하고 싶은 경우 사용.

- H(hours), M(minites), S(seconds), M(miliseconds)로 지정 가능.

- 다른 특성은 OSTimeDly()와 동일.

 

(1) 인수 중 어느 하나에라도 유효한 값이 있는지 체크.

(2) OS_TICKS_PER_SEC(tick rate): OS는 tick의 값밖에 알 수 없으므로 시간값을 변환.

(3) 500/OS_TICKS_PER_SECOND: 주어진 ms 기준으로 tick이 일어난 횟수를 계산하는 방정식. 500/OS_TICKS_PER_SECOND의 경우 ms로 변환된 0.5 tick에 해당. 예를들어 OS_TICKS_PER_SECOND가 100Hz(10ms)라면 4ms의 지연은 없는 것이나 다름 없고, 5ms의 지연은 10ms으로 간주됨.

 

(4)~(7) loops, ticks: uC/OS-II는 최대 65,535 ticks의 지연을 지원함. 그 이상의 지연을 위해서는 loop를 사용. 

EX) OS_TICKS_PER_SECOND가 100이고 15s의 지연을 원할 때, 15×60×100 = 90,000 ticks가 요구됨. 이는 32,768 ticks + 32,768 ticks + 24,464 ticks로 분리됨.

(8) OSTimeDly(32768): 나머지 ticks를 먼저 처리한 뒤 65,535 ticks(두 개의 32,768 ticks)처리. 

 

OSTimeDlyHMSM()으로 65,535 ticks 이상 지연된 태스크는 재개(OSTimeResume())할 수 없음. OSTimeDlyHMSM(0, 10, 55, 350) 또는 그 이상 지연된 태스크는 재개 불가.

3. OSTimeResume()

- 지연된 태스크를 재개하는 함수.

- 실행을 재개할 함수의 우선순위를 지정해야함.

- 특정 이벤트를 대기하는 태스크의 재실행도 가능함. 해당 태스크는 타임아웃으로 간주함.

 

(1) OS_PRIO_INVALID: 태스크의 우선순위가 유효한 값인지 체크.

(2) 존재하는 태스크인지 체크.

(3)~(4) OSTCBDly: 지연시간이 남았는지 체크하고, OSTimeDly(), OSTimeDlyHMSM(), PEND 등으로 대기중일 경우 강제적으로 OSTCBDLy 값을 0으로 세팅.

 

(5)~(6) OS_STAT_RDY: 태스크는 SUSPEND 상태일 것이므로, 만약 ready 상태라면 Ready List에 추가.

(7) OS_Sched(): 스케줄러 호출.

 

4. OSTimeGet() / OSTimeSet()

OSTimeGet()

- 카운터의 현재 값을 구하는 함수.

 

 

OSTimeSet()

- 카운터의 값을 변경하는 함수.

 

 

클록의 동작

- 클록은 한 번 뛸 때(tick) 32bit 카운트의 값이 상승함.

- 4,294,967,295 뛸 때마다 roll over.

- tick rate가 100MHz이라면, 32bit 카운터는 497일마다 roll over.

 

 

'STUDY > RTOS' 카테고리의 다른 글

[실시간 시스템] 태스크 관리 (1)  (0) 2020.04.22

댓글