c - C中 volatile 非静态局部变量的原因

标签 c embedded volatile

引用如下代码:

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()tmpPtrvolatile 关键字的用途是什么?

编辑:忘记了函数参数中的&

EDIT2:我继承了这段代码,需要修改它。 我的主要问题是 volatile 关键字在这种情况下是否有任何特殊的有效理由。

EDIT3:添加了 usedFunction()

的原型(prototype)

EDIT4:在原始代码中添加了重要说明,headPtrbuffer都具有 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/

相关文章:

c - 套接字 API : accept method didn't set sockaddr_in structure

linux - 将USB连接到linux emb设备时如何打开localhost

automation - 使用 Arduino 进行照明控制

c - 函数指针存放在哪里?

java - 多线程中读取字段

有人可以解释以下代码语句吗?

我可以在 FUSE 中实现带有打开文件表的文件系统吗?

C语言、printf语句循环

c - 缓冲区大小和从文件中读取

c - 使用 CAS(Compare And Swap)时,如何确保旧值确实是旧值?