pub struct Xwcq<const S: XwSz, const N: XwSz>where
    [u8; { _ }]: Sized,{ /* private fields */ }Expand description
循环队列对象结构体
Implementations§
source§impl<const S: XwSz, const N: XwSz> Xwcq<S, N>where
    [u8; { _ }]: Sized,
 
impl<const S: XwSz, const N: XwSz> Xwcq<S, N>where
    [u8; { _ }]: Sized,
sourcepub const fn new() -> Self
 
pub const fn new() -> Self
新建循环队列对象
新建时需要指定类型常量参数。
- S是数据槽的大小,不能为0,若- S不满足内存对齐的要求,会自动向上调整。
- N是数据槽的数量,不能为0。
此方法是编译期方法。循环队列只可被定义为具有 'static 约束的全局变量全局变量:
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 8> = Xwcq::new(); // 64字节 * 8个槽sourcepub fn init(&'static self) -> XwcqError
 
pub fn init(&'static self) -> XwcqError
初始化循环队列对象
循环队列对象必须调用此方法一次,方可正常使用。
如果在创建循环队列时,指定的 S * N == 0 ,初始化时将返回错误 XwcqError::PoolSize 。
§错误码
- XwcqError::Ok没有错误
- XwcqError::PoolSize循环队列内存大小错误
§上下文
- 任意
§示例
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 8> = Xwcq::new(); // 64字节 * 8个槽
pub fn xwrust_example_xwcq() {
    let rc = CQ.init();
}sourcepub fn eq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
    T: Sized + Send,
 
pub fn eq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
    T: Sized + Send,
将数据发送到循环队列的 尾端 (入队,EnQueue)
- 如果循环队列数据已被填满,循环队列会循环回队列 首端 的位置,覆盖掉原数据。
- 发送时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地被拷贝到循环队列的数据槽内的。
- 当发送的数据类型大小大于循环队列的数据槽大小 S,发送会失败,并返回错误码XwcqError::DataSize。
§参数说明
- data: 类型为 T的数据
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::DataSize数据大小错误
§上下文
- 任意
§示例
use xwrust::xwos::thd::SThd;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
static CHILD: SThd<1024, &str> = SThd::new("CHILD0", true);
pub fn xwrust_example_xwcq() {
    CQ.init();
    CHILD.run(|_| { // 子线程0
            // 将utf-8字符串放入 `[u8; 64]` 数组中后发送
            let mut buffer: [u8; 64] = [0; 64];
            let msg = "子线程数据".as_bytes();
            let msgsize = msg.len();
            buffer[..msgsize].copy_from_slice(msg);
            let rc = CQ.eq(buffer);
            match rc {
                Ok(sz) => { // 发送数据成功
                },
                Err(e) => { // 发送数据失败
                },
            };
            "OK"
        });
}sourcepub fn jq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
    T: Sized + Send,
 
pub fn jq<T>(&self, data: T) -> Result<XwSz, XwcqError>where
    T: Sized + Send,
将数据发送循环队列的 首端 (插队,Jump the Queue)
- 如果循环队列数据已被填满,循环队列会循环回队列 尾端 的位置,覆盖掉原数据。
- 发送时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地被拷贝到循环队列的数据槽内的。
- 当发送的数据类型大小大于循环队列的数据槽大小 S,发送会失败,并返回错误码XwcqError::DataSize。
§参数说明
- data: 类型为 T的数据
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::DataSize数据大小错误
§上下文
- 任意
§示例
use xwrust::xwos::thd::SThd;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
static CHILD: SThd<1024, &str> = SThd::new("CHILD0", true);
pub fn xwrust_example_xwcq() {
    CQ.init();
    CHILD.run(|_| { // 子线程0
            // 将utf-8字符串放入 `[u8; 64]` 数组中后发送
            let mut buffer: [u8; 64] = [0; 64];
            let msg = "子线程数据".as_bytes();
            let msgsize = msg.len();
            buffer[..msgsize].copy_from_slice(msg);
            let rc = CQ.jq(buffer);
            match rc {
                Ok(sz) => { // 发送数据成功
                },
                Err(e) => { // 发送数据失败
                },
            };
            "OK"
        });
}sourcepub fn dq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn dq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.dq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn dq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn dq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
- 当到达指定的唤醒时间点,线程被唤醒,返回错误码 XwcqError::Timedout。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::Timedout等待超时
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.dq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn dq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn dq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列的 首端 接收数据(离队,DeQueue),并且等待不可被中断
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.dq_unintr::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn trydq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn trydq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
尝试从循环队列的 首端 接收数据(离队,DeQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,立即返回 XwcqError::DataSize,此方法不会阻塞等待。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 任意
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NoData循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.trydq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
        },
    };
}sourcepub fn rq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn rq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.rq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn rq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn rq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
限时等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
- 当到达指定的唤醒时间点,线程被唤醒,返回错误码 XwcqError::Timedout。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::Timedout等待超时
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§上下文
- 线程
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.rq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn rq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn rq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列的 尾端 接收数据(反向离队,Reversely deQueue),并且等待不可被中断
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.rq_unintr::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn tryrq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn tryrq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
尝试从循环队列的 尾端 接收数据(反向离队,Reversely deQueue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 若循环队列为空,立即返回 XwcqError::DataSize,此方法不会阻塞。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 任意
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NoData循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.tryrq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
        },
    };
}sourcepub fn pfq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn pfq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.pfq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn pfq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn pfq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
限时等待从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
- 当到达指定的唤醒时间点,线程被唤醒,返回错误码 XwcqError::Timedout。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::Timedout等待超时
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.pfq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn pfq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn pfq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列 头端 拷贝数据(Peek at the Front of Queue),并且等待不可被中断
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.pfq_unintr::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn trypfq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn trypfq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
尝试从循环队列 头端 拷贝数据(Peek at the Front of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,立即返回 XwcqError::DataSize,此方法不会阻塞。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 任意
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NoData循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.trypfq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
        },
    };
}sourcepub fn prq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn prq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.prq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn prq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn prq_to<T>(&self, to: XwTm) -> Result<T, XwcqError>where
    T: Sized + Send,
限时等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
- 当线程阻塞等待被中断时,返回错误码 XwcqError::Interrupt。
- 当到达指定的唤醒时间点,线程被唤醒,返回错误码 XwcqError::Timedout。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::Interrupt等待被中断
- XwcqError::Timedout等待超时
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwtm;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.prq_to::<[u8; 64]>(xwtm::ft(xwtm::s(1)));
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn prq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn prq_unintr<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
等待从循环队列 尾端 拷贝数据(Peek at the Rear of Queue),并且等待不可被中断
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,线程会阻塞等待,且不可被中断。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 线程
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NotThreadContext不在线程上下文内
- XwcqError::DisPmpt抢占被关闭
- XwcqError::DisBh中断底半部被关闭
- XwcqError::DisIrq中断被关闭
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.prq_unintr::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
            break;
        },
    };
}sourcepub fn tryprq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
 
pub fn tryprq<T>(&self) -> Result<T, XwcqError>where
    T: Sized + Send,
尝试从循环队列 尾端 拷贝数据(Peek at the Rear of Queue)
- 当循环队列未初始化,返回错误码 XwcqError::NotInit。
- 拷贝数据不会取走数据,也不会释放数据槽,数据可被重复拷贝,也可继续被接收。
- 若循环队列为空,立即返回 XwcqError::DataSize,此方法不会阻塞。
- 接收时,数据类型是泛型 T,T必须是Sized的,数据是被逐字节地从循环队列的数据槽中拷贝到出来的。
- 循环队列不会对接收时的 T与 发送时的T进行检查,因此用户必须确保两个类型是一样的,或能安全地进行转换。
- 当 T大小大于循环队列的数据槽大小S,接收会失败,并返回错误码XwcqError::DataSize。
§上下文
- 任意
§错误码
- XwcqError::Ok没有错误
- XwcqError::NotInit循环队列没有初始化
- XwcqError::NoData循环队列中没有数据
§示例
extern crate core;
use core::str;
use core::slice::memchr::memchr;
use xwrust::xwmd::xwcq::*;
static CQ: Xwcq<64, 16> = Xwcq::new();
pub fn xwrust_example_xwcq() {
    CQ.init();
    // ...省略...
    let rc = CQ.tryprq::<[u8; 64]>();
    match rc {
        Ok(d) => { // 获取数据成功
            // 从 `[u8; 64]` 数组中构建切片 `&str`
            let totalslice = &d[0..64];
            let nullpos = memchr(0, totalslice).unwrap_or(64);
            let msgu8slice = &d[0..nullpos];
            let msg = str::from_utf8(msgu8slice);
        },
        Err(e) => { // 获取数据失败
        },
    };
}