在SPI SRAM上使用生产者和消费者模型初步分析

    一般的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;
}

猜你喜欢

转载自blog.csdn.net/u012915636/article/details/82049585