我目前正在进行一个项目,在这个项目中,我使用一个中断来填充128个值的数组。每个中断顺序更新数组中的一个值。当数组已满时,将有一个短暂的延迟,然后进程将从一批新值开始,以填充数组。问题在于我需要读取这个数组,并且在更新数组的过程中我不想读取它。
我试图在下面的伪代码中实现这一点,但仍然存在一个问题,即指针在读取过程中可能会被交换。
有没有人对实现这一目标的好方法有什么想法?

int arrayA[128];
int arrayB[128];

int *readPointer;
int *writePointer;

readPointer = arrayA;
writePointer = arrayB;

void while(1) {
   read();
   delay(100);
}

_interrupt rx() {
   static int index = 0;
   *(writePointer+index) = readVal();
   index++;
   if(index==128) {
      index = 0;
      temp = writePointer;
      writePointer = readPointer;
      readPointer  = temp;
   }
}

void read() {
     int myVal = anyValueInArray;
   }
}

最佳答案

可以使用3个数组。正在写的。准备好阅读的人。一个真正被阅读的人。当读卡器使用了它的数组时,它会将它的数组换成准备好读取的数组。当writer填充了一个数组后,它将其数组交换为准备好读取的数组。

int arrayA[128];
int arrayB[128];
int arrayC[128];

int *writePointer = arrayA;
int *readPointer = arrayB;
int *readReady = arrayC;

/* producer */
void on_interrupt () {
    int is_full = fill(writePointer);
    if (is_full) {
        swap(writePointer, readReady);
        ready_to_read_set(true);
        activate_reader();
    }
}

/* consumer */
void reader () {
    swap(readPointer, readReady);
    ready_to_read_set(false);
    drain(readPointer);
}

这假设,如果准备读取的填充数组尚未被读取,则将其与新填充的数组交换是没有问题的。
您的示例没有显示读卡器如何等待输入,但是无论存在什么机制,都可以在writer交换准备好读取的数组时使用这种方法进行调整。

07-28 02:34
查看更多