gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:37:24 24 4
gpt4 key购买 nike

我在 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,我怀疑对大于 16Bit 的值进行移位/位操作时出现问题。
很困难,这是一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com