我目前正在进行一个项目,在这个项目中,我使用一个中断来填充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交换准备好读取的数组时使用这种方法进行调整。