请教QNX中断问题

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
fanweik
New Member
帖子: 6
注册时间: 周五 5月 29, 2009 8:29 pm

请教QNX中断问题

帖子 fanweik » 周五 5月 29, 2009 8:47 pm

向各位请教一qnx中断问题。我现在在写一驱动程序,涉及到中断响应例程。程序在第一遍运行时一切正常,但是在运行结束退出后,再次运行时,系统总是死机。找了很久不知错误出自何处,但怀疑是系统退出时没有做好中断善后处理工作,请各位帮个忙。谢谢!
另外在无中断的情况下,怎样让InterruptWait退出等待状态(不使用TimerTimeout)?

中断响应例程:
void* ACNET_INT_THREAD(void*)
{
// Hardwarezugriff erlauben
if(ThreadCtl(_NTO_TCTL_IO, 0) == -1)
{
return NULL;
}

SIGEV_INTR_INIT(&m_event);

m_id = InterruptAttachEvent(_NTO_INTR_CLASS_EXTERNAL + IntNo, &m_event, _NTO_INTR_FLAGS_TRK_MSK);

if(m_id == -1)
{
printf("InterruptAttach failed\n");
return NULL;
}

while(m_bStop == false)
{
// Warte auf Interrupt
if(InterruptWait(0, NULL) == -1)
{
continue;
}

HP324_ARC_Int_Bearbeiter();

InterruptUnmask(_NTO_INTR_CLASS_EXTERNAL + IntNo, m_id);
}

return NULL;
}

中断善后处理代码为:
m_bStop = true;

if(m_id != 0)
{
InterruptDetach(m_id);
}

if(m_hIntThread != NULL)
{
clock_gettime(CLOCK_REALTIME, &tTimeout);
tTimeout.tv_sec += 5; //5 seconds

//等待中断响应函数线程结束
if(pthread_timedjoin(m_hIntThread, NULL, &tTimeout) == ETIMEDOUT)
{
pthread_abort(m_hIntThread);
}

m_hIntThread = NULL;
}

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周五 5月 29, 2009 10:43 pm

进程退出后,内核会自动清除进程挂上的中断,所以这部份应该不用太担心。

像你现在的情形,我觉得是在你程序启动的时候,没有正确地reset你的硬件。刚开机时,你的硬件一般是处在一个已知状态,可能你不初始化都关系不大;但你的驱动启动,退出,重启时,硬件应该是在一个不可知的状态;通常你都需要把硬件初始化到一个已知状态,然后开始挂中断等操作。

还有一种常见情形。如果你的驱动使用DMA,那你需要在驱动进程退出时正确清除DMA. 否则硬件可能破坏不知分配给了谁的内存。不过,这种情况,通常是驱动一退出就死机,而不是再次启动时才死机。

回复