引用如下代码:
void calledFunction(volatile uint8_t **inPtr);
volatile uint8_t buffer[] = {0,0,0,0,0,0};
volatile uint8_t *headPtr = buffer;
void foo(void)
{
volatile uint8_t *tmpPtr = NULL;
tmpPtr = headPtr;
//This function modifies tmpPtr
calledFunction(&tmpPtr);
headPtr = tmpPtr;
return;
}
这是我试图使其成为中断安全的代码的简化版本,我不确定为什么这个本地被定义为 volatile
。我知道没有性能原因(即保证此函数至少为 O(n)),因为此函数应该尽可能高效地运行。
这个函数可以在主执行和内部中断中调用,但是由于tmpPtr
是一个非静态局部变量,它不应该能够被foo(的任何其他实例修改) )
。
在此上下文中,我看不到任何需要 volatile
关键字的访问模式。
简而言之,函数 foo()
中 tmpPtr
的 volatile
关键字的用途是什么?
编辑:忘记了函数参数中的&
EDIT2:我继承了这段代码,需要修改它。
我的主要问题是 volatile
关键字在这种情况下是否有任何特殊的有效理由。
EDIT3:添加了 usedFunction()
EDIT4:在原始代码中添加了重要说明,headPtr
和buffer
都具有 volatile
最佳答案
tmpPtr
具有 volatile
的原因是 tmpPtr
需要引用 volatile uint8_t
,而不是因为tmpPtr
本身是 volatile
(它不是)。
正如@Eugene Sh. 最初指出的那样,这个问题的出现是由于定义 volatile
指针和变量时对语法的误解。 This question对 volatile
指针与 volatile
指针的语法有很好的解释。
关于c - C中 volatile 非静态局部变量的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62916298/