Arduino micros() 实现 - 代码构造和 SREG

Arduino micros() implementation - code construction and SREG

编辑:忽略关于 ', t' 位的问题...请在 cli() 之前回答关于 SREG 的问题

我只是浏览源代码并在 wiring.c 中发现了这个:

unsigned long micros() {
    unsigned long m;
    uint8_t oldSREG = SREG, t; <<<<<<< What is the ', t' bit here?!

    cli();
    m = timer0_overflow_count;
    //etc

而且我还想知道为什么 SREG 的存储发生在 cli() 之前。

当然,如果在 SREG 和 cli() 的存储之间发生中断,当 micros() 恢复其 SREG 版本(oldSREG)时,SREG 有可能被更改导致状态丢失...

忽略:我主要对 uint8_t oldSREG = SREG, t; 正在做的事情感兴趣。

感谢任何 feedback/help :)

uint8_t oldSREG = SREG, t;

等同于:

uint8_t oldSREG = SREG;
uin8_t t;

它只是声明了一个类型为 uint8_t 的对象 t

编辑: 问题已编辑,这是另一个答案:

如果您的函数在其末尾恢复 SREG 并且如果您的中断处理程序正在访问 SREG 那么 oldSREG = SREG 应该放在 cli() 调用之后以避免任何竞争条件.

这只是声明多个变量的一种简写方式。

uint8_t oldSREG = SREG, t;

相当于:

uint8_t oldSREG = SREG;
uint8_t t;
uint8_t oldSREG = SREG, t;

用于初始化多个变量(SREG的oldSREG和默认的tuint8_t)

等同于:

uint8_t oldSREG = SREG;
uint8_t;

你也可以这样写:

uint8_t t, oldSREG = SREG;

并且会产生完全相同的效果