使用枚举设置标志时的 AVR C 随机行为



我在 atmega1280 μC 上的 AVR C 应用程序中用于程序状态的枚举和标志有问题,以下是我如何处理标志的代码:

typedef enum
{
    ALARM_FLAG,
    ARMED_FLAG,
    RC_AUTH_FLAG,
    ADC_DATA_READY_FLAG,
    PLAY_MUSIC_FLAG,
    PLAY_ALARM_FLAG,
    MUSIC_DREQUEST_FLAG,
    SENSOR_CHANGE_FLAG,
    RFID_DECODED_FLAG,
    RFID_AUTH_FLAG,
    RFID_ENABLE_FLAG,
    RFID_DISABLE_FLAG,
    REMOTE_RX_COMPLETE,
    REMOTE_TX_COMPLETE,
    REDRAW_VOLUME,
    FOOTER_UPDATE_FLAG,
    ADD_RFID_FLAG,
    ERROR_FLAG,
} flag_t;
static volatile uint32_t flags = 0;
uint8_t getFlag(flag_t flag)
{
    return ( (flags & (1<<flag) ) !=0);
}
void setFlag(flag_t flag)
{
    flags |= 1<<flag;
}
void clearFlag(flag_t flag)
{
    flags &= ~(1<<flag);
}

现在,当我使用ADD_RFID_FLAG下方的标志并ERROR_FLAG一切正常时,但是当我使用ADD_RFID_FLAG或ERROR_FLAG标志时,标志将无法设置。

由于ADD_RFID_FLAG的值为 16,我怀疑对大于 16 位的值进行移位/位操作出了问题。Al tough,它是一个 8 位控制器,这段代码应该可以正常工作,据我所知,16 位代码可以,uint32_t官方支持。

int

AVR 上是 16 位。

uint8_t getFlag(flag_t flag)
{
    return ( (flags & (1L<<flag) ) !=0);
}

等。

最新更新