我有一个问题,我确信这是一个简单的问题,但暗示了我。我有以下C代码:
static uint16_t delta;
delta = (uint16_t)Flash_Read_NUM(ADDR_FLASH_PAGE_101);
if (delta == FLASH_EMPTY)
{
delta = DEFAULT_DELTA;
Flash_Write_NUM(ADDR_FLASH_PAGE_101, delta);
}
FLASH_EMPTY是#define 0xFFFFFFFF
当我在if上放置一个断点时,我可以清楚地看到delta是0xffffffff。有人能告诉我如何进入条件语句吗?
谢谢你
我已经尝试了很多东西,包括uint64_t delta;uint32_t delta等。
奇怪的是,如果Flash包含0xffffffff,我将上面的条件改为if(delta == 0x 0),我将输入条件...
我不明白??
2条答案
按热度按时间5t7ly7z51#
问题在这里
static uint16_t delta;
你将delta声明为一个uint16_t变量,它只能保存0到65535之间的值。Flash_Read_NUM()返回的值是32位值(0xFFFFFFFF),不能存储在uint16_t变量中。当您将此值赋给delta时,它会被截断以适合16位范围,从而产生值0xFFFF。
要解决这个问题,您应该将delta的类型更改为32位无符号整数(uint32_t)。
像这样的
static uint32_t delta; delta = Flash_Read_NUM(ADDR_FLASH_PAGE_101);
应该可以工作cetgtptt2#
您的常量FLASH_EMPTY在数值上大于
uint16_t delta
中可以存储的值。如果只想比较低16位,请强制转换或屏蔽该值:示例输出:
如果
Flash_Read_NUM
返回uint32_t
,另一个好的选择是删除强制转换,使其成为uint32_t delta
: