自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 35个改善变成与设计的有效方法:1.指针和引用的区别

35个改善变成与设计的有效方法:1.指针和引用的区别

2023-01-15 15:11:31 182

原创 unique_ptr智能指针的RAII在异常处理时的使用

智能指针的RAII在异常处理时的使用

2022-09-20 10:33:58 314

原创 C++ 为什么指向数组的两个指针是可以比较

指向数组的两个指针可以比较的原因

2022-09-14 10:40:08 650

原创 C++ 设计模式之工厂模式

C++ 设计模式之工厂模式

2022-07-18 16:02:45 236

原创 snap7库C++版本对PLC数据的读写

Snap7库C++版本对西门子PLC数据的读取

2022-06-27 21:01:21 7706 13

原创 snap7通过NetToPLCsim工具接入模拟西门子PLC S7-1200步骤简介

概述本文主要是设备通过S7协议接入西门子PLC S7-XXXX系列的开发使用文档,主要包括西门子PLC组态工具博途V15,PLC模拟工具S7-PLCSIM,IP地址映射工具NetToPLCsim等使用使用说明,S7协议的编译及使用说明等;1 开发工具之间的关系仿真软件S7-PLCSIM模拟真实的PLC,博途v15用于模拟PLC的组态,博途v15组态完成之后,点击仿真按钮,就会调出仿真软件S7-PLCSIM软件,将PLC项目下载进去,启动仿真PLC,就可以在线查看程序状态;因为第三方软件是不能直接与S

2022-05-18 16:42:34 4678

原创 C语言替换字符串中的字符

描述:项目中需要计算数学表达式的值,数学表达式是以字符串的形式存在,需要将表达式中的字符替换成浮点型数据;比如表达式是:(A+B+C)*2+D,其中字符A、B、C、D都是12.345;代码实现如下:#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int main(){ string math_express = "(A+B)*2+A+5+C+D*9";

2022-04-19 14:27:51 4073

原创 Connection reset by 192.168.0.5 port 22 lost connection问题

1、问题描述客户端使用ssh命令远程连接嵌入式设备(服务器)时,出现连接失败Connection reset by 192.168.0.5 port 22lost connection2、问题原因是由于嵌入式设备的ssh模块的证书长时间没有更新导致,证书失效,可以删除旧的证书,再重新生成一份新证书解决,命令如下:sudo rm /etc/ssh/ssh_host_*sudo dpkg-reconfigure openssh-server3、客户端重新ssh连接服务器,又报如下错误刚才

2022-02-14 11:05:48 6769

原创 checking for arm-linux-gnueabihf-strip... no问题解决

Linux在自己用户下,执行configure指定交叉编译器的执行环境,出现下面的问题:ubuntu0compile:~/code/PT$ sudo ./configure --host=arm-linux-gnueabihfchecking for a BSD-compatible install... /usr/bin/install -cchecking whether build environment is sane... yeschecking for arm-linux-gnueabi

2021-11-30 15:29:52 2232

原创 multiple definition of “ ”问题排查

编译代码的时候,出现下面的错误信息,好几处源文件都报这样的错误Platform.o: In function `printDbug':code/PT/uart.h:64: multiple definition of `printDbug'main.o:code/PT/uart.h:64: first defined heretest_config.o: In function `printDbug':code/PT/uart.h:64: multiple definition of `print

2021-11-29 19:25:42 678

转载 linux下对/sys/class/gpio中的gpio的控制

在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers —> GPIO Support —> /sys/class/gpio/… (sysfs interface)。/sys/class/g

2021-11-25 10:19:28 3979

转载 C++11 右值引用

1、概述:右值引用是C++11中最重要的新特性之一,它解决了C++中大量的历史遗留问题,使C++标准库的实现在多种场景下消除了不必要的额外开销(如std::vector, std::string),也使得另外一些标准库(如std::unique_ptr, std::function)成为可能。即使你并不直接使用右值引用,也可以通过标准库,间接从这一新特性中受益。为了更好的理解标准库结合右值引用带来的优化,我们有必要了解一下右值引用的重大意义。右值引用的意义通常解释为两大作用:移动语义和完美转发。本文主要讨论

2021-09-14 15:22:04 649

原创 undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>问题

问题现象:手里有两台搭载不同版本的Ubuntu的编译器A和B,将在编译器A编译的开源库拷贝到编译器B上进行代码的编译,报标题的这样的错误;(为什么要在编译器A上编译用在B的库?因为A上有用到此开源库,且B上也会用到,索性就全部编译了)问题原因:查找原因,最大可能就是犹豫版本的问题导致,描述如下: gcc5以及以后的版本,将std::string和std::list重写,std::list变为std::__cxx11::list,std::string在c++03库是std::basic_strin

2021-09-06 20:09:58 6573

原创 The CXX compiler identification is unknown CMake Error at CMakeLists.txt:11 (project):

问题:在编译 glog 0.50的时候,要设置一下交叉编译器,设置完编译器之后,就一直报标题的错误,在linux命令行输入该交叉编译器,但是能识别该交叉编译器;设置交叉编译的文件如下:命令行下是能识别该交叉编译器:ubuntu0compile:~/glog-master/_build$ arm-linux-gnueabihf-garm-linux-gnueabihf-g++ arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-gco

2021-09-06 17:21:29 1493

原创 epoll没有及时删除socket导致 Bad file descriptor错误

调用socket的close()接口,返回Bad file descriptor错误,原因是什么呢?

2021-09-02 15:33:39 2565

原创 linux glog 0.50版本 设置交叉编译器生成静态库

目标:设置glog的交叉编译器,生成静态库libglog.a;步骤:(1)下载最新版本的glog源码,最新版本0.050(2021.08.23)https://github.com/google/glog(2)源码目录如下表:(3)修改交叉编译器的文件,在目录toolchains复制一份gcc-cxx11.cmake,更名为gcc-cxx11-crosscompiling.cmake,修改交叉编译器(4)在CMakeLists.txt中可以设置编译为静态库还是动态库将ON修改为OFF

2021-08-23 20:13:28 1770

原创 Linux glog 0.33版本的简单使用

最近工作中需要使用日志库记录设备的运行信息,本着不重复造轮子的原则,选择开源的glog日志库;但是在使用最新的glog库时,发现一些编译问题,网上查询glog的使用,基本上都是0.33及以前的版本的使用,此次也仅是记录以下0.33版本的使用,最新的0.50版本的编译问题,待解决后再行记录;glog的使用步骤如下:(1)下载glog源码,我这里选择的是0.33版本https://github.com/google/glog/tags(2)拷贝到工作目录,并解压,修改以下解压之后文件的执行权限tar

2021-08-23 11:31:24 1160

原创 Cmake更新

使用cmake命令编译github的开源软件时,报如下错误:CMake Error at CMakeLists.txt:4 (CMAKE_MINIMUM_REQUIRED):CMake 3.10 or higher is required. You are running version 3.5.1-- Configuring incomplete, errors occurred!提示CMake版本低,需要更高版本。1 、查看cmake版本cmake --version卸载命令(这个不要随

2021-08-18 19:53:57 5644 3

原创 C语言封装C++代码

应用场景:使用C语言实现的驱动及系统代码,需要调用C++实现的功能,就需要使用C语言来封装一下C++的接口;本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++相关的都在 wrapper的实现文件里实现。(1)C++实现一个单例,主要是通过外部设置错误码后,打印错误信息;//Singleton.h#include<string>#include<map>#include<iostream>

2021-08-17 17:30:06 1314

原创 lsof命令学习

1、概述lsof(list open files)是一个列出当前系统打开文件信息的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统

2021-08-13 17:09:42 343

原创 linux多线程——condition_variable条件变量

一、condition_variable 概述<condition_variable>是C++标准程序库中的一个头文件,定义了C++11标准中的一些用于并发编程时表示条件变量的类与方法等。条件变量是并发程序设计中的一种控制结构。多个线程访问一个共享资源(或称临界区)时,不但需要用互斥锁实现独享访问以避免并发错误(称为竞争危害),在获得互斥锁进入临界区后还需要检验特定条件是否成立:(1)、如果不满足该条件,拥有互斥锁的线程应该释放该互斥锁,把自身阻塞(block)并挂到(suspend)条件

2021-08-10 20:31:35 1091

原创 Linux多线程——使用信号量同步线程

一、信号量的概念线程间和进程间通信中使用的信号量的概念是一样的,它是一种特殊的变量,可以被增加或者减少,但对其的关键访问是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都依次进行。二、信号量的接口函数信号量的函数都以sem_开头,线程中使用的基本信号量函数有4个,它们都声明在头文件semaphore.h中。sem_init函数该函数用于创建信号量,其原型如下:int sem_init(sem_t *sem,int pshared,unsigned int valu

2021-08-10 14:40:05 679

原创 sed命令学习

1、删除文件每一行的前K个字符删除文件每一行的前k个字符$ cat tmp.txt123456789123456789123456789删除每行第一个字符$ sed ‘s/.//’ tmp.txt234567892345678923456789删除每行前两个字符$ sed ‘s/…//’ tmp.txt345678934567893456789删除每行前k个字符,例如k=5$ sed ‘s/.{5}//’ tmp.txt678967896789如果要在原文件上修改,

2021-08-04 10:21:47 103

原创 TCP服务端和客户端实例代码

1、TCP服务器#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>void error_handling(char * message){fputs(message, stderr);fputc(’\n’, stderr);exit(1);

2021-07-08 20:25:56 1274 1

转载 系统日志查看journalctl命令详解

原文链接:https://blog.csdn.net/qq_36595013/article/details/107318025简介从2012年开始,大部分linux发行版本开始从传统的systemv 初始化系统移植到一个叫做systemd的全新系统。systemd用来启动系统并管理进程。systemd包含了一个叫做journalctl的辅助组件,其主要作用是管理系统的事件日志记录。journalctl可以查看所有的系统日志文件,由于日志信息量很大,journalctl还提供了各种参数帮助用户更快速的

2021-07-05 15:48:55 734

原创 vi 多行复制粘贴

vi编辑器中的整行(多行)复制与粘贴就非常必要了。1、复制1)单行复制在命令模式下,将光标移动到将要复制的行处,按“yy”进行复制;2)多行复制在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3……2、粘贴在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴参考:https://blog.csdn.net/xiyuan1999/article/details/5680102...

2021-06-24 10:53:19 953

原创 嵌入式设备修改网络配置,动态获取IP修改静态IP

嵌入式设备修改网络配置,动态获取IP修改静态IP1、首先切换到目录:/etc/sysytemd/network,查看当前目录的网络配置文件;2、修改网络配置文件[Network]#DHCP= yesAddress=192.168.0.111Gateway= 192.168.0.1netmask=255.255.255.03、重启网络配置模块:sysytemctl restart systemd-networkd...

2021-06-22 13:23:39 649

原创 栈溢出导致程序段错误 Segmentation fault

问题描述:主线程里创建一个子线程,主线程调用pthread_join()等待子线程执行完成再结束,但是子线程的执行体执行完成之后,出现段错误Segmentation fault,在主线程pthread_join()调用前后都加上打印信息,发现接口调用之前的打印有,接口调用之后的打印没有;问题分析:pthread_join()接口就是一个阻塞函数,等待子线程执行,子线程执行体执行完之后,会继续执行pthread_join()后面的代码,所以出现问题的代码就一定是子线程的执行体,出现Segmentation

2021-06-16 13:19:46 1164

原创 嵌入式应用程序重复启动问题梳理

问题:嵌入式设备启动应用程序,但是提示已启动,搜索该应用程序的进程,并没有相关的进程,怎样找到已经启动的应用程序,且应用程序名已更名;定位过程:昨天调试一款没有接触过的设备,发现启动应用程序时,一直提示说应用程序已启动,但是查看所有启动的进程,并没有发现该应用程序的进程,纠结了好久,没有找到问题所在,重开开始梳理一下这个功能,嵌入式设备在启动时就将该应用启动了,很可能是在设备初始化时就将该功能默认开启了,那就去找设备初始化都启动了什么功能;我这边的系统服务路径是:查看该路径下所有的服务,其实这个服

2021-06-11 10:16:35 215 2

原创 类的重载运算符返回类对象而不是返回引用的原因

对象而不是返回引用的原因我们知道,函数的返回值或者参数传递,值传递的效率没有指针或者引用传递效率高,因为中间会有临时对象的产生和释放,所以,平时函数的返回值或参数能用引用或指针的尽量不要使用值传递;但是也不能看到函数函数返回或参数就想用引用和指针,就比如类的重载函数返回的就是类对象,也就是值传递,为什么不使用引用或指针呢?我们通过一个示例来分析一下:class Rational { public: Rational(int num,int cou); ..... private: in

2021-06-06 15:14:26 393

原创 错误问题:Authentication token manipulation error

需求及问题:想使用脚本的方式新增linux的用户,在写脚本的时候一直报错Authentication token manipulation error;实现:使用命令:useradd abcdef;echo “1234\n1234”|passwd abcdef报标题的错误,在网上也是尝试了各种方法,(1)有说是passwd文件没有修改权限的,加了权限之后,报同样的错误;(2)执行chattr #chattr -i /etc/passwd,也是为了增加文件的权限的,同样不起作用;以上两

2021-06-03 16:57:57 1014

原创 禁用root的ssh功能及重启ssh失败问题

需求:出于设备安全方面的考虑,客户要求root用户必须禁止使用ssh来连接开发板;需求实现:(1)使用root用户登录系统,添加一个普通账号,并为其设置密码(设置一个普通账号的目的就是可以ssh连接到这个普通账号,再有普通账号切换到root用户);(2)编辑ssh的配置文件/etc/ssh/sshd_conf修改PermitRootLogin后面的yes为no,同时可以修改限制登录的次数;#LoginGraceTime 2mPermitRootLogin no#StrictModes yesM

2021-06-01 10:56:07 853

原创 使用类的静态成员函数作为线程执行体

使用类的静态成员函数作为线程执行体工作中读到使用类的静态成员函数作为函数执行体的业务代码,现简单的记录一下;其中类A是业务类,包含业务处理类B,线程类对象,类A是要获取实时的数据,通过类内创建的新线程将实时数据传递给业务处理类B,同时将类A对象作为函数参数;可以在类A定义线程同步的锁,保证线程间数据的同步;#include <iostream>#include <functional>#include <thread>#include <unistd.h

2021-05-28 16:07:52 358

原创 g++ 编译出现error: template with C linkage 问题

1、error: template with C linkage 问题在使用g++编译cpp文件的时候,报error: template with C linkage 的错误,一般情况下有两种可能原因:(1)在编写的C代码里__cplusplus没有成对出现,导致__cplusplus宏控制下的代码都是使用C的方式编译;所以我们可以在待编译的CPP文件要加载的头文件里查看__cplusplus宏是否成对出现;#ifdef __cplusplusextern “C” {#endif未增加对应#i

2021-04-21 11:21:55 6029

原创 “undefined reference to xxx“ 问题的解决思路

1、这个问题的根因是什么? 首先看一下这个错误提示的一个翻译:"undefined reference to xxx",未定义的引用xxx,我们知道编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这四个过程,这个问题的一般出现在链接过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一个整体;实际应用过程中最常见的就是将不同的库文件进行链接生成可执行文件,每个库文件代表一个目标文件,比如我们libaaa.a库里有用到库libbbbb.a中定义的函数foo,我们称目标文...

2020-08-29 23:48:41 6297

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除