C语言中& 与 &&使用过程中注意事项

    练手正点原子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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值