c++ - UART流打包;流还是向量?
问题描述
我正在编写一些代码以通过UART将STM32H7与BM64 蓝牙模块连接起来。
BM64 需要以字节为单位的二进制数据;一般来说:
1. Start word (0xAA)
2-3. Payload length
4. Message ID
5-n. Payload
n+1. Checksum
我的问题是关于消息队列的最佳实践,即: Custom iostream
,接口类中的消息向量还是其他?
到目前为止我的理解,如果有错误,请纠正或如果有遗漏,请补充:
自定义
iostream
具有简洁使用cout
等的巨大好处。非常可用和干净,并且很可能至少在原则上可移植到该项目中在其他 UART 端口上运行的其他设备。缺点是创建自定义的工作量相对较大,streambuf
并且不确定要为“endl
”使用什么(不能使用 null 或者'\n'
因为这些可能存在于消息中,它是二进制的。)向量对我来说似乎有点脏,特别是对于嵌入式的东西,动态分配可能会窃取大量内存,除非我无情地将周期花在
resize()
和reserve()
. 但是,消息向量(定义为 aclass
或struct
)将非常快速且易于执行。还有其他解决方案吗?注意,我不想使用数组,即传递缓冲区指针和缓冲区长度。
你会在这个应用程序中提出什么建议?
解决方案
在裸机系统上,我更喜欢具有最大可能有效负载大小的固定大小的缓冲区。其中两个,固定分配,一个填充,一个并行发送,完成后切换。所有类型的动态内存分配都以内存碎片告终,尤其是在此类缓冲区大小抖动的情况下。
即使你的系统有一个 MMU,最好不要做太多的动态堆分配。我经常使用自己编写的块池内存管理来摆脱长时间的碎片和延迟分配失败。
如果您害怕使用超过当前需要的内存,请再想一想:如果您的内存太少以至于您无法花费超过当前所需的内存,那么如果您确实需要最大缓冲区大小,您的系统有时可能会失败。这根本不是嵌入式的选择。最后一个是一个很好的论点,只要在实际运行时条件下这可能发生在“未来的某个时间点”,所有分配的内存或多或少都是固定的:-)
推荐阅读
- c++ - 从向量 C++ 计算字符串中的字母数
- reactjs - 从组件推断道具时缺少属性
- go - 可安全用于并发使用的旋转计数器
- generics - 如何在 dart 中创建具有通用返回类型的方法
- javascript - React Native如何将多个状态变量从onClick子发送到父类中的方法
- c - C中printf语句中char和说明符的加法/减法
- python - 试图将我的 dict 代码保存到 .csv 文件
- excel - 用零替换列单元格中的公式值和空白
- python - 在 Tweepy 中遇到 Python 打印语法错误
- javascript - 如何引用作为功能组件的样式组件?