오전 11:22 2008-01-11
조경민 bro@shinbiro.com
HW타이머 사용시 주의 점
=============================================================


Jack Ganssle, Asynchronicity, http://www.embedded.com/story/OEG20010615S0111


임베디드OS에서 소프트웨어와 하드웨어가 비동기적으로 동작할 때 문제 발생가능
다음과 같은 예가 있다고 하자.


16비트 하드웨어 타이머가 존재하고
16비트가 꽉차면 하드웨어 타이머 인터럽트가 발생하여
인터럽트 루틴에서 high값을 하나씩 더해 Timer_interrupts를 더해간다고 할때
int Read_timer()
{
    int low = Timer_register; // 하드웨어 현재 타이머 값 읽기 get 0xffff
    // A. 인터럽트 발생가능
    int high = Timer_interrupts;
    return (high<<16)+low;
}


Isr_Timer()
{
   Timer_interrupts++; // 0에서 1로 변경
}


다음의 문제가 생길 수 있다.
현재 0xffff이고 A지점에서 인터럽트가 발생되었다면 인터럽트발생하여 Timer_interrupts는 1이되고 결국 0xffff 시점에서 Read_timer()는
0xffff이나 0x10000을 리턴하는것이 아닌 0x1ffff를 리턴하게 된다.


이를 방지하려면 다음처럼 한다.
unsigned long  Read_timer(void)
{
  unsigned short low, high;
  push_interrupt_state;
  disable_interrupts; // 일단 인터럽트 불가시켜 ISR이 동작되지 않게 한다.


  low=inword(Timer_register);
  high=Timer_interrupts;
  if (inword(timer_overflow)) { // 하드웨어 타이머 레지스터 중 overflow발생체크를 해본다.
    ++high;
    low=inword(timer_register); // overflow되었다면 다시 읽어볼 필요가 있음
  }
  pop_interrupt_state;
  return (((ulong)high)<<16 + (ulong)low);
}


 

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

OS-Awareness  (0) 2008.03.31
RTOS contraint in application  (0) 2008.03.31
RCU (Read Copy Update)  (0) 2006.06.30
rtos stuff  (0) 2006.01.23
[링크-동영상 강좌] 마이크로프로세서의 이해, 그리고 운영체제와의 관계  (1) 2006.01.11

+ Recent posts