libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::DoubleBuffer Class Reference

双缓冲区管理类 / Double buffer manager class More...

#include <double_buffer.hpp>

Public Member Functions

 DoubleBuffer (const LibXR::RawData &raw_data)
 构造函数,使用连续内存构造两个缓冲区 Constructs a double buffer using one continuous memory block
 
uint8_t * ActiveBuffer ()
 获取当前正在使用的缓冲区指针 Returns the currently active buffer
 
uint8_t * PendingBuffer ()
 获取备用缓冲区的指针 Returns the pending (inactive) buffer
 
size_t Size () const
 获取每个缓冲区的大小(单位:字节) Gets the size of each buffer in bytes
 
void Switch ()
 切换到备用缓冲区(若其有效) Switches to the pending buffer if it's valid
 
bool HasPending () const
 判断是否有待切换的缓冲区 Checks whether a pending buffer is ready
 
bool FillPending (const uint8_t *data, size_t len)
 向备用缓冲区写入数据(不可重入) Fills the pending buffer with data (non-reentrant)
 
bool FillActive (const uint8_t *data, size_t len)
 向当前使用的缓冲区直接写入数据 Fills the active buffer directly
 
void EnablePending ()
 手动启用 pending 状态 Manually sets the pending state to true
 
size_t GetPendingLength () const
 获取 pending 缓冲区中准备好的数据长度 Gets the size of valid data in pending buffer
 
void SetPendingLength (size_t size)
 设置备用缓冲区的数据长度 Sets the size of the pending buffer
 

Private Attributes

uint8_t * buffer_ [2]
 双缓冲区指针 / Double buffer pointers
 
size_t size_
 单个缓冲区大小 / Size of each buffer
 
int active_ = 0
 当前活动缓冲区编号 / Index of active buffer
 
bool pending_valid_
 标记备用区是否准备好 / Whether pending buffer is ready
 
size_t pending_len_ = 0
 备用缓冲区有效数据长度 / Length of pending data
 

Detailed Description

双缓冲区管理类 / Double buffer manager class

该类用于在嵌入式场景中管理双缓冲传输结构,支持主动缓冲、备用缓冲切换与填充。 用于实现无缝 DMA 或 USB 数据流水线发送,提高吞吐效率。 This class provides double-buffer control for efficient pipelined transmission such as USB or DMA streaming.

Definition at line 20 of file double_buffer.hpp.

Constructor & Destructor Documentation

◆ DoubleBuffer()

DoubleBuffer::DoubleBuffer ( const LibXR::RawData & raw_data)
explicit

构造函数,使用连续内存构造两个缓冲区 Constructs a double buffer using one continuous memory block

Parameters
raw_data连续内存区,大小必须为两个缓冲区之和 / The raw memory to be split

Definition at line 5 of file double_buffer.cpp.

5 : size_(raw_data.size_ / 2)
6{
7 buffer_[0] = static_cast<uint8_t*>(raw_data.addr_);
8 buffer_[1] = static_cast<uint8_t*>(raw_data.addr_) + size_;
9}
size_t size_
单个缓冲区大小 / Size of each buffer
uint8_t * buffer_[2]
双缓冲区指针 / Double buffer pointers
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.

Member Function Documentation

◆ ActiveBuffer()

uint8_t * DoubleBuffer::ActiveBuffer ( )

获取当前正在使用的缓冲区指针 Returns the currently active buffer

Returns
指向活动缓冲区的指针 / Pointer to the active buffer

Definition at line 11 of file double_buffer.cpp.

11{ return buffer_[active_]; }
int active_
当前活动缓冲区编号 / Index of active buffer

◆ EnablePending()

void DoubleBuffer::EnablePending ( )

手动启用 pending 状态 Manually sets the pending state to true

通常与 FillActive() 配合使用,表示下次发送使用 FillActive 写入的缓冲。

Definition at line 50 of file double_buffer.cpp.

50{ pending_valid_ = true; }
bool pending_valid_
标记备用区是否准备好 / Whether pending buffer is ready

◆ FillActive()

bool DoubleBuffer::FillActive ( const uint8_t * data,
size_t len )

向当前使用的缓冲区直接写入数据 Fills the active buffer directly

Parameters
data数据源指针 / Source data pointer
len数据长度 / Length to write
Returns
成功返回 true,失败(超出大小)返回 false True on success, false if length exceeds buffer size

Definition at line 40 of file double_buffer.cpp.

41{
42 if (len > size_)
43 {
44 return false;
45 }
46 std::memcpy(ActiveBuffer(), data, len);
47 return true;
48}
uint8_t * ActiveBuffer()
获取当前正在使用的缓冲区指针 Returns the currently active buffer

◆ FillPending()

bool DoubleBuffer::FillPending ( const uint8_t * data,
size_t len )

向备用缓冲区写入数据(不可重入) Fills the pending buffer with data (non-reentrant)

Parameters
data数据源指针 / Pointer to the source data
len数据长度(字节) / Data length in bytes
Returns
写入成功返回 true,失败(如已占用或溢出)返回 false Returns true on success, false if buffer already pending or overflow

Definition at line 28 of file double_buffer.cpp.

29{
30 if (pending_valid_ || len > size_)
31 {
32 return false;
33 }
34 std::memcpy(PendingBuffer(), data, len);
35 pending_len_ = len;
36 pending_valid_ = true;
37 return true;
38}
uint8_t * PendingBuffer()
获取备用缓冲区的指针 Returns the pending (inactive) buffer
size_t pending_len_
备用缓冲区有效数据长度 / Length of pending data

◆ GetPendingLength()

size_t DoubleBuffer::GetPendingLength ( ) const

获取 pending 缓冲区中准备好的数据长度 Gets the size of valid data in pending buffer

Returns
准备好的长度 / Valid pending buffer data length

Definition at line 52 of file double_buffer.cpp.

52{ return pending_valid_ ? pending_len_ : 0; }

◆ HasPending()

bool DoubleBuffer::HasPending ( ) const

判断是否有待切换的缓冲区 Checks whether a pending buffer is ready

Returns
若有数据待切换返回 true,否则返回 false / True if pending buffer is valid

Definition at line 26 of file double_buffer.cpp.

26{ return pending_valid_; }

◆ PendingBuffer()

uint8_t * DoubleBuffer::PendingBuffer ( )

获取备用缓冲区的指针 Returns the pending (inactive) buffer

Returns
指向备用缓冲区的指针 / Pointer to the pending buffer

Definition at line 13 of file double_buffer.cpp.

13{ return buffer_[1 - active_]; }

◆ SetPendingLength()

void LibXR::DoubleBuffer::SetPendingLength ( size_t size)
inline

设置备用缓冲区的数据长度 Sets the size of the pending buffer

Parameters
size数据长度(字节) / Data length in bytes

Definition at line 116 of file double_buffer.hpp.

116{ pending_len_ = size; }

◆ Size()

size_t DoubleBuffer::Size ( ) const

获取每个缓冲区的大小(单位:字节) Gets the size of each buffer in bytes

Returns
缓冲区大小 / Size of each buffer

Definition at line 15 of file double_buffer.cpp.

15{ return size_; }

◆ Switch()

void DoubleBuffer::Switch ( )

切换到备用缓冲区(若其有效) Switches to the pending buffer if it's valid

Note
如果 pending 缓冲区未准备好,则不执行切换。 No switch is performed if no pending data is ready.

Definition at line 17 of file double_buffer.cpp.

18{
20 {
21 active_ ^= 1;
22 pending_valid_ = false;
23 }
24}

Field Documentation

◆ active_

int LibXR::DoubleBuffer::active_ = 0
private

当前活动缓冲区编号 / Index of active buffer

Definition at line 121 of file double_buffer.hpp.

◆ buffer_

uint8_t* LibXR::DoubleBuffer::buffer_[2]
private

双缓冲区指针 / Double buffer pointers

Definition at line 119 of file double_buffer.hpp.

◆ pending_len_

size_t LibXR::DoubleBuffer::pending_len_ = 0
private

备用缓冲区有效数据长度 / Length of pending data

Definition at line 124 of file double_buffer.hpp.

◆ pending_valid_

bool LibXR::DoubleBuffer::pending_valid_
private
Initial value:
=
false

标记备用区是否准备好 / Whether pending buffer is ready

Definition at line 122 of file double_buffer.hpp.

◆ size_

size_t LibXR::DoubleBuffer::size_
private

单个缓冲区大小 / Size of each buffer

Definition at line 120 of file double_buffer.hpp.


The documentation for this class was generated from the following files: