C代码问题:有条件的不对闪光值起作用

velaa5lx  于 2023-05-06  发布在  其他
关注(0)|答案(2)|浏览(195)

我有一个问题,我确信这是一个简单的问题,但暗示了我。我有以下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),我将输入条件...
我不明白??

5t7ly7z5

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);应该可以工作

cetgtptt

cetgtptt2#

您的常量FLASH_EMPTY在数值上大于uint16_t delta中可以存储的值。如果只想比较低16位,请强制转换或屏蔽该值:

#include <stdio.h>
#include <stdint.h>

#define ADDR_FLASH_PAGE_101 101
#define DEFAULT_DELTA 42
#define FLASH_EMPTY 0xFFFFFFFF

uint32_t Flash_Read_NUM(uint32_t page) {
    return FLASH_EMPTY;
}

void Flash_Write_NUM(uint32_t page, uint32_t delta) {
    printf("write\n");
}

int main() {
    uint16_t delta = (uint16_t) Flash_Read_NUM(ADDR_FLASH_PAGE_101);
    if (delta == (uint16_t) FLASH_EMPTY) {
        delta = DEFAULT_DELTA;
        Flash_Write_NUM(ADDR_FLASH_PAGE_101, delta);
    }
}

示例输出:

write

如果Flash_Read_NUM返回uint32_t,另一个好的选择是删除强制转换,使其成为uint32_t delta

#include <stdio.h>
#include <stdint.h>

#define ADDR_FLASH_PAGE_101 101
#define DEFAULT_DELTA 42
#define FLASH_EMPTY 0xFFFFFFFF

uint32_t Flash_Read_NUM(uint32_t page) {
    return FLASH_EMPTY;
}

void Flash_Write_NUM(uint32_t page, uint32_t delta) {
    printf("write\n");
}

int main() {
    uint32_t delta = Flash_Read_NUM(ADDR_FLASH_PAGE_101);
    if (delta == FLASH_EMPTY) {
        delta = DEFAULT_DELTA;
        Flash_Write_NUM(ADDR_FLASH_PAGE_101, delta);
    }
}

相关问题