相关疑难解决方法(0)

C++递减单字节(易失性)数组的元素不是原子的!为什么?(另外:我如何在Atmel AVR mcus/Arduino中强制原子性)

我只是失去了几天,从字面上看,大约25个小时的工作,因为我试图调试我的代码而不是我不知道的简单.

事实证明,在C++中减少单字节数组的元素,在AVR上,ATmega328 8位微控制器(Arduino)不是原子操作,需要原子访问保护(即关闭中断).为什么是这样???此外,在Atmel AVR微控制器上确保原子访问变量的所有C技术是什么?

这是我所做的一个愚蠢的版本:

//global vars:
const uint8_t NUM_INPUT_PORTS = 3;
volatile uint8_t numElementsInBuf[NUM_INPUT_PORTS];

ISR(PCINT0_vect) //external pin change interrupt service routine on input port 0
{
  //do stuff here
  for (uint8_t i=0; i<NUM_INPUT_PORTS; i++)
    numElementsInBuf[i]++;
}

loop()
{
  for (uint8_t i=0; i<NUM_INPUT_PORTS; i++)
  {
    //do stuff here
    numElementsInBuf[i]--; //<--THIS CAUSES ERRORS!!!!! THE COUNTER GETS CORRUPTED.
  }
}
Run Code Online (Sandbox Code Playgroud)

这是循环的版本,没关系:

loop()
{
  for (uint8_t i=0; i<NUM_INPUT_PORTS; i++)
  {
    //do stuff here
    noInterrupts(); //globally disable interrupts 
    numElementsInBuf[i]--; //now it's ok...30 hrs of …
Run Code Online (Sandbox Code Playgroud)

c++ avr atomic arduino interrupt

2
推荐指数
2
解决办法
847
查看次数

标签 统计

arduino ×1

atomic ×1

avr ×1

c++ ×1

interrupt ×1