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

标签 c enums avr

我在 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 位的值进行移位/位操作会出现问题。 虽然它是一个 8 位 Controller ,但该代码应该可以正常工作,16 位代码也可以正常工作,并且据我所知,uint32_t 得到了官方支持。

最佳答案

int is 16 bits on AVR.

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

等等

关于c - 使用枚举设置标志时的 AVR C 随机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833421/

相关文章:

express - 创建函数中枚举数据类型的问题

Java 枚举泛型

c - 嵌入式 C : Able to access some struct members but not others

c - 了解 ATMEGA168A 下的 UART

c++ - 当 memcpy() 比 memmove() 快时,什么是真正重要的情况?

C插入链表,第一个和最后一个节点的问题

c - 从C语言的文本文件中随机选择一个单词

c - 打印各种FILE信息

swift - 使用错误枚举的关联值和计算属性

微 Controller 类型转换改进