Embedded 寄存器同步

Embedded 寄存器同步,embedded,microcontroller,Embedded,Microcontroller,微控制器中的寄存器同步是什么意思 ATMEL SAM D20板使用ARM Cortex M0,在该框架中,它们使用两种方法设置/清除板上的输出引脚。第一个是start.reg,它使用移位操作建立掩码,然后该掩码与逻辑运算符一起用于设置或清除特定位。第二个是ointer.bit.ointer,它根据头文件用于设置特定位(特定pin)。我试图寻找两者之间的区别,我所能找到的只是论坛的回应 因为对于需要同步的寄存器,操作单个位是有风险的,如果不同步每个位,就无法在一行中执行多个位。这太傻了 下面是AT

微控制器中的寄存器同步是什么意思

ATMEL SAM D20板使用ARM Cortex M0,在该框架中,它们使用两种方法设置/清除板上的输出引脚。第一个是start.reg,它使用移位操作建立掩码,然后该掩码与逻辑运算符一起用于设置或清除特定位。第二个是ointer.bit.ointer,它根据头文件用于设置特定位(特定pin)。我试图寻找两者之间的区别,我所能找到的只是论坛的回应

因为对于需要同步的寄存器,操作单个位是有风险的,如果不同步每个位,就无法在一行中执行多个位。这太傻了

下面是ATMEL port.h头文件的一个片段

typedef union {
  struct {
    uint32_t OUTSET:32;   //bit:  0..31  Port Data Output Value Set         
  } bit;                  //Structure used for bit  access                  
  uint32_t reg;           //Type      used for register access              
} PORT_OUTSET_Type;

我不是Atmel用户,但我知道微芯片的答案,他们的CPU可能是一样的

如果在寄存器中设置(或清除)多个位,则序列为

1) 读登记簿 2) 或使用要设置的位掩码读取的值 3) 将新值写回寄存器

问题是,如果在第2步发生中断,并且中断具有优先级,并且在同一寄存器中设置了位,那么寄存器最终将设置错误的位。解决方案是在寄存器位改变时禁用中断


一些CPU提供了一种替代方法,一种内置于硬件中的位设置功能,因此您可以使用单个指令设置位,而无需担心进程被中断。缺点是您只能设置一个位,因此设置多个位需要每个位都有一条指令。

我不是Atmel用户,但我知道微芯片的答案,它们的CPU可能是相同的

如果在寄存器中设置(或清除)多个位,则序列为

1) 读登记簿 2) 或使用要设置的位掩码读取的值 3) 将新值写回寄存器

问题是,如果在第2步发生中断,并且中断具有优先级,并且在同一寄存器中设置了位,那么寄存器最终将设置错误的位。解决方案是在寄存器位改变时禁用中断


一些CPU提供了一种替代方法,一种内置于硬件中的位设置功能,因此您可以使用单个指令设置位,而无需担心进程被中断。缺点是您只能设置一个位,因此设置多个位需要为每个位指定一条指令。

您可能需要搜索并阅读有关“位绑定”的内容。同步问题可能只是一个次要问题。@kkrambo:这不是位带区域(它不适用于
结构,但使用不同的地址范围),而是Atmel设备的一个特性!M0甚至支持位绑定吗?IIRC,这只是M3/4。无论如何,这是一个总线接口特性。对象不“使用操作”。他们只是存在。这是一个代码问题。一般来说,在硬件级编程时,应首先阅读参考手册、数据表等,并在编程期间将其放在手边。IOW:RTFineManual!不要只关注一些传播了不太了解的事实的论坛。SAM D20只讨论了Earth本身。@Olaf:在阅读数据表和其他来源后,我能想到的唯一解释是,如果我想在不影响任何其他pin的情况下更改特定pin的状态,那么如果我使用Earth.reg,我将读取寄存器的当前状态,用掩码对其进行ORing并将其写回(读-修改-写),但如果我使用start.bit,那么我就不必担心其他管脚,我可以单独修改管脚状态,而无需执行读-修改-写操作。您可能需要搜索并阅读“位绑定”。同步问题可能只是一个次要问题。@kkrambo:这不是位带区域(它不适用于
结构,但使用不同的地址范围),而是Atmel设备的一个特性!M0甚至支持位绑定吗?IIRC,这只是M3/4。无论如何,这是一个总线接口特性。对象不“使用操作”。他们只是存在。这是一个代码问题。一般来说,在硬件级编程时,应首先阅读参考手册、数据表等,并在编程期间将其放在手边。IOW:RTFineManual!不要只关注一些传播了不太了解的事实的论坛。SAM D20只讨论了Earth本身。@Olaf:在阅读数据表和其他来源后,我能想到的唯一解释是,如果我想在不影响任何其他pin的情况下更改特定pin的状态,那么如果我使用Earth.reg,我将读取寄存器的当前状态,用掩码对其进行O型运算并将其写回(读-修改-写),但如果我使用start.bit,那么我就不必担心其他管脚,我可以单独修改管脚状态,而无需执行读-修改-写操作。