【发布时间】:2020-07-15 13:42:52
【问题描述】:
参考以下代码:
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:添加了calledFunction()的原型
EDIT4:在原始代码中添加了重要说明,headPtr 和 buffer 都具有 volatile
【问题讨论】:
-
它不是
volatile,它是一个指向volatile的指针。它指向全局buffer。因此,如果从中断上下文调用foo,您需要确保它实际上可以访问buffer。 -
另外,您通过 value 传递
tmpPtr,因此calledFunction不会(也不能)修改它。 -
@AdrianMole 这是一个指针。该函数可以修改指针。但是,是的,在那之后的那句话让我怀疑意图
-
@EugeneSh。是的,但是代码注释说“modifes tmpPtr”——它不能这样做。只能修改
*tmpPtr。 -
@AdrianMole 是的,下一行可能暗示你是对的。