代码之家  ›  专栏  ›  技术社区  ›  Hansel

如何抑制C语言中的“值已计算但未使用”?

  •  -1
  • Hansel  · 技术社区  · 3 年前

    关于消息“value computed is not used”,我找到了各种各样的解释如何修复相应的代码,但我找不到任何提示如何抑制这个警告。

    我有一个完美的密码

    HSEM->RLR[2] == (HSEM_CM4_CORE_ID | HSEM_PROC_ID | (1UL << 31));
    

    这是在STM32H745中锁定信号量的正确方法,因为信号量是通过读取锁定的。既然我知道这是有效代码,我该如何抑制这一行代码的警告?

    我在CubeIDE环境中使用gcc。

    编辑后添加:

    下面是我用来验证锁是否有效的代码:

    #define HSEM_CM4_CORE_ID (1 << 8)  // CPU2 is CM4
    #define HSEM_PROC_ID (0 << 0)
    volatile uint32_t x;
    x = HSEM->R[23] & (1 << 31);                                     // Read semaphore 23.
    HSEM->RLR[23] == (HSEM_CM4_CORE_ID | HSEM_PROC_ID | (1 << 31));  // Lock semaphore 23.
    x = HSEM->R[23] & (1 << 31);                                     // Read semaphore 23.
    HSEM->R[23] = HSEM_CM4_CORE_ID | HSEM_PROC_ID;                   // Release semaphore 23.
    x = HSEM->R[23] & (1 << 31);                                     // Read semaphore 23.
    

    当我使用调试器逐行检查此代码时,第一次x设置为0,第二次x设置为(1<<31),第三次x设置为0。

    1 回复  |  直到 3 年前
        1
  •  3
  •   chqrlie    3 年前

    这是我对使用 STM32H745 hardware semaphores ,但我可能错了。文件应提供编码示例,而不是示意图。

    读取信号量时,读取的值将取决于信号量是否空闲,但如果它是空闲的,读取过程将锁定它,完成后必须解锁它:

    while (HSEM->RLR[2] != HSEM_CM4_CORE_ID | 0x0000 | (1U << 31)) {
        /* semaphore was locked by another core/process, wait a bit */
        nanosleep(1000);
    }
    /* semaphore was locked, we can proceed */
    [...]
    /* unlock the semaphore */
    HSEM->RLR[2] = (HSEM_CM4_CORE_ID | HSEM_PROC_ID);
    

    如果你确定信号量是自由的,只是想锁定它,只需阅读寄存器:

    /* lock the semaphore */
    (void)HSEM->RLR[2];
    

    HSEM #defined 在STM中 stm32h723xx。H 标题作为指向映射内存的指针 HSEM_TypeDef 结构在哪里 RLR 定义为 __IO 32的限定数组 uint32_t . __木卫一 定义在 核心cm7。H volatile 因此,无论是否使用该值,编译器都将生成代码来读取该值,并且 (void) 演员阵容 不要抱怨没有使用该值 ,有效地消除了编译器警告。

        2
  •  1
  •   Hansel    3 年前

    因此,为了完整性起见,参考我在第一个问题中的示例,带有抑制警告的正确代码如下所示(感谢@chqrlie和@Eric Postpischil):

    #define HSEM_CM4_CORE_ID (1 << 8)  // CPU2 is CM4
    #define HSEM_PROC_ID (0 << 0)
    volatile uint32_t x;
    x = HSEM->R[2] & (1 << 31);                     // Read semaphore 2.
    (void) HSEM->RLR[2].                            // Lock semaphore 2.
    x = HSEM->R[2] & (1 << 31);                     // Read semaphore 2.
    HSEM->R[2] = HSEM_CM4_CORE_ID | HSEM_PROC_ID;   // Release semaphore 22.
    x = HSEM->R[2] & (1 << 31);