如何解决如何在C ++中从uint32_t异步存储和弹出uint8_t?
我正在研究MCU,增强了library,使其无阻塞。
它已经使用while
循环阻止代码了一段时间。
我已经对库进行了调整,以删除所有这些阻止,嗅探应发送到std::vector<uint8_t> internalBuffer
的所有内容。并使用micros()
通过loop()中的流输出异步发送字节。
我正在通过将std::vector<uint8_t> internalBuffer
转换为std::vector<uint32_t>
来减少空间(使用带有对齐的4字节的ESP8266)来增强这种功能。
我知道如何存储uint8_t
并将其提取到uint32_t
,但是当涉及到异步存储和提取时,这带来了未知的可能性。
由于uint8_t
的存储和提取是异步的,因此存储可以随时进行,提取受到时间间隔的限制。
值得一提的是:我已经完成了存储,但是我没有完整的提取代码。
void Pos_Printer::storeInBuffer(uint8_t c)
{
uint32_t longInt = 0UL;
if (excessBytesInBuffer == 0)
{
longInt = c;
}
else
{
longInt = internalBuffer.back();
internalBuffer.pop_back();
longInt = longInt << 8 * excessBytesInBuffer + c;
}
excessBytesInBuffer++;
excessBytesInBuffer %= 4;
internalBuffer.push_back(longInt);
}
提取未完成(在CLASS :: loop()处):
if (micros() - resumeTime > 0 && internalBuffer.size())
{
uint32_t longInt = 0UL;
uint8_t byteToSend = 0;
if(internalBuffer.size() == 1)
{ //Work on excessBytesInBuffer
longInt = internalBuffer.at(0);
if(excessBytesInBuffer)
{ //What if remained 1 and stored +3 Bytes after this ?
byteToSend = (longInt >> 8 * excessBytesInBuffer) & 0xFF;
}
}
else
{
}
stream->write(byteToSend);
internalBuffer.erase(internalBuffer.begin()); //Uncompleted
lastWritingTime = micros();
}
另一个解决方案:我想到了另一个解决方案:存储4个字节的1个(uint32_t),以跟踪存储的字节数(从1到3)。但是,如果要优化将图像存储到库中,这将是一个很大的损失(例如)。
解决方法
就像保存excessBytesInBuffer
一样,提取时也需要missingBytesInBuffer
之类的东西。那么只有在internalBuffer.erase(internalBuffer.begin());
为4的情况下,您才会执行missingBytesInBuffer
。
如果一次存储四个字节(假设它们全部位于调用方),则可以加快处理速度。
类似地,您可以一次提取四个字节,并将其保存在本地缓冲区(缓存)中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。