* interrupts should be cleared before exiting this function.
*
* @note The myIrqHander() should reside in RAM.
*
*****************************************************************************/
typedef struct _interuptStatus
{
union _ARM_INTERRUPT_PINS_U
{
struct _ARM_INTERRUPT_PINS_BITS
{
U32 armInterrupt0 : 1;
U32 armInterrupt1 : 1;
U32 armInterrupt2 : 1;
U32 armInterrupt3 : 1;
U32 armInterrupt4 : 1;
U32 armInterrupt5 : 1;
U32 armInterrupt6 : 1;
U32 armInterrupt7 : 1;
} Bits;
U32 Dword;
}u;
}INTERUPT_STATUS;
INTERUPT_STATUS gInterruptStatus; //定义全局的中断状态,此struct状态根据具体的CPU来定义
INTERUPT_STATUS getIrqStatus()
{
return gInterruptStatus;
}
void myIrqHander() //中断处理函数
{
INTERUPT_STATUS irqStatus = getIrqStatus();
if(irqStatus.u.armInterrupt0)
{
/*
表示armInterrupt0 发生,假设为uart接收中断发生。表明有数据需要接收。threadx操作系统
但对数据的消费处理由其他任务来完成。
这种情况下就需要一种机制来完成中断中对接收的数据和数据消费任务之间的通信。
比如现在从uart上面收到的数据保存在PtrSendBuffer[len],len为收到的数据长度。
在threadx或者ucosII中如果需要在中断或者任务之间传递数据,可以采用消息队列,消息邮箱机制。
消息队列可以用来传递大量数据,
*/
return (HALI_OS_STATUS) tx_queue_send((TX_QUEUE*)MyQueue,(VOID*)PtrSendBuffer,(ULONG)Timeout);
}
if(irqStatus.u.armInterrupt1)
{
//表示armInterrupt1 发生
}
if(irqStatus.u.armInterrupt2)
{
//表示armInterrupt2 发生
}
........................
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40032-4.html
目前