首页 > 解决方案 > UART流打包;流还是向量?

问题描述

我正在编写一些代码以通过UART将STM32H7BM64 蓝牙模块连接起来。

BM64 需要以字节为单位的二进制数据;一般来说:

1. Start word (0xAA)    
2-3. Payload length    
4. Message ID    
5-n. Payload    
n+1. Checksum

我的问题是关于消息队列的最佳实践,即: Custom iostream,接口类中的消息向量还是其他?

到目前为止我的理解,如果有错误,请纠正或如果有遗漏,请补充:

  1. 自定义iostream具有简洁使用cout等的巨大好处。非常可用和干净,并且很可能至少在原则上可移植到该项目中在其他 UART 端口上运行的其他设备。缺点是创建自定义的工作量相对较大,streambuf并且不确定要为“ endl”使用什么(不能使用 null 或者'\n'因为这些可能存在于消息中,它是二进制的。)

  2. 向量对我来说似乎有点脏,特别是对于嵌入式的东西,动态分配可能会窃取大量内存,除非我无情地将周期花在resize()reserve(). 但是,消息向量(定义为 aclassstruct)将非常快速且易于执行。

  3. 还有其他解决方案吗?注意,我不想使用数组,即传递缓冲区指针和缓冲区长度。

你会在这个应用程序中提出什么建议?

标签: c++c++11iostreamstreambuf

解决方案


在裸机系统上,我更喜欢具有最大可能有效负载大小的固定大小的缓冲区。其中两个,固定分配,一个填充,一个并行发送,完成后切换。所有类型的动态内存分配都以内存碎片告终,尤其是在此类缓冲区大小抖动的情况下。

即使你的系统有一个 MMU,最好不要做太多的动态堆分配。我经常使用自己编写的块池内存管理来摆脱长时间的碎片和延迟分配失败。

如果您害怕使用超过当前需要的内存,请再想一想:如果您的内存太少以至于您无法花费超过当前所需的内存,那么如果您确实需要最大缓冲区大小,您的系统有时可能会失败。这根本不是嵌入式的选择。最后一个是一个很好的论点,只要在实际运行时条件下这可能发生在“未来的某个时间点”,所有分配的内存或多或少都是固定的:-)


推荐阅读