오전 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 |