欢迎大家关注我的公*号:embedded_bug

这里的嵌入式Linux环境是指非标准Linux发行版环境,比如通过buildroot创建的,相比于标准的Linux发行版比如ubuntu,debian,fedora,系统比较简陋,提供的库很有限,而且系统的各种配置文件和配置方式与标准Linux发行版差别很大,总之,这里的嵌入式Linux只保证系统能够基本的启动运行起来。

上图是现在编程语言的流行度排名,别看这么多语言,真正适合在嵌入式Linux中应用的并不多。

直接说结论,个人推荐:go>C++(11)+boost>c,其他语言目前还都不太适合。

本篇文章先讨论C和C++,下面一篇文章讨论go及其他语言。

一、C语言,迫不得已的选择

​ C语言作为最基本的编程语言,只要是个嵌入式Linux环境肯定都是支持的,但是同样使用C的问题很多,包括:

  • 语言比较老旧,很多高级语言的特性比较缺乏,程序写起来比较费时间,容易出错,代码行数也多。

  • 基础C库功能太少,需要什么新功能还得去找相当的函数库,然后交叉编译,测试函数库功能怎么样,是否满足需求,费时费力。

    总之,C语言的问题是库少,写起来费事,容易出错。优点是程序运行速度快,空间占用小。

二、C++(基于11标准,配合boost库),不能用go时候的选择

选择C++有两个条件,基于C++11标准编写程序,并配合boost库。如果还是用C的思想在用C++,那还不如直接用C。使用C++,一定要将C++当成一个不同于C的全新语言使用,否则发挥不出C++的优势。

C++11相比于之前的C++是巨大的进步,并且gcc4.8.5的版本已经能够完整支持C++11了。C++11的特性包括自动类型推导,自动指针,lamba表达式等等。代码写起来更流畅,更精简了。唯一的缺点就是太复杂了,否则也就没go什么事了。

​ boost库为什么是一个必选项呢,因为boost库实在太强大了,嵌入式开发百分之九十以上的需求都可以通过boost库实现,完全不需要借助第三方库,包括串口操作boost库中都包含了。并且boost库大部分是头文件,交叉编译出来的so文件也并不大,占用不了太多空间。

​ https://www.boost.org/doc/libs/1_76_0/

看下boost的文档,你就知道boost库的功能有多强大。

C++11+boost库的缺点就是太复杂,学习起来比较困难,不过真要用熟了,绝对就成了C++大师了,跳槽升职加薪迎娶白富美走向人生巅峰不是梦!

下面列举几个C++ boost库的代码示例

用boost库解析命令行参数:

using namespace std;
namespace bpo = boost::program_options;
namespace blog = boost::log;
namespace baio = boost::asio;// 解析命令行参数
int initFlag(int argc, char* argv[], string &configDir, string &logDir, int &logLevel)
{//步骤一: 构造选项描述器和选项存储器//选项描述器,其参数为该描述器的名字bpo::options_description opts("all options"); //选项存储器,继承自map容器bpo::variables_map vm;//步骤二: 为选项描述器增加选项//其参数依次为: key, value的类型,该选项的描述opts.add_options()("configdir", bpo::value<string>()->default_value("./"), "set config file dir")("logdir", bpo::value<string>()->default_value("./"), "set log file dir")("loglevel", bpo::value<int>()->default_value(4), "set log level 0-6 panic fatal error warn info debug trace")("help,h", "this is a log test program");//步骤三: 先对命令行输入的参数做解析,而后将其存入选项存储器//如果输入了未定义的选项,程序会抛出异常,所以对解析代码要用try-catch块包围try{//parse_command_line()对输入的选项做解析//store()将解析后的结果存入选项存储器store(parse_command_line(argc, argv, opts), vm);}catch(...){cout << "command line param is not correct" << endl;cout << opts << endl;   return -1;}//步骤四: 参数解析完毕,处理实际信息if(vm.empty())       //这里不会为空,因为设置了默认值{}//count()检测该选项是否被输入if(vm.count("help") ){//若参数中有help选项//options_description对象支持流输出, 会自动打印所有的选项信息cout << opts << endl;   return 1;}//variables_map(选项存储器)是std::map的派生类,可以像关联容器一样使用,//通过operator[]来取出其中的元素.但其内部的元素类型value_type是boost::any,//用来存储不确定类型的参数值,必须通过模板成员函数as<type>()做类型转换后,//才能获取其具体值.if(vm.count("configdir") ){configDir = vm["configdir"].as<string>();}if(vm.count("logdir") ){logDir = vm["logdir"].as<string>();}if(vm.count("loglevel") ){logLevel = vm["loglevel"].as<int>();}return 0;
}

用boost库进行日志记录,同时记录至终端和文件中,并且文件支持自动分割,自动删除:

using namespace std;
namespace bpo = boost::program_options;
namespace blog = boost::log;
namespace baio = boost::asio;// 初始化日志,日志级别0-6 panic fatal error warn info debug trace
int initLog(string logPre, string logdir,  int logLevel)
{if ((logdir.length() > 0) && (*(--logdir.end()) == ':')){logdir += "/";}// 设置日志同时输出至文件和标准输出auto console_sink = blog::add_console_log(std::cout,blog::keywords::format = (blog::expressions::stream<< blog::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")<< " - [" << blog::trivial::severity<< "] : " << blog::expressions::smessage),blog::keywords::auto_flush = true);auto file_sink = blog::add_file_log(blog::keywords::file_name = logPre + ".log",// blog::keywords::target_file_name  = logPre + "_%Y%m%d_%3N.log",blog::keywords::enable_final_rotation = false,blog::keywords::rotation_size = 1 * 1024 * 1024,// blog::keywords::time_based_rotation = blog::sinks::file::rotation_at_time_point(0, 0, 0),blog::keywords::format = (blog::expressions::stream<< blog::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")<< " - [" << blog::trivial::severity<< "] : " << blog::expressions::smessage),blog::keywords::auto_flush = true,blog::keywords::open_mode = ios_base::app);file_sink->locked_backend()->set_file_collector(blog::sinks::file::make_collector(blog::keywords::target = logdir,        //folder name.blog::keywords::max_size = 3 * 1024 * 1024    //The maximum amount of space of the folder.// blog::keywords::min_free_space = 100 * 1024 * 1024  //Reserved disk space minimum.));file_sink->locked_backend()->scan_for_files();// 设置日志输出级别blog::trivial::severity_level logsevirity[]{ blog::trivial::fatal, blog::trivial::fatal, blog::trivial::error, blog::trivial::warning, blog::trivial::info, blog::trivial::debug, blog::trivial::trace};// console_sink->set_filter(blog::trivial::severity >= logsevirity[LogLevel]);file_sink->set_filter(blog::trivial::severity >= logsevirity[logLevel]);        // 只有文件过滤日志blog::add_common_attributes();return 0;
}void logFunc(int Id)
{BOOST_LOG_TRIVIAL(trace) << Id << "A trace severity message";BOOST_LOG_TRIVIAL(debug) << Id << "A debug severity message";BOOST_LOG_TRIVIAL(info) << Id << "An informational severity message";BOOST_LOG_TRIVIAL(warning) << Id << "A warning severity message";BOOST_LOG_TRIVIAL(error) << Id << "An error severity message";BOOST_LOG_TRIVIAL(fatal) << Id << "A fatal severity message";
}

用boost库进行串口读写

using namespace std;
namespace bpo = boost::program_options;
namespace blog = boost::log;
namespace baio = boost::asio;void serialFunc(void)
{try{baio::io_service io_context;baio::serial_port sp(io_context);sp.open("/dev/ttyS2");//设置串口参数sp.set_option(baio::serial_port::baud_rate(9600));sp.set_option(baio::serial_port::flow_control());sp.set_option(baio::serial_port::parity());sp.set_option(baio::serial_port::stop_bits());sp.set_option(baio::serial_port::character_size(8));boost::system::error_code err;while(true){boost::array<char, 128> buf;boost::system::error_code error;size_t len = sp.read_some(baio::buffer(buf), error);if(error){throw boost::system::system_error(error); // Some other error.}BOOST_LOG_TRIVIAL(info) << "Serial recvd: " << buf.data();sp.write_some(baio::buffer(buf), error);if(err){throw boost::system::system_error(error); // Some other error.}}}catch(const std::exception& e){BOOST_LOG_TRIVIAL(error) << "Serial error: " << e.what();return;}
}

用boost库进行网络通信

using namespace std;
namespace bpo = boost::program_options;
namespace blog = boost::log;
namespace baio = boost::asio;void tcpClientFunc(void)
{try{baio::io_context io_context;baio::ip::tcp::tcp::resolver resolver(io_context);baio::ip::tcp::tcp::resolver::results_type endpoints =resolver.resolve("192.168.205.137", "60000");baio::ip::tcp::tcp::socket socket(io_context);baio::connect(socket, endpoints);BOOST_LOG_TRIVIAL(info) << "Tcp Client connect ok.";for (;;){boost::array<char, 128> buf;boost::system::error_code error;size_t len = socket.read_some(boost::asio::buffer(buf), error);if (error == boost::asio::error::eof){BOOST_LOG_TRIVIAL(warning) << "Tcp Client connect closed.";break; // Connection closed cleanly by peer.}else if (error){throw boost::system::system_error(error); // Some other error.}BOOST_LOG_TRIVIAL(info) << "Tcp Client recvd: " << buf.data();// std::cout.write(buf.data(), len);}}catch(const std::exception& e){BOOST_LOG_TRIVIAL(error) << "Tcp Client connect error: " << e.what();return;}
}void tcpServerChildFunc(baio::ip::tcp::tcp::socket sT)
{time_t now = time(0);string times = ctime(&now);for(;;){boost::system::error_code ignored_error;baio::write(sT, baio::buffer(times), ignored_error);if (ignored_error == boost::asio::error::eof){BOOST_LOG_TRIVIAL(warning) << "Tcp Server connect closed.";return;}else if (ignored_error){BOOST_LOG_TRIVIAL(error) << "Tcp Server connect error: " << boost::system::system_error(ignored_error).what();return;}this_thread::sleep_for(chrono::seconds(5));}
}
void tcpServerFunc(void)
{baio::io_context io_context;baio::ip::tcp::tcp::acceptor acceptor(io_context, baio::ip::tcp::tcp::endpoint(baio::ip::tcp::tcp::v4(), 60000));for (;;){try{baio::ip::tcp::tcp::socket socket(io_context);acceptor.accept(socket);auto t = thread(tcpServerChildFunc, move(socket));t.detach();}catch (std::exception &e){BOOST_LOG_TRIVIAL(error) << "Tcp Server accept error: " << e.what();}}
}

嵌入式Linux开发的编程语言选择相关推荐

  1. 单片机、嵌入式Linux开发大学自学路径

    笔者所修读的专业为物联网工程,物联网工程是一门新兴的.热门的专业,其所涉及的学科更是又多又杂,既有计算机方向的编程语言(如C.C++.Java.Python等).数据结构与算法.操作系统.移动端应用开 ...

  2. 视频教程-嵌入式Linux开发基础-嵌入式

    嵌入式Linux开发基础 嵌入式工程师.嵌入式讲师.10多年嵌入式开发实战经验,6年专业嵌入式课程培训经验.主要研究方向是嵌入式Linux系统应用和物联网技术应用.先后参与过武警边防音视频矩阵切换系统 ...

  3. 嵌入式linux编译环境搭建,嵌入式Linux开发环境搭建

    整理下嵌入式Linux开发环境搭建过程笔记. 一.制作u-boot.bin文件: tar xjf u-boot-1.1.6.tar.bz2 cd u-boot-1.1.6 patch -p1 < ...

  4. 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析

    嵌入式linux开发环境搭建--VirtualBox虚拟机网络环境解析 本博文转自:Pandoras Box http://blog.csdn.net/yxc135/article/details/8 ...

  5. 嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用

    介绍嵌入式linux开发的环境搭建: 一.PC端环境搭建 2.Ubuntu装好后,在终端安装minicom工具,安装命令:sudo apt-get install minicom 注:该工具在后面烧录 ...

  6. Linux学习之云服务器搭建嵌入式Linux开发环境

    Linux学习之云服务器搭建嵌入式Linux开发环境 第一步:购买云服务器 进入腾讯云官方网站腾讯云官方网站 选择云+校园云+校园 进入控制台 将云服务器系统设置为Ubuntu系统 使用Xshell6 ...

  7. 假设linux分配给u盘设备名是,嵌入式linux开发基础试卷-应用物理A答案

    试 卷 考试科目: 嵌入式 linux 开发基础 姓名: 试卷适用专业(班) : 09 应用物理 套别:A 套(√)B 套( ) 五 20 六 七 总计 100 考核方式:开卷( )闭卷(√) 了多达 ...

  8. 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(一) 嵌入式Linux开发基本概念以及开发流程介绍

    文章目录 1.linux开发初了解 1.1 嵌入式Linux开发的基本概念 1.1.1关于Git的背景介绍 1.1.2关于repo的背景介绍 1.1 3 一些关于此背景知识的介绍 1.1.4关于Lin ...

  9. 嵌入式linux开发环境搭建(VMware16.0.0+Ubuntu16.04.3_X64)

    目录 一.安装VMware 1.VMware介绍 2.安装VMware16.0.0 二.安装ubuntu16.04.3 LTS 1.Ubuntu介绍 2.下载安装包iso 3.安装 四.新安装Ubun ...

  10. 基于ARM的嵌入式Linux开发平台

    在进行嵌入式系统的开发时,首先面临的难题就是如何挑选一个适合自己的开发平台.ARM系列处理器是专门针对嵌入式设备设计的,是目前构造嵌入式系统硬件平台的首选.本文将介绍如何挑选适合实际需要的嵌入式开发平 ...

最新文章

  1. java web ubuntu_Ubuntu部署Java web项目
  2. 【PAT (Basic Level) 】1015 德才论 (25 分)
  3. Linux命令-Sed用法教程
  4. 频率计c语言程序,数字频率计中C语言编程的研究
  5. html入门学习(二)
  6. How is application controller loaded by UI5 framework
  7. 谈谈CLOSE_WAIT
  8. sqlserver 过滤html,sqlserver 过滤掉某些字段查询剩余字段的方法
  9. Django复习:模型与管理网站
  10. 2012.4.17内存相关(二)
  11. WAP开发环境的设置[IIS, APACHE, HTTPD]
  12. gom引擎传奇MapInfo.txt地图参数详解
  13. 信息论基础——消息,信息,信号区别 信息的度量
  14. 试题 基础练习 字母图形 java代码
  15. PS与qq热键设置雷同
  16. 【信息泄露】12306恐中招!400万数据遭泄露,请尽快更改密码!
  17. 爱奇艺APP的自动化录制回放系统 全云化处理新体验
  18. 机器人总动员拟人_《机器人总动员》从三个角度解析这部电影带给我们的思考与感动...
  19. 1090 Highest Price in Supply Chain(天上人间,潇潇共雨。曼珠红遍,流水忘川。)
  20. human36m 3d姿态可视化

热门文章

  1. imx6ul linux4,iMX6UL 4秒快速启动-飞凌嵌入式iMX6UL启动加速
  2. matplotlib-27 内嵌环形饼图
  3. 关于OpenGL游戏全屏模式的设置
  4. 各种数据库之间数据迁移工具
  5. C++编程读取注册表文件
  6. 在线计算机进制换算,进制转换计算器
  7. 电机计算机仿真,电机调速系统的计算机仿真
  8. IOS磁力下载软件,老司机必备品
  9. GPS测速仪,一个APP就可以搞定
  10. kpw4换壁纸_发挥全部潜能,Kindle越狱指南