练手正点原子ALPHAMX第二期第9个实验:GPIO中断,敲系统中断服务函数时,不小心多敲了一个&,逻辑错误,无法触发系统中断。原设计思路是将中断号与0x3FF进行按位与,得到中断号: uint32_t intNUM = (gicciar & 0x3FF) 。错误写成:uint32_t intNUM = (gicciar && 0x3FF)得到的结果始终为1,无法触发中断号为99所对应的GPIO1中断,导致蜂鸣器一直不响。
错误示例:
/* 具体的中断处理函数,IRQ_Handler会调用此函数 */
void system_irqhandler(unsigned int gicciar)
{
uint32_t intNUM = (gicciar && 0x3FF);
if((intNUM < 0) || (intNUM >= NUMBER_OF_INT_VECTORS))
{
return;
}
else
{
irqNesting++;
/* 根据中断ID号,读取中断处理函数,然后执行 */
irqTable[intNUM].irqHandler(intNUM,irqTable[intNUM].userparam);
irqNesting--;
}
}
正确示例:
/* 具体的中断处理函数,IRQ_Handler会调用此函数 */
void system_irqhandler(unsigned int gicciar)
{
uint32_t intNUM = (gicciar & 0x3FF);
if((intNUM < 0) || (intNUM >= NUMBER_OF_INT_VECTORS))
{
return;
}
else
{
irqNesting++;
/* 根据中断ID号,读取中断处理函数,然后执行 */
irqTable[intNUM].irqHandler(intNUM,irqTable[intNUM].userparam);
irqNesting--;
}
}
解析:
1. &表示按位与: (0x5 & 0xFF) 结果为0x5
2. &&逻辑与:(0x5 && 0xFF)结果为真,也就是1.