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 PendingLength () const
 获取 pending 缓冲区中准备好的数据长度 Gets the size of valid data in 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()

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

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

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

Definition at line 29 of file double_buffer.hpp.

29 : size_(raw_data.size_ / 2)
30 {
31 buffer_[0] = static_cast<uint8_t*>(raw_data.addr_);
32 buffer_[1] = static_cast<uint8_t*>(raw_data.addr_) + size_;
33 }
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 * LibXR::DoubleBuffer::ActiveBuffer ( )
inline

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

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

Definition at line 41 of file double_buffer.hpp.

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

◆ EnablePending()

void LibXR::DoubleBuffer::EnablePending ( )
inline

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

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

Definition at line 129 of file double_buffer.hpp.

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

◆ FillActive()

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

向当前使用的缓冲区直接写入数据 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 113 of file double_buffer.hpp.

114 {
115 if (len > size_)
116 {
117 return false;
118 }
119 std::memcpy(ActiveBuffer(), data, len);
120 return true;
121 }
uint8_t * ActiveBuffer()
获取当前正在使用的缓冲区指针 Returns the currently active buffer

◆ FillPending()

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

向备用缓冲区写入数据(不可重入) 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 92 of file double_buffer.hpp.

93 {
94 if (pending_valid_ || len > size_)
95 {
96 return false;
97 }
98 std::memcpy(PendingBuffer(), data, len);
99 pending_len_ = len;
100 pending_valid_ = true;
101 return true;
102 }
size_t pending_len_
备用缓冲区有效数据长度 / Length of pending data
uint8_t * PendingBuffer()
获取备用缓冲区的指针 Returns the pending (inactive) buffer

◆ HasPending()

bool LibXR::DoubleBuffer::HasPending ( ) const
inline

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

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

Definition at line 81 of file double_buffer.hpp.

81{ return pending_valid_; }

◆ PendingBuffer()

uint8_t * LibXR::DoubleBuffer::PendingBuffer ( )
inline

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

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

Definition at line 49 of file double_buffer.hpp.

49{ return buffer_[1 - active_]; }

◆ PendingLength()

size_t LibXR::DoubleBuffer::PendingLength ( ) const
inline

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

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

Definition at line 137 of file double_buffer.hpp.

137{ return pending_valid_ ? pending_len_ : 0; }

◆ Size()

size_t LibXR::DoubleBuffer::Size ( ) const
inline

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

Returns
缓冲区大小 / Size of each buffer

Definition at line 57 of file double_buffer.hpp.

57{ return size_; }

◆ Switch()

void LibXR::DoubleBuffer::Switch ( )
inline

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

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

Definition at line 66 of file double_buffer.hpp.

67 {
69 {
70 active_ ^= 1;
71 pending_valid_ = false;
72 }
73 }

Field Documentation

◆ active_

int LibXR::DoubleBuffer::active_ = 0
private

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

Definition at line 142 of file double_buffer.hpp.

◆ buffer_

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

双缓冲区指针 / Double buffer pointers

Definition at line 140 of file double_buffer.hpp.

◆ pending_len_

size_t LibXR::DoubleBuffer::pending_len_ = 0
private

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

Definition at line 145 of file double_buffer.hpp.

◆ pending_valid_

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

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

Definition at line 143 of file double_buffer.hpp.

◆ size_

size_t LibXR::DoubleBuffer::size_
private

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

Definition at line 141 of file double_buffer.hpp.


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