编辑:忽略有关“,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;
所做的事情感兴趣。
感谢您的任何反馈/帮助:)
最佳答案
uint8_t oldSREG = SREG, t;
等同于:
uint8_t oldSREG = SREG;
uin8_t t;
它只是声明一个 uint8_t
类型的对象 t
。
编辑:问题已编辑,这是另一个答案:
如果您的函数在其末尾恢复 SREG
并且您的中断处理程序正在访问 SREG
,则 oldSREG = SREG
应放在 之后>cli()
调用以避免任何竞争条件。
关于c - Arduino micros() 实现 - 代码构建和 SREG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875881/