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;
并且会产生完全相同的效果
编辑:忽略关于 ', 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;
并且会产生完全相同的效果