gpt4 book ai didi

c - 为什么在一个序列点内最多只能有一个具有 volatile 限定类型的读取访问?

转载 作者:太空狗 更新时间:2023-10-29 17:10:31 24 4
gpt4 key购买 nike

给定以下代码:

static volatile float32_t tst_mtr_dutycycle;
static volatile uint8_t tst_mtr_direction;
static volatile uint32_t tst_mtr_update;

void TST_MTR_Task(void)
{
if (tst_mtr_update == 1U)
{
tst_mtr_update = 0;

MTR_SetDC(tst_mtr_dutycycle, tst_mtr_direction);
}
}

我发现 MISRA C 2012 Rule-13.2 存在问题,因此我决定进行一些研究。我在这里 ( http://archive.redlizards.com/docs/misrac2012-datasheet.pdf ) 发现:

there shall be no more than one read access with volatile-qualified type within one sequence point

这里的问题是,我一直无法找到一个示例或解释来阐明为什么在一个序列点内只能有一个具有 volatile 限定类型的读取访问。

我需要为违规代码找到解决方案,但我不太清楚该怎么做。

我现在知道在一个序列点内最多只能有一个具有 volatile 限定类型的读取访问。问题是,为什么?我需要知道为什么才能实现解决方案并向这里的每个人解释为什么我要更改代码。

问候。

最佳答案

规则的理由是:

(Required) The value of an expression and its persistent side effects shall be the same under all permitted evaluation orders

如果在序列点之间读取了多个 volatile 限定变量,则未指定先读取哪个。读取 volatile 变量是一种副作用。

解决方案是显式排序读取:

void TST_MTR_Task(void)
{
if (tst_mtr_update == 1U)
{
tst_mtr_update = 0;

float32_t dutycycle = tst_mtr_dutycycle;
uint8_t direction = tst_mtr_direction;
MTR_SetDC(dutycycle, direction);
}
}

关于c - 为什么在一个序列点内最多只能有一个具有 volatile 限定类型的读取访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860389/

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