如何在 C 中抑制 'value computed but not used'?

How to suppress 'value computed but not used' in C?

关于消息 '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,第二次设置为 (1 << 31),第三次设置为 0。

这是我对程序使用的理解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在STM中是#definedstm32h723xx.hheader作为指向内存映射的指针HSEM_TypeDef 结构,其中 RLR 被定义为一个 __IO 合格的 32 uint32_t 数组。 __IOcore_cm7.h 中定义为 volatile。因此,无论该值是否被使用,编译器都会生成代码来读取该值,并且 (void) 转换意味着 不要抱怨该值未被使用 ,有效地沉默编译器警告。

因此,为了完整起见,请参考我在初始问题中上面的示例,带有抑制警告的正确代码如下所示(感谢@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);