4. Time Management 아이티즌 기술연구소 MicroC/OS-II 4. Time Management 아이티즌 기술연구소 ITISN Technical Lab
시간 관리 개요 클럭틱 하드웨어에 의해 주기적으로 발생되는 특수 인터럽트 초당 10회~100회 발생시키는 것이 적당함 자주 발생 시킬수록 정밀도는 증가하지만 성능저하 발생 태스크 일정 시간동안 지연 OS_CFG.H의 활성화(1로 설정) OSTimeDly() OSTimeDlyHMSM() OS_TIME_DLY_HMSM_EN 지연된 태스크의 재개 OSTimeDlyResume() OS_TIME_DLY_RESUME_EN 시스템 시간 얻기 OSTimeGet() OS_TIME_GET_SET_EN 시스템 시간 설정 OSTimeSet() OS_TIME_GET_SET_EN ITISN Technical Lab
태스크 지연 1tick이 10ms이면 OSTimeDly(1tick)은 정확하게 10ms동안 지연이 되는 것일까? 재개 5ms 틱 인터럽트 발생 틱 인터럽트 발생 OSTimeDly(1)호출 하위 우선순위 태스크 실행 중단됨 ISR 상위 우선순위 태스크 하위 우선순위 태스크 ITISN Technical Lab
1. OSTimeTick() void OSTimeTick (void); 1. 클럭틱 처리 담당 함수 - 주기적인 시간 흐름의 알림 2. OSTimeDly(), OSTimeDlyHMSM() 등으로 대기중인 태스크들에 대 한 시간 경과 처리 - 하드웨어에 의해 주로 사용되며, 직접 사용할 경우 적음 3. OSStart() 호출 후 인터럽트 활성화 해야 함 ITISN Technical Lab
2. OSTimeDly() void OSTimeDly( INT16U ticks // 지연하고자 하는 클럭틱 값(최대65,535) ); 1. 실제 소요시간은 os_cfg.h의 OS_TICKS_PER_SEC에 의해 결정 2. 정밀히 사용하려면, 해당 틱 값 +1을 지연시켜야 한다. ITISN Technical Lab
3. OSTimeDlyHMSM() void OSTimeDlyHMSM( INT8U hours, // 지연하고자 하는 시간(0~255) INT8U minutes, // 지연하고자 하는 분(0~59) INT8U seconds, // 지연하고자 하는 초(0~59) INT8U milli // 지연하고자 하는 밀리 초(0~999) ); 1. 지정한 시간 동안 태스크 자신을 대기시킨다. ITISN Technical Lab
4. OSTimeDlyResume() INT8U OSTimeDlyResume( INT8U prio // 재개하려는 태스크의 우선순위 ); 1. OSTimeDly() 또는 OSTimeDlyHMSM() 으로 지연중인 태스크를 재 개시키는 함수 2. 65,535틱 이상의 지연 태스크는 재개 불가 void TaskX(void *pdata) { INT8U err; pdata= pdata; for(;;) { err= OSTimeDlyResume(10); if(err==OS_NO_ERR) { ITISN Technical Lab
5. OSTimeGet() INT32U OSTimeGet(void); 1. 시스템 클럭틱의 현재 값을 가져온다. 2. 클럭틱은 32비트 카운터 변수로 시스템 시작 시점부터 계속해서 매 틱마다 1씩 증가한다. void TaskX (void * pdata) { INT32U clk; for(;;) { clk = OSTimeGet(); // 시스템의 현재 값을 얻는다. } return; ITISN Technical Lab
6. OSTimeSet() void OSTimeSet( INT32U ticks // 설정하고자 하는 시스템의 틱 값 ); 1. 시스템의 클럭틱을 설정한다. 2. 클럭틱의 크기는 32비트로 시스템에 의한 증가 void TaskX(void * pdata) { for(;;) OSTimeSet(0L); // 시스템 클럭 초기화 } return; ITISN Technical Lab