gpt4 book ai didi

c - 如何安全地转换/复制 volatile 变量?

转载 作者:太空狗 更新时间:2023-10-29 16:40:48 26 4
gpt4 key购买 nike

volatile char* sevensegment_char_value;

void ss_load_char(volatile char *digits) {
...
int l=strlen(digits);
...
}

ss_load_char(sevensegment_char_value);

在上面的例子中,我收到了来自 avr-gcc 编译器的警告

Warning 6   passing argument 1 of 'strlen' discards 'volatile' qualifier from pointer target type [enabled by default]

所以我必须以某种方式将值从 volatile 变量复制到非 volatile 变量?安全的解决方法是什么?

最佳答案

在 C 语言中没有“内置”变通方法这样的东西。Volatile 告诉编译器,变量的内容(或者在您的情况下是变量指向的内存)可以在编译器没有注意到的情况下发生变化,并且强制编译器直接从数据总线读取数据,而不是使用寄存器中可能存在的副本。因此,volatile 关键字用于避免通过编译器优化引起的奇怪行为。 (如果你愿意,我可以进一步解释)

在您的例子中,您有一个声明为 volatile 的字符缓冲区。如果您的程序在不同的上下文(例如 ISR)中更改此缓冲区的内容,则您必须实现某种同步机制(例如禁用特定中断等)以避免数据不一致。在获取“锁定”(禁用中断)后,您可以将数据逐字节复制到本地(非 volatile )缓冲区,并在该缓冲区上处理例程的其余部分。

如果缓冲区不会在您的读取访问上下文的“外部”发生变化,我建议省略 volatile 关键字,因为它没有用处。

要判断正确的解决方案,需要更多关于您的具体用例的信息。

关于c - 如何安全地转换/复制 volatile 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626085/

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