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

标签 c arduino

编辑:忽略有关“,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/

相关文章:

c - 为什么PLL不锁定?我的时钟配置正确吗?

c - 数据结构单循环链表

c - 文件大小超过缓冲区大小

mobile - 将 Adob​​e AIR 移动应用程序无线连接到 Arduino - 有哪些选项?

java - 递增数组值 - Arduino

c - 什么定义了 C 中的 strscpy?

c - x86 程序集中 '_emit 0Fh, _emit 31h' 是什么意思?

c++ - 阿杜伊诺错误 : too few arguments to function 'int getMode(int, int, int, int, int)'

Python 无法导入名称序列

serial-port - Arduino上整数的串行消息