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

5us2dqdw  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(100)

编辑:忽略关于',t' bit的问题.请在()之前回答关于SREG的Q
我只是翻阅了一下源代码,在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的存储发生在()之前。
当然,如果一个中断在存储SREG和SREG()之间发生,那么当micros()恢复其SREG版本(oldSREG)时,SREG可能会被更改,从而导致状态丢失。
Ignore:我主要对uint8_t oldSREG = SREG, t;正在做的事情感兴趣。
感谢任何反馈/帮助:)

lfapxunr

lfapxunr1#

uint8_t oldSREG = SREG, t;

字符串
是相同的:

uint8_t oldSREG = SREG;
uint8_t t;


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

**编辑:**问题已编辑,以下是另一个答案:

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

laik7k3q

laik7k3q2#

这只是声明多个变量的一种简单方法。

uint8_t oldSREG = SREG, t;

字符串
相当于:

uint8_t oldSREG = SREG;
uint8_t t;

hivapdat

hivapdat3#

uint8_t oldSREG = SREG, t;

字符串
用于初始化多个变量(SREG的oldSREG和默认uint8_t的t)
它与以下内容相同:

uint8_t oldSREG = SREG;
uint8_t;


你也可以把它写成:

uint8_t t, oldSREG = SREG;


也会有同样的效果

相关问题