一般的SPI SRAM在使用时,最高效的工作模式是设置成环形缓冲区, 如果再结合生产者和消费者模型,即是在嵌入式实时应用中的一个"运行时高效"的设计实践. 比如用在音视频流的传输上.
下面是代码的原型, 这里用了数组buffer作为截体, 如何截体换成一个结构,用来对spi sram进行抽象, 就可以在spi sram芯片上使用生产者和消费者模型(它们的中介/中间层是一个Ring buf环形缓冲区).
#include <QtCore>
#include <iostream>
#include <QDebug>
const int DataSize = 100000;//<<KEY>>
const int BufferSize = 4096;//<<KEY KEY>>
static char buffer[BufferSize];/*char数组对缓冲的抽象,也可以换成一个结构,用来对spi sram进行抽象,
就可以在spi sram芯片上使用生产者和消费者模型(它们的中介/中间层是一个Ring buf环形缓冲区)*/
//用两个信号量来同步生产者和消费者线程
static QSemaphore freeSpace(BufferSize);//可写空间
static QSemaphore usedSpace(0); //可读空间
class Producer : public QThread
{
public:
void run();
};
void Producer::run()
{
for (int i = 0; i < DataSize; ++i) {//
qDebug()<<"Producer";
freeSpace.acquire(); //可写空间-1
qDebug()<<"freeSpace = "<<freeSpace.available();
buffer[i % BufferSize] = "ACGT"[uint(std::rand()) % 4];//i%BufferSize使buffer[index]的index总是在[0,BufferSize-1]
usedSpace.release(); //可读空间+1
qDebug()<<"usedSpace = "<<usedSpace.available();
}
}
class Consumer : public QThread
{
public:
void run();
};
void Consumer::run()
{
for (int i = 0; i < DataSize; ++i) {
qDebug()<<"Consumer";
usedSpace.acquire(); //可读空间-1
qDebug()<<"usedSpace = "<<usedSpace.available();
std::cerr << buffer[i % BufferSize];
freeSpace.release(); //可写空间+1
qDebug()<<"freeSpace = "<<freeSpace.available();
}
//std::cerr << std::endl;
}
int main()
{
Producer producer;
Consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}