使用枚举

时间:2015-04-23 20:13:04

标签: c enums avr

我在enmega1280μC上使用AVR C应用程序的程序状态时遇到枚举和标志问题,下面是我处理Flags的代码:

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,我怀疑在大于16Bit的值上进行移位/位操作时出现问题。 Al hard这是一个8位控制器,这个代码应该可以正常工作,16位代码可以,uint32_t是官方支持的据我所知。

1 个答案:

答案 0 :(得分:3)

int is 16 bits on AVR.

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