※ 모든 정보는 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 |
---|
댓글