在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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值