Blogs

最喜欢的工具:C ++ 11 STD :: Array

马修eShleman.2017年2月26日 2评论

许多嵌巴黎人送28元软件和固件 必须开发项目以高标准的可靠性。为满足这些可靠性要求,固件项目团队将考虑许多设计权衡。例如,工程团队可能会避免或 直接禁止使用 动态内存分配,通常通过C库调用访问的功能“ Malloc. “或C ++分配器” 新的 “。当在这些约束下的创作软件时,固件工程师通常会采用静态编译时间分配所有必要的阵列,数据结构和变量。静态分配策略的好处包括:

  • 使用动态内存分配时,长时间运行系统可以“碎片”内存池( 又名堆 ),导致意外和随机的内存分配失败。
  • 从堆分配和解除存储器的运行时间要求是非确定性的,对产品的实时响应要求产生负面影响。
  • 静态内存分配允许编译和链路时间强制目标设备的RAM约束。

在C ++ 11中,我们现在有一个新的工具,可以帮助我们静态分配的固件设计:std :: array容器类。从 Bjarne Stroustrup.,我们了解到 以下优惠:

  • 没有开销。
  • 不使用堆。
  • 适用于A. initializer list.
  • 知道它的大小(即元素数量)。
  • 它是一个序列容器,并提供类似于std :: vector的界面。
  • 除非您明确要求它,否则不会转换为指针。
  • 引用stroustrup:“换句话说,它非常像一个没有问题的内置数组......标准阵列的功能使其对嵌巴黎人送28元系统编程(以及类似约束,性能关键或安全关键任务)具有吸引力。“

如果它尚不明显:我卖了!此外,我们应该强调C ++ 11 STD :: Array基本上更安全的事实,而不是标准C阵列。

本文以PDF格式提供,便于打印

要了解我们如何使用STD :: Array容器,请随时查看此演示项目: freertosesp32accelledstripmqttdemo. 具体而具体基于模板的类: ColormappedDatavisualizer.HPP.。在此帖子的上下文中,以下是代码的适当样本:

template<uint16_t NUM_PIXELS_, rmt_channel_t RMT_CHANNEL_, gpio_num_t GPIO_NUM_>
class ColorMappedDataVisualizer
<cut>
std::array<led_color_t, NUM_PIXELS_> mDataPoints;
std::array<led_color_t, NUM_PIXELS_> mLedStripBuf1;
std::array<led_color_t, NUM_PIXELS_> mLedStripBuf2;

在这个项目中,ColormappeDatavisualizer类别处理所连接的LED条带的可视化。 “像素”(AKA LED)的数量经由模板参数Num_pixels_配置,因此LED条带的大小在编译时约束,仍然灵活地允许不同的产品配置的不同构建。此外,服务LED条带的所有阵列和缓冲区都是基于NUM_PIXELS_模板参数的编译时间分配。提供类似服务的其他开源类是使用堆来动态分配LED条带所需的缓冲区,这意味着这些类的用户可能不会立即实现其软件在增加LED条带时失败。通过在ColormappeDatavisualizer类中看到的方法,用户将产生构建错误 RAM使用率超过了目标设备资源。早期编译时间或链路时间错误是稍后的运行时间错误的优选。

其他优点包括访问现有的C ++标准库功能和方法。我们的演示类中的一个例子包括使用std :: rotate:

std::rotate(mDataPoints.rbegin(), mDataPoints.rbegin() + 1, mDataPoints.rend());    

使用STD :: Array还暗示使用STD :: Vector的简单转换路径,如果需要产品要求和动态内存分配而不是静态分配。

最后,STD :: Array是与传统C的库一起使用的琐碎。查看ColormappeDatavisualizer中的代码,如:

mLedStrip.led_strip_buf_1 = mLedStripBuf1.data();

其中指向原始底层数组的指针传递给C库。

所有这些都说:什么是不喜欢的?您如何在嵌巴黎人送28元系统软件项目中使用C ++ 11 STD :: Array容器?


[]
评论 Mswilk67. 2019年1月11日

STD :: Array是伟大的,谢谢你的帖子。这略有偏离主题,但不幸的是,与几个流行的工具(keil和嵌巴黎人送28元工作室到目前为止,我见过的嵌巴黎人送28元工作室)是,当他们现在支持C ++ 11的语义时,他们不会用/支持更新模板类,如std :: Array。使用Keil V5编译器使用C ++11启用时以及当我尝试使用Segger的最新版本的嵌巴黎人送28元工作室时,阵列标题完全缺少,并且没有对其分布式库的更新。我认为罗利可能不幸有同样的问题。 Rowley和嵌巴黎人送28元工作室都是GCC的所以这令人惊讶。仍然发现配置为Rowley / Segger解决方案外部使用GCC的时间,以获取最新的库。由于各种记录的缺陷和这样的东西,我完全被遗弃了。

[]
评论 Mattheweshleman.2019年1月11日

有益于每个人都知道,谢谢!我很幸运能够使用几乎所有现代的C ++ / GCC项目,所以还没有遇到自己。

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录