1 背景

最近帮产品攻关一个问题,一个产品ROM/RAM资源特别紧张。由于开发团队使用了C++,静态引入libstdc++库增加了500K ROM。同时text/data也需加载到RAM才可以执行,导致RAM耗费也不少。开发团队短期内无法完全用C进行重构,需要看看是否有一些短期有效的方案。

2 问题调查

2.1 优化前后比较使用的工具

  1. 查询方法占用的大小:readelf -sW <elf文件> | awk -F' {1,}' '{print $9,$4}' | sort
  2. 查看整体需要被LOAD到内存段信息:readelf -l <elf文件>
  3. 查看编译后文件大小: ls -lh <elf文件>

2. 2 网上优秀资料汇总

1,如何在嵌入式C++开发中缩减代码尺寸

如何在嵌入式C++开发中缩减代码尺寸​kuangqi.me

2, How to Reduce Binaries Size

Android NDK: How to Reduce Binaries Size – The Algolia Blog | Algolia Blog​blog.algolia.com

这两篇文档主要核心方法总结:

  1. 编译器参数
  • -ffunction-sections -fdata-sections
  • -ffunction-sections -fdata-sections
  • -fno-exceptions
  • -fno-rtti

2. 衔接器参数

  • -Wl,--gc-sections

3. 编程技巧

  • Do not use stream

3 修改结果

本身项目中已经把编译器和衔接器手段都用了,但是仍旧有500K,只能重构代码,第一步把代码中的stream的使用代码都删除,发现节省比较大的空间:

1.4M可以减少到1.1M,基本可以满足诉求了。

把所有c++ stream的引入都删除,对应代码重构,幸运的是开发人员用的很少,很容易替换
#include <fstream>
#include <iostream>

4 业界IOT OS对C++使用调查

4.1 开源OS对C++支持情况

在IOT设备上资源非常紧张,对于大部分IOT OS上都不支持C++运行环境,对于支持C++的IOT OS是如何做的呢,做一些简单分析:

  1. Contiki:开源,语言C
  2. Android Things:闭源,语言Java/C/C++
  3. Riot:开源,语言C
  4. Apache Mynewt:开源,语言C
  5. LiteOS:开源,语言C
  6. Zephyr:开源,语言C
  7. TinyOS:开源,nesC
  8. Fuchsia:目前还是开发中,C/C++/Rust/Dart
  9. Windows IoT:闭源,. Net
  10. TizenRT:开源,C语言
  11. Raspberry Pii:开源,语言C
  12. Amazon FreeRTOS:开源,语言C
  13. Mbed OS:开源,语言C/C++
  14. RT-Thread:开源,语言C
  15. RIOT:开源,语言C/C++
  16. Nuttx:开源,语言C/C++

因为Android Things闭源,Fushia目前仍旧在开发中,在一些低端IOT设备上并不合适。我们对Mbed/RIOT/Nuttx使用的C++ 工具链和基础库做一个简要分析

4.2 Mbed对C++支持分析

Mbed OS是ARM公司开发的一个用于IOT的OS,资源

ARMmbed/mbed-os​github.com

The current baseline version is C++14,但是做了如下限制:

  1. chrono and threads依赖OS支持的,不建议使用
  2. atomics and shared pointers:跟硬件相关,不建议使用
  3. like streams and STL containers are quite heavy and may not be appropriate for small embedded use
  4. ARM C 5仅支持部分C++11特性,mbedOS提供了一些mbed的替换实现,例如use#include <mstd_utility>
  5. 一些移植性不好的特性:std::thread慎用

4.3 RIOT对C++支持分析

https://github.com/RIOT-OS/RIOT/tree/master/sys/cpp11-compat​github.com

支持C++11,针对OS和硬件相关特性进行了替换实现:

replacement to enable C++11-like thread, mutex and condition_variable

4.4 Nuttx对C++支持分析

apache/incubator-nuttx​github.com

A fragmentary C++ library that will allow to build only the simplest of
C++ applications. In the deeply embedded world, that is probably all
that is necessary.

提供了一个非常简单的库的实现,可以用最简单的C++特性。Nuttx也可以使用配置项CONFIG_LIBCXX=y选择LLVM "libc++"(http://libcxx.llvm.org/)或者CONFIG_UCLIBCXX=y选择uClibc++ C++ library (http://cxx.uclibc.org/)。

5 总结

5.1 编程注意

  • 禁止使用streams and STL containers
  • chrono,thread, mutex and condition_variable平台相关,最好不要使用
  • atomics and shared pointers:硬件相关,不建议使用
  • std::size_t平台相关,不建议使用
  • std::swap (<utility>) :硬件相关
  • std::void_t (<type_traits>):不建议使用。

5.2 平台适配

C++很多特性和硬件相关,使用C++的IOT系统也需要做一些裁剪和适配。

在IOT OS上谨慎使用C++,C的移植性最好。

c swap方法在哪个库里面_IOT操作系统用C++库的经验总结相关推荐

  1. linux 动态库 软链接,Linux操作系统下动态库的生成及链接方法

    下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作 libth ...

  2. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  3. win7怎么看服务器文件管理,Win7库文件管理器怎么用 Win7库功能及其使用方法详解...

    使用window7的用户都会注意到,系统里有一个极具特色的功能--"库",库是win7系统借鉴Ubuntu操作系统而推出的文件管理模式.库的概念并非传统意义上的存放用户文件的文件夹 ...

  4. linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...

    Linux下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作l ...

  5. python连接opencv库_利用Python和OpenCV库将URL转换为OpenCV格式的方法

    今天的博客是直接来源于我自己的个人工具函数库. 过去几个月,有些PyImageSearch读者电邮问我:"如何获取URL指向的图片并将其转换成OpenCV格式(不用将其写入磁盘再读回)&qu ...

  6. android 加载三方so的方法_Android开发教程之动态加载so库文件的方法

    Android开发教程之动态加载so库文件的方法,我想对于静态加载 so 库文件,大家都已经很熟悉了,这里就不多说了.在 Android 开发中调用动态库文件(*.so)都是通过 jni 的方式,而静 ...

  7. 搜狗输入法词库php词库怎么用,搜狗输入法添加词库方法说明,打字更方便

    搜狗输入法添加词库方法说明,打字更方便 2020-04-04 无论是电脑端还是手机端,搜狗输入端都是一款深受大众欢迎的打字软件,它提供了词库管理功能,用户可以随时添加词库,便于更好完成输入.搜狗输入法 ...

  8. Qt实用技巧:VS2017编写纯C库以及使用Qt调用C库方法

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  9. vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析

    目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...

  10. 基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法

    基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法 FB库功能说明: 可对模拟量进行平均值滤波处理,某些从现场采集的模拟量信号在传输过程中易出现干扰,可能导致数据失真,使用该FB库可 ...

最新文章

  1. netstat 查看端口命令
  2. axis2 java客户端内存溢出怎么办_java - Axis2-总是出现404错误 - 堆栈内存溢出
  3. [web安全]深入理解反射式dll注入技术
  4. mdp框架_强化学习:MDP(Markov Decision Process)
  5. P1829-[国家集训队]Crash的数字表格/JZPTAB【莫比乌斯反演】
  6. torch.cuda.is_available(),torch.cuda.device_count(),torch.cuda.get_device_name(0)
  7. 两条平行导线同向电流_如何根据功率计算电流?老师傅说这么做很简单
  8. 杀死系统中的进程kill和killall命令
  9. Bash脚本15分钟进阶教程-转
  10. mysql 查询若干小时之内的数据
  11. 惠普T5325 惠普T5565 惠普T5400 瘦客机评测
  12. B站三季度财报解读丨从0到2.67亿月活,B站生态亮眼的密钥何在?
  13. 软件测试创业公司和大厂外包如何选择?
  14. Unity3d用脚本实现Button图片的更改
  15. C++和java的异同点总结
  16. android遥控器适配
  17. Java工程师应该知道的Web安全
  18. 黑白棋出现pass 的条件 java_JAVA黑白棋之学习感悟
  19. rx6700xt相当于什么n卡
  20. iphone6 续航 测试软件,iPhone 6s电池续航能力究极测试 1715毫安电池逆天了

热门文章

  1. 需求文档2_The Battle of Polytopia
  2. linux opencv install
  3. Google Test Primer(四)——简单测试
  4. 并发学习之CyclicBarrier循环栅栏
  5. 软件设计原则(五) 开闭原则
  6. Future机制原理
  7. 多线程之实现同步的信号量Semaphore
  8. MaxCompute/DataWorks权限问题排查建议
  9. 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
  10. RAC3——RAC原理开始