도와주세요!!
안녕하세요.
지금 270 타이머 인터럽트를 써서 ADC를 하려고 합니다.
대략 4uS 정도 마다 ADC를 하려고 하는데요.
타이머는 4번 타이머를 쓰려고 합니다.
대략 적으로 아래와 같이 프로그램 했습니다.
그런데 4uS로 설정하면 시스템이 죽어 버립니다.
아무래도 인터럽트가 계속 걸리면서 시스템이 제대로 돌지 못하는것 같은데요.
얼마나 빠른 인터럽트 까지 처리가 가능 한지 알수 있나요?
혹시 소스에 문제가 있는지도 봐 주셨으면 합니다.
시간을 늘리면 동작되는 시간이 좀 늘어나긴 합니다.
스택이나 그런쪽으로 문제인건지 메세지도 없이 먹통되니 알수가 없네요 ㅜㅜ
#define OIER_E4 (1 << 4) /* Interrupt enable channel 4 */
#define OSSR_M4 (1 << 4) /* Match status channel 4 */
static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
gAdcSeq++;
OSSR |= OSSR_M4; // Timer4 인터럽트 클리어
return IRQ_HANDLED;
}
void timer_init(void)
{
// 인터럽트 함수 등록
if( request_irq( IRQ_OST_4_11, timer_interrupt, IRQF_DISABLED, "PXA-270 Timer#4", NULL ) )
{
printk( "%s : unable to get IRQ %dn", __FILE__, IRQ_OST_4_11 );
return;
}
// 타이머 4 초기화
OIER &= ~OIER_E4; // Timer4 인터럽트 정지
OSSR |= OSSR_M4; // Timer4 인터럽트 클리어
OSMR4 = 4; // 시간값
OSCR4 = 0; // Timer4 카운터 클리어
OMCR4 = (3<<6) |(1<<3) | (1<<2); // us
OIER |= 1<<4; // Timer4 인터럽트 동작
printk( "PXA-270 Timer#4\n" );
}
int __init adc_init( void )
{
// timer interrupt
timer_init();
}
module_init( adc_init );
module_exit( adc_exit );
PXA270 500M 기준으로 인터럽트가 발생한 후 인터럽트 루틴까지 걸리는 시간은 약 2usec 정도 입니다.
타이머 인터럽트를 4usec 놓으신건 OTL
100-usec 정도는 잘 돕니다.
하지만 OS 가 수행되는 곳에서 100usec 라는 인터럽트는 너무 부담 스럽군요 ^^