自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(210)
  • 资源 (1)
  • 收藏
  • 关注

原创 单向链表 双向链表

/ 将最后一个节点的 next 指向新节点。= NULL) { // 找到链表的最后一个节点。删除 3 后的链表: 从前向后打印链表: 2 -> 1 -> 4 -> NULL。从前向后打印链表: 2 -> 1 -> 3 -> 4 -> NULL。从后向前打印链表: 4 -> 3 -> 1 -> 2 -> NULL。

2024-10-23 23:20:18 841

原创 一般社保测试

电磁敏感度(EMS)分析:评估设备自身对外部电磁干扰的抵抗能力,如抗静电放电、抗射频辐射、抗快速瞬变脉冲群等敏感度分析。环境适应性测试:包括高低温测试、湿度测试、振动测试、冲击测试等,考察设备在不同环境条件下的可靠性。电气安全测试:如耐压测试、漏电流测试等,确保设备不会对使用者造成电击危险。着重于电源分配网络(PDN)的性能,包括电源的稳定性、噪声、压降等。可靠性测试:例如老化测试、寿命测试等,以评估设备长期稳定运行的能力。主要关注信号在传输过程中的质量,如信号的失真、反射、串扰等问题。

2024-05-12 07:30:17 369

原创 USB通信1 - 基础知识扫盲

在进入主题之前,首先了解一下USB的一些基础知识。ADDR字段/ENDP字段:前面说过,一个设备只有一个设备描述符和多个终点描述符,这两个字段就可以在多个设备中准确的找到目标设备以及设备中的目标终点,类似TCP/IP中的IP与PORT。状态判断:之前的举例当中,每次传输都是成功的回复了ACK,可以看到,上图中,事务发起了三次IN的Token包,设备才发送了下一帧数据。与众多协议相同,较高级别的协议的报文是基于/内嵌在低级协议的报文当中的,在USB中也不例外,例如,包中预留了DATA位,其目的就是填写报文。

2024-04-22 21:23:19 621

原创 系统构架1

系统构架,构架师之路1

2024-04-09 21:07:17 129

原创 Mqtt qs 消息可靠性分析

所以就无法得知之后到达的,携带了相同Packet ID的PUBLISH报文,到底是发送方因为没有收到响应而重传的,还是发送方因为收到了响应所以重新使用了这个Packet ID发送了一个全新的消息。以EMQX为例,在相同的硬件配置下进行点对点通信,通常QoS 0与QoS 1能够达到的吞吐比较接近,不过QoS 1的CPU占用会略高于QoS 0,负载较高时,QoS 1的消息延迟也会进一步增加。首先,发送方存储并发送QoS为2的PUBLISH报文以启动一次QoS 2消息的传输,然后等待接收方回复PUBREC报文。

2024-02-21 17:54:38 185

转载 Linux USB驱动开发

前面介绍了USB相关一些基础概念与重要的数据结构,接下来就分析在linux内核中如何编写一个USB 驱动程序,编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否安装了硬件。USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。调试USB设备,很重要的一点就是USB枚举过程,只要枚举成功了,那就成功一大半了。

2024-02-20 12:16:15 384

原创 7、防写一个shell 命令解释器

3、把可执行文件放到 /bin/test1 就可以像ls 命令使用了,在终端里面,感觉实现原理都是通过系统调用实现的。

2024-01-12 18:47:10 468

原创 数据分析简介

需要强调的是,在数据处理的过程中,针对特定领域和具体需求,可能存在更加复杂和专业的数据有效性判断、数据校准和数据提取方法。模型训练:使用收集到的数据和提取的特征,构建一个机器学习模型来拟合光照值与传感器测量值之间的关系。计算乘法因子:计算乘法因子的方法是通过参考温度和对应的传感器数据之间的比例来确定。我们希望通过校准来修正这个偏差。应用乘法因子:使用计算得到的乘法因子,将传感器数据乘以对应的因子进行校正和修正。在这个例子中,我们发现乘法因子小于1,说明传感器读取的值偏高,需要将读数乘以这个因子来进行校正。

2023-08-24 11:35:44 1393

原创 GPIO 配置 和 PINCTRL有啥区别

GPIO 配置是指定义和设置引脚的输入或输出功能,而 PINCTRL 可以动态配置引脚的不同功能。GPIO 配置是配置引脚本身的特性,而 PINCTRL 配置是管理引脚的复用和功能选择。综上所述,以上设备树配置演示了如何通过 GPIO 配置和 PINCTRL 来定义和配置一个 GPIO 引脚,并将其设置为输入模式以读取信号,并通过 PINCTRL 指定其特定功能模式。假设我们的嵌入式系统有一个具备 GPIO 功能的引脚,我们希望将其配置为输入模式,读取来自外部设备的信号,并在特定条件下触发中断。

2023-08-15 11:09:16 791

原创 Linux系统应用调驱动过程

在open()函数中,设备驱动程序可以进行相关设备的初始化操作,并返回设备的私有数据结构指针,供后续的读写操作使用。总的来说,应用程序打开一个驱动节点的过程包括设备文件的打开、设备驱动的注册、文件操作函数的调用等步骤。其中,设备驱动程序起到了桥梁的作用,将应用程序的请求传递给对应的设备操作函数来完成实际的设备操作。在Linux系统中,应用程序打开一个驱动节点需要经过一系列的调用过程,涉及到设备文件的打开、设备驱动的注册、文件操作函数的调用等。此外,具体的实现可能因操作系统和设备驱动的差异而有所不同。

2023-08-13 18:30:46 785

原创 phread 消息队列测试demo

这段代码创建了一个基于pthread实现的队列数据结构,在初始化时需要指定队列的最大长度MAX_QUEUE_SIZE,并通过QueueP_create函数进行初始化。队列中保存的每个元素是QueueP_NodeData_t类型的结构体。QueueP_get和QueueP_put函数分别用于获取队列中的元素和向队列中放入元素。在main函数中,我们创建了一个生产者线程和一个消费者线程,它们并发地对队列进行操作。生产者线程循环向队列中插入数据,而消费者线程从队列中读取数据。

2023-08-05 14:21:57 206

原创 6、LINUX 系统启动过程概述

系统服务启动:在特定的运行级别下,根据配置文件(例如/etc/rc.d或/etc/init.d)中的指令,初始化进程会启动相应的系统服务和守护进程。b. 系统初始化:初始化进程会根据配置文件(如/etc/inittab或/etc/init)中的设定,启动各种系统服务和守护进程。内核加载和引导:引导管理器从指定的位置读取内核镜像文件(通常是/boot目录下的vmlinuz文件),然后将内核加载到内存中。获取U-Boot源代码:从U-Boot的官方代码仓库或适合你目标平台的BSP中获取U-Boot的源代码。

2023-07-30 16:43:15 745

原创 5、VMWARE安装、MobaXterm SSH连接 、Ubuntu xrdp安装使用

在"Guest operating system"(客户操作系统)中选择"Linux",并在"Version"(版本)中选择"Ubuntu"。在VMware虚拟机窗口上的"VM"菜单中,选择"Install VMware Tools"选项。你可以在VMware虚拟机菜单的"VM"->"Install VMware Tools"选项中查看或验证该状态。点击"Browse"(浏览)按钮,选择之前下载的Ubuntu 22.04的镜像文件(.iso文件),然后点击"Next"(下一步)。

2023-07-29 23:18:19 1285

原创 自动驾驶小车

数据集收集和模型训练:收集相应的数据集,并利用机器学习和深度学习技术训练模型,以提升自动驾驶小车的性能和安全性。感知和环境理解:利用计算机视觉和传感器数据,对环境进行感知和理解,包括障碍物检测、道路检测、车道线检测等。确定需求和功能:明确您的自动驾驶小车的目标和应用场景,确定需要的功能和特性,例如感知、决策、控制等。决策和规划:基于感知结果,使用决策算法和路径规划算法,进行决策和生成车辆的行驶路径。网络和通讯:设计和实现小车系统的网络和通讯,支持数据传输、远程控制和车辆之间的通信。

2023-07-29 17:33:49 1773

原创 监控无人机项目

此外,还需要考虑法律法规和飞行许可等方面的要求。确定需求和功能:明确您的监控无人机系统的目标和应用场景,确定需要的功能和特性,例如实时视频监控、目标识别、飞行路径规划等等。数据传输和存储:设计和实现数据传输和存储系统,确保无人机采集到的数据和视频能够安全、快速地传输到地面站或云端进行处理和存储。控制和路径规划:开发飞行控制算法,实现无人机的自主控制和路径规划,使其能够按照预定任务完成巡航和监控。网络和安全:考虑无人机系统的网络架构和安全性,确保通信和数据传输的安全和稳定性。

2023-07-29 17:30:33 943

原创 4、Kprobe&Ftrace联合使用例子

在示例中,我们使用_do_fork作为我们要插入钩子的内核函数。事件格式为p:kprobe/my_probe _do_fork,其中my_probe是我们给钩子函数起的名字,可以自定义。在钩子函数kprobe_handler中,您可以添加额外的操作和分析代码,来进一步研究和理解内核函数的执行行为。这将注册我们的kprobe事件,使得钩子函数能够在_do_fork函数的入口处被调用。在上述的Kprobe应用层使用例子中,我们主要关注了_do_fork函数的执行过程,并通过插入钩子函数来触发调试点。

2023-07-29 16:07:02 277

原创 3、Ftrace使用例子

在这个例子中,我们使用了Ftrace的 register_trace_sched_function_call() 函数来开启Ftrace跟踪功能,并指定要跟踪的函数。上述示例中,12345.678901 是距离系统启动后的时间戳,sched_function_call 表示调用了 example_function 函数,并打印了参数值 42,sched_function_ret 表示函数返回了结果 43,Function result: 43 表示函数的返回结果。运行C代码,并触发所需的函数调用。

2023-07-29 15:56:42 168

原创 2、内核Kprobe的使用例子

在 handler_pre 处理程序中,我们输出了Kprobe的地址和调用指令指针的值,以及寄存器 ax、bx、cx 和 dx 的值。使用此例子,当调用 example_function 函数时,Kprobe会在函数执行前后分别调用 handler_pre 和 handler_post 处理程序,并在内核日志中打印出相应的调试信息。编译和加载此内核模块后,您可以通过调用 example_function 函数来触发Kprobe,并在内核日志中查看输出的调试信息和函数调用次数。

2023-07-29 15:34:27 667 5

原创 1、怎么阅读linux内核源码

使用调试工具和技术,如Kprobe、Ftrace等,可以帮助您更深入地了解内核代码的执行过程。阅读这些文档可以帮助您对内核代码的整体架构和工作原理有更清晰的了解。开始阅读内核代码时,可以从关键的启动代码或入口函数开始,然后根据需要跟踪代码的执行流程。同时,阅读和理解相关的注释以及函数和数据结构的定义也是非常重要的。一开始可能会感到困惑和复杂,但随着不断的学习和实践,您会逐渐掌握内核代码的阅读和分析技巧。因此,选择您感兴趣的子系统或功能模块,有助于更有针对性地学习和研究相关的代码。

2023-07-29 15:15:46 475

原创 通用MAKEFILE

CC=gccCXX=g++CFLAGS=-g -Wall -Wextra -Werror -pedantic-errorsCXXFLAGS=$(CFLAGS)SRCDIR=srcINCDIR=includeOBJDIR=objLIBDIR=libBINDIR=binLIB_NAME=exampleLIB_OBJS=$(patsubst (SRCDIR)/(SRCDIR)/%,(SRCDIR)/(OBJDIR)/%,$(wildcard (SRCDIR)/∗.c∗))LIBTARGET=(SR

2023-07-13 10:14:33 133

原创 linux CSI接口定义

CSI(Camera Serial Interface)是一种串行通信协议,用于将图像传感器的数据传输到处理器上,通常用于与摄像头模块进行通信。在Linux系统中,CSI接口定义使用堆栈结构实现,用户空间应用程序通过ioctl()操作系统调用与CSI接口进行交互。CSI框架程序:用于与CSI驱动程序和V4L2驱动程序进行交互,以从摄像头模块中读取数据。CSI驱动程序:负责与硬件设备进行交互,并提供一个接口供用户空间应用程序调用。应用程序:使用CSI接口获取图像数据并进行处理,如图像识别、视频流媒体等。

2023-06-03 21:43:41 845

原创 linux 启动脚本整理

linux shell 启动脚本整理

2022-06-02 14:05:21 1646 1

转载 C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非静态成员函数是针对类的对象而言。然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。先在静态成员函数中调用静态成员变量:#include <iostream>using namespace std;class vpoet{public:

2022-05-25 11:39:47 421

原创 C++ 测试 DEMO

#include <iostream>#include <memory>#include <atomic>class C{ public: C(); ~C(); int my_temp; void test(); };C::C() :my_temp(0){ printf("C构造函数\n"); }C::~C(){}void C::test(){ printf("C::test\n");

2022-05-24 15:58:51 363

转载 C++构造函数和析构函数可以是虚函数吗

1、构造函数不可以是虚函数当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)。在实现多态的过程中,父类和派生类都有vptr指针。vptr的初始化:当对象在创建时,由编译器对vptr指针进行初始化。在定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。如果构造函数

2022-05-24 11:05:26 275

转载 C/C++ 获取函数地址

CC语言中没有类的概念,只有普通的函数。通过函数名就可以得到函数地址#include <stdio.h>#include <stdlib.h>void fun() { }int main() { printf("%p\n", &fun);}对于 fun 和 &fun 应该这样理解:fun 是函数的首地址,它的类型是 void ()&fun 表示一个指向函数 fun 这个对象的地址, 它的类型是 void (*)()因此 fun 和

2022-05-24 00:08:29 7626 2

原创 C++ protected(受保护的)详解

在《C++类成员的访问范围》一节中介绍过类的成员可以是私有成员(private)和公有成员(public)。实际上,类的成员还可以用 protected 访问范围说明符修饰,从而成为“保护成员”。保护成员的可访问范围比私有成员大,比公有成员小。能访问私有成员的地方都能访问保护成员。保护成员扩大的访问范围表现在:基类的保护成员可以在派生类的成员函数中被访问。引入保护成员的理由是:基类的成员本来就是派生类的成员,因此对于那些出于隐藏的目的不宜设为公有,但又确实需要在派生类的成员函数中经常访问的基类成员,将

2022-05-23 23:53:42 3757

转载 C++何时调用构造函数,何时调用析构函数

在我们创建新的对象的时候,都要执行某一个类中的构造函数,而当构造函数中分配了资源之后,当我们销毁一个对象的时候需要一个相应的操作将这些资源释放出去,这就需要析构函数。一般来说,在有基类和派生类存在时,在创建派生类类型时,会先构造基类,再构造派生类,析构顺序反之,类似于进栈出栈的过程。遇到的情况:指针不会调用构造和析构函数当对指针用new在内存中开辟空间的时候会调用构造函数:当我们使用new为指针开辟空间,然后用delete释放掉空间会调用构造和析构函数当我们函数的形参是一个对象的时候,这时候会系统

2022-05-23 23:26:56 1546 1

原创 C++ 模板数据类型解读

1、std::shared_ptrshared_ptr是一种智能指针(smart pointer),作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了

2022-05-22 12:00:35 473

原创 imx6null ip配置脚本

1、脚本#!/bin/bashIPconf_path=/etc/network/interfacessed -i '/iface eth0 inet dhcp/d' $IPconf_pathsed -i '/iface eth0 inet static/d' $IPconf_pathsed -i '/address 192.168.1.111/d' $IPconf_pathsed -i '/netmask 255.255.255.0/d' $IPconf_pathsed -i '/gate

2022-05-21 15:44:13 307

转载 出现Destination Host Unreachable,应如何解决

为虚拟机联接网络,用 ping www.baidu.com 来测试虚拟机是否可以连上网,一直显示:unknown host www.baidu.com,但是我之前已经把网卡文件配置好了,执行ifconfig后IP地址也没有错,在查询了一般之后,问题应该出现在网关(GATEWAY)、DNS设置、网线未接好,排错步骤可以是这样的:1、ping 127.0.0.1ping的通说明tcp协议栈没有问题2、ping 主机地址 ping的通说明网卡没有问题3、ping 路由器默认网关 ping的通说明包可以到达路

2022-05-21 14:52:29 53982

转载 回调函数的注册和回调

函数注册和回调函数1、什么是函数注册和回调回调函数无非是对函数指针的应用,说白了就是通过使用函数指针来调用一个函数,而函数注册就是把函数指针作为参数传递出去便于别的模块使用的过程。所以函数注册就是为了回调,先注册再回调。2、为什么要使用回调函数回调函数可以把调用者与被调用者分开,所以调用者不关心谁是被调用者以及被调用者如何实现。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用

2022-05-19 19:18:16 6323

原创 VMWARE+18.04 配置 桥接 IP

1、windowsipconfig /all2、VMware 配置进入VMware虚拟网络编辑器,设置如下,我用的无线网卡桥接,用自动也可以。在虚拟机设置中将网络适配器改为桥接模式,复制物理网络连接状态可选可不选。进入Ubuntu18.04除了回环网卡外的网卡是ens33!记住哦!接着sudo vim /etc/network/interfaces 设置网卡的静态ip,再然后sudo vim /etc/systemd/resolved.conf,设置DNS服务器,我设置的是常用

2022-05-16 20:46:08 518

转载 win10 git 安装

第一步,你要去GIT下载官网去下载GIT下载地址:https://git-scm.com/downloads下载好了后面,我们就开始安装GIT了开始:先载你的C,D,E或者其他盘建一个文件夹,我们就把GIT安装带自己创建的文件夹里面比如我们在D盘建了一个文件夹命令为git仓库后面我们点击安装启动Git-2.30.0-64-bit.exe我们就进入了安装图形界面了,如下图我们点击下一步next,选择我们刚刚创建的储存文件夹名称,如果我们没有选择安装文件夹也就是安装路径,他就会默认安装导C盘

2022-05-16 12:58:28 962

翻译 C语言校验 checksum

因为外界总会对电路存在或多或少的干扰,对于数字信号,很可能导致传输的数据出现千差万别。对于很多需要传输数据的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人等),错误的数据可能会带来一些隐性风险,想想都可怕。由于本人是嵌入式相关领域的,平时玩的都是单片机,当然单片机的性能千差万别,不过很多的性能都只能说是勉强够用,毕竟成本考虑。所以今天的校验说法,比较简单,但是有效,尤其是一些性能一般的硬件。说道今日主角:累加和校验算法,又名CheckSum算法。至于出处,这里就不考究了。

2022-04-27 16:39:25 1693

转载 MQTT协议讲解

MQTT协议详解一协议地址:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html当然也有PDF版的,百度一下,不过个人感觉不是官网上的字体和排版最舒服。那么这个协议是用做什么或有什么特色呢?下面是mqtt.org上的首段介绍:It was designed as an extremely lightweight publish/subscribe messaging transport. It is usef

2022-03-07 18:26:30 439 1

转载 linux内核中实现的引用计数机制——kref

引用计数优点:具有实时性,一旦变量没有被引用,就会把变量给释放掉kref机制:是linux内核中使用的引用计数机制,下面介绍一下,在内核中该如何使用引用计数这个技术,首先,在设计自己的数据结构时,要包含struct kref结构的字段。数据结构和初始化typedef struct {int counter;} atomic_t;typedef struct refcount_struct {atomic_t refs;} refcount_tstruct kref {refcou

2021-11-10 10:27:53 1067

转载 Ubuntu系统上的USB端口号绑定

1 为什么绑定USB端口号USB端口号会随设备的插拔发生变化,不方便测试,因此需要将USB端口号绑定。2 如何绑定USB端口号将端口重映射到新的固定的名字,并且设置其权限为可读。2.1 查询USB设备端口信息在未插入USB设备前,打开终端,执行以下命令查看USB端口信息:lausb1输出如下:Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBus 001 Device 004: ID 13d3:56a6 IMC

2021-11-09 16:11:32 686

转载 Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点

Linux下USB设备节点名不固定问题经常会遇到以USB转串口设备为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据设备插入的先后顺序进行编号的分配,比如第一个插入的设备编号为ttyUSB0,然后依此加1,变为ttyUSB1,ttyUSB2……如果仅仅以设备节点ttyUSBx来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是ttyUSB0,B设备就是ttyUSB1。在设备文件/dev目录下并没有提供固定显示ttyUSB的方法,但是,其实,每个..

2021-11-09 15:17:26 3002

转载 linux PCI设备驱动

一、PCI简介PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总线上连接的所有设备可在同一时间收到所有的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下的设备驱动,所以,重点关注编程接口。PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之

2021-11-09 09:42:31 708

CSV文件读写 C++语言

CSV文件读写 C++语言

2022-04-15

空空如也

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

TA关注的人

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