도와주세요!!
글 수 15,339
2003.11.12 09:51:27 (*.131.38.142)
6682
타이머 인터럽트를 사용해 보려고 하는데요.생각만큼 안 되네요. 제소스좀 주
세요 참고는 KELP 2차 공개세미나(스텝모터..)를 참고하였습니다.
#sample.h
#define SATIMER_NAME "MTIMER" //타이머 디바이스 이름
#define SATIMER_GPIO_IRQ 1
#define SATIMER_IRQ IRQ_GPIO(1) //GP1
//Timer 레지스터 접근 매크로
#define TIMER_TICK_uSEC 10 //10u단위의 틱 시간 간격
#define ONE_SEC_CLK 3686400
#define TEN_USEC_CLK ONE_SEC_CLK/100000 //36.864
#define SATIMER_ON OIER |= OIER_E1 ; OSSR=OSSR_M1 //timer enable match-
flags clear
#define SATIMER_OFF OIER &=~OIER_E1 ; OSSR=OSSR_M1 //timer 1 disable
match-flgas clear
open 함수에서 인터럽트를 등록하였습니다.
set_GPIO_IRQ_edge(1<
if(request_irq(SATIMER_IRQ, TimerInterrupt, SA_INTERRUPT, SATIMER_NAME,
NULL))
{
printk("Unable to TIMER IRQ %d!!
", SATIMER_IRQ);
return -EBUSY;
}
또 release 함수에서 인터럽트를 해지하였습니다.
그리고 인터럽트 함수는 간단한프린트 문을 찍게 했는데요...
타이머 인터럽트가 걸리는 원리를 사실 잘 모르겠습니다
GPIO1번을 인터럽트로 등록하긴 했는데.. 시간의 변화를 어떻게 GPIO가 check
를 해서.. 인터럽트 함수를 수행하는지...
다시 프로그램 설명으로 넘어가면..
//시간을 얻는다
void FIFO_GetTime (struct timeval *tv)
{
do_gettimeofday(tv); //시간을 얻는 함수
}
//시간차를 구하는 함수
long FIFO_GetDiffTime(long oldsec, long oldusec, long newsec, long
newusec)
{
long sectime;
long usectime;
// 초가 이전 보다 작으면 return -1을 돌린다.
if(newsec
return 0;
sectime =newsec-oldsec;
usectime=newusec-oldusec;
if(usectime<0)
{
sectime--;
usectime = (newusec+1000000L)-oldusec;
}
if(sectime<0)
return -1;
return sectime*1000000L + usectime;
}
위의 두 함수는 직접적으로 호출해서 사용하지 않던데...
//설명: 타이머를 설정하거나 해제한다
//10usec단위로 설정
void TimerReload(unsigned long tick)
{
if(0==tick)
{
SATIMER_OFF;
}
else
{
SATIMER_ON;
OSMR1 = OSCR+TEN_USEC_CLK*tick; //reload
}
}
인터럽트 함수
void TimerInterrupt(int irq, void *dev_id, struct pt_regs *regs)
{
TIME_OFF;
printk("Timerinterrupt
");
TimerReload(TIMER_TICK_uSEC);
}
이렇게했는데요.... 인터럽트를 등록한 후에... 전혀 인터럽트가 발생되지 않
는지.. 인터럽트 루프를 돌지 않더군요...
타이머 인터럽트 함수를 수행하는 방법에 대해 자세한 설명좀 부탁드립니다.
찾아봐도 인터럽트 함수에 대한 내용이 없더군요....그리고 제가 본 소스에는
인터럽트 함수 말고 인터럽트 핸들러가 있었습니다... 중요한 용도인거 같은
데. 현재 제가 보는 소스로는 도저히 이해가 가질 않아서...바쁘시더라도 답
변 부탁드립니다..
세요 참고는 KELP 2차 공개세미나(스텝모터..)를 참고하였습니다.
#sample.h
#define SATIMER_NAME "MTIMER" //타이머 디바이스 이름
#define SATIMER_GPIO_IRQ 1
#define SATIMER_IRQ IRQ_GPIO(1) //GP1
//Timer 레지스터 접근 매크로
#define TIMER_TICK_uSEC 10 //10u단위의 틱 시간 간격
#define ONE_SEC_CLK 3686400
#define TEN_USEC_CLK ONE_SEC_CLK/100000 //36.864
#define SATIMER_ON OIER |= OIER_E1 ; OSSR=OSSR_M1 //timer enable match-
flags clear
#define SATIMER_OFF OIER &=~OIER_E1 ; OSSR=OSSR_M1 //timer 1 disable
match-flgas clear
open 함수에서 인터럽트를 등록하였습니다.
set_GPIO_IRQ_edge(1<
NULL))
{
printk("Unable to TIMER IRQ %d!!
", SATIMER_IRQ);
return -EBUSY;
}
또 release 함수에서 인터럽트를 해지하였습니다.
그리고 인터럽트 함수는 간단한프린트 문을 찍게 했는데요...
타이머 인터럽트가 걸리는 원리를 사실 잘 모르겠습니다
GPIO1번을 인터럽트로 등록하긴 했는데.. 시간의 변화를 어떻게 GPIO가 check
를 해서.. 인터럽트 함수를 수행하는지...
다시 프로그램 설명으로 넘어가면..
//시간을 얻는다
void FIFO_GetTime (struct timeval *tv)
{
do_gettimeofday(tv); //시간을 얻는 함수
}
//시간차를 구하는 함수
long FIFO_GetDiffTime(long oldsec, long oldusec, long newsec, long
newusec)
{
long sectime;
long usectime;
// 초가 이전 보다 작으면 return -1을 돌린다.
if(newsec
sectime =newsec-oldsec;
usectime=newusec-oldusec;
if(usectime<0)
{
sectime--;
usectime = (newusec+1000000L)-oldusec;
}
if(sectime<0)
return -1;
return sectime*1000000L + usectime;
}
위의 두 함수는 직접적으로 호출해서 사용하지 않던데...
//설명: 타이머를 설정하거나 해제한다
//10usec단위로 설정
void TimerReload(unsigned long tick)
{
if(0==tick)
{
SATIMER_OFF;
}
else
{
SATIMER_ON;
OSMR1 = OSCR+TEN_USEC_CLK*tick; //reload
}
}
인터럽트 함수
void TimerInterrupt(int irq, void *dev_id, struct pt_regs *regs)
{
TIME_OFF;
printk("Timerinterrupt
");
TimerReload(TIMER_TICK_uSEC);
}
이렇게했는데요.... 인터럽트를 등록한 후에... 전혀 인터럽트가 발생되지 않
는지.. 인터럽트 루프를 돌지 않더군요...
타이머 인터럽트 함수를 수행하는 방법에 대해 자세한 설명좀 부탁드립니다.
찾아봐도 인터럽트 함수에 대한 내용이 없더군요....그리고 제가 본 소스에는
인터럽트 함수 말고 인터럽트 핸들러가 있었습니다... 중요한 용도인거 같은
데. 현재 제가 보는 소스로는 도저히 이해가 가질 않아서...바쁘시더라도 답
변 부탁드립니다..