自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 资源 (2)
  • 收藏
  • 关注

原创 基于ITOP4412开发板的实时视频监控系统实现

实时视频监控系统实现设计一种RTMP嵌入式监控系统,该系统基于服务器/客户端模式,用户使用PC机或者使用移动设备通过网络实时监控观测对象。系统基于ITOP4412开发板,通过V4L2接口从摄像头采集YUV420格式的视频,通过X264对视频数据进行编码,然后通过RTMP协议发送至支持了rtmp的nginx流媒体服务器,然后客户端使用potplayer从服务器拉流显示。测试结果表明客户端播放器能够流畅地播放视频数据,系统稳定可靠。一、开发环境1、开发板硬件参数itop4412 开发板(1)计算能力

2020-12-13 20:35:21 4032 2

原创 使用find查找包含指定字符串的文件

find -name "检索的文件名" | xargs grep -ri "指定的字符串"检索当前路径下的包含指定字符串的文件find . | xargs grep -ri "指定字符串"

2021-07-06 10:53:15 6125

原创 QSqlDatabase: QMYSQL driver not loaded 解决方案

未加载QMYSQL驱动,主要是没有链接libmysql.dll库解决办法,链接动态库即可在项目中添加动态库

2021-06-09 21:04:24 341

原创 Linux驱动之DHT11温湿度传感器

DHT11驱动开发一、DHT11基本信息1、传感器性能说明2、接口说明3、电源引脚DHT11的供电电压为3-5.5V。传感器上电后,要等待1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。4、数据格式一次完整的数据传输为40bit,高位先出。1、采集数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和小数部分用于以后扩展,现在读出为0, 也就是小数

2021-05-22 15:23:02 4437 1

原创 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推

编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推首先三个线程如果不同步的话,是处于竞争状态的,那么会导致乱序执行,系统的调度算法是时间片轮询的话,那么会出现一个线程运行一段时间,然后另一个线程再运行一段时间…要满足ABCABC…一次递推的话,那么必然要使用同步的方法控制三个线程的运行顺序A->B B->C C->A这三个线程相当于是一个环,都互相死等,此时是处于死锁

2021-05-17 14:49:49 801 1

原创 Linux高级编程之多线程同步

线程同步互斥和同步互斥: 是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步: 是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源1 互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。2 同步是指在互斥的基础上(大

2021-05-17 14:45:40 171

原创 Linux高级编程之多线程

多线程典型的进程可以看成是只有一个控制线程(主线程)。一个进程在某一时刻只能做一件事情。有了多个控制线程之后,在程序设计时就可以把程序设计成在某一时刻能够做不止一件事,每个线程处理各自独立的任务。1、进程的两个基本属性1、进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的I/O设备、已打开的文件。信号量等。2、进程同时又是一个可独立调度和分派的基本单位;每个进程在系统中都有唯一的PCB,系统可以根据PC

2021-05-17 14:35:40 207

原创 Linux网络编程之I/O复用服务器模型

TCP I/O复用服务器模型I/O端口复用在linux中,select函数使我们可以执行I/O多路转接。传给select的参数告诉内核:1、我们所关心的描述符2、对于每个描述符我们所关心的条件(读、写、异常)3、愿意等待多长时间(可以永远等待、等待一个固定的时间或者根本不等待)4、已准备好的描述符的总数量从select返回时,内核告诉我们:1、已准备好的描述符的总数量2、对于读、写或异常这三个条件中的每一个,哪些描述符已准备好select函数 #include <sys/

2021-05-16 20:21:59 232 2

原创 Linux网络编程

1、套接字套接字:端口号拼接到IP地址构成了套接字。套接字socket= {IP地址:端口号}每一条TCP连接唯一的被通信两端的两个端点(即两个套接字所确定)2、socket函数创建一个套接字,调用socket函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int

2021-05-16 20:13:53 1528

原创 VMware Workstation 在此主机上不支持嵌套虚拟化。 模块“HV”启动失败。 未能启启动虚拟机

此平台不支持虚拟化的 Intel VT-x/EPT。 不使用虚拟化的 Intel VT-x/EPT,是否继续?VMware Workstation 在此主机上不支持嵌套虚拟化。 模块“HV”启动失败。 未能启启动虚拟机我的VMware 版本是16.x解决方法虚拟机–>设置–>处理器...

2021-05-16 19:35:13 12366 17

原创 在C/C++中为什么经常看到for( ; ; )这样的语句,而不直接用while(1)?

for( ; ; )for(; ;)循环是C语言作者推荐的标准方法,同时还是C++作者推荐的标准方法。省略了循环条件,表示无条件循环。在该写循环条件地方,不写条件,不写就是没有,含义自然就是无条件循环,从语义上讲for(; ;)循环显然更符合语义。while(1)while(1)在某些编译器会报警告的。在该写循环条件时写1,可能会被认为是输入恒真表达式而给警告。在不加编译优化的情况下,while 的用法在某些老旧的编译器中会导致强行与1比较一次。而 for 循环的这种形式永远会被编译器正确识别为无条件

2021-05-13 12:19:27 581

转载 TCP/IP协议栈

TCP/IP协议栈TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。 接下来,我们就来探索一下

2021-05-11 17:30:40 3313

原创 Linux高级编程之进程环境

二、进程1、进程环境1.1 main 函数​ C程序总是从main函数开始执行,main函数的原型是:int main(int argc, char * argv[]);​ 其中 argc是 命令行参数的数目,argv是指向参数的各个指针所构成的数组​ 当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。 可执行程序文件将此启动历程指定为程序的起始地址-----这是由链接编译器设置的,儿链接编译器则由C编译器调用。 启动例程从内核取得命令行参数和环境变量

2021-05-11 16:13:42 122

原创 Linux进程间通信之IPC通信

4、IPC通信IPC通信: 消息队列、信号量以及共享内存4.1、标识符和键 key​ 每个内核中的IPC结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符(identifier)加以引用。​ 标识符key 是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案。为此,每个IPC对象都与一个键key相关联,将这个键作为该对象的外部名。​ 无论何时创建IPC结构(通过msgget(消息队列)、semget(信号量)、shmget(共享内存)创建),

2021-05-11 16:13:05 737

原创 Linux进程通信之信号

3、信号信号是软中断。很多比较重要的应用程序都需处理信号。​ 某个信号出现时,可以告诉内核按照一下3种方式进行处理,我们称之为信号的处理或与信号相关的动作。(1) 忽略此信号​ 大多数信号都可以使用这种方式进行处理,**但有两种信号却决不能被忽略他们是SIGKILL和SIGSTOP信号。**这两种信号不能被忽略的原因是:他们向内核和超级用户提供了使进程终止或停止的可靠方法。(2)捕捉信号​ 为了捉到这一点,要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件

2021-05-10 16:14:45 225

原创 Linux进程通信无名管道和有名管道

三、进程间通信1、 无名管道​ 无名管道:1、半双工 2、只有具有亲缘关系的两个进程才可使用主要是用于父子进程间进行通信1、pipe函数创建无名管道#include <unistd.h> int pipe(int fd[2]);//成功返回0 , 失败返回-1经由参数返回2个文件描述符,fd[0] 为读而打开,fd[1]为写而打开 , fd[1]的输出是fd[0]的输入通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道。fork之后做什

2021-05-10 15:59:55 275

原创 守护进程

5、 守护进程​ 守护进程(daemon) 是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多守护进程,它们执行日常事务活动。5.1 编程规则(1) 调用umask​ 首先要做的是调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)。因为继承来的umask 是linux系统的一般是0022,当设置为有 r 权限时,便会被屏蔽掉,那么这并不是我们想得到的结果(2) 调用fork,然后父进程exit

2021-05-10 15:51:55 340

原创 exec函数族

exec函数族在进程中运行新的代码当进程调用一种exec函数时,该进程执行的程序完全替代为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后进程ID并未改变。exec只是用磁盘上的一个程序替换了当前进程的正文段、数据段、堆段和栈段exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何linux下可执行的脚本文件内核也是使用exec来启动一个程序

2021-05-10 15:49:41 287

原创 孤儿进程和僵尸进程

孤儿进程和僵尸进程​ 孤儿进程 : 父进程结束后,子进程还没有结束,这个子进程就叫做孤儿进程 孤儿进程最后被init 领养 (无害)​ 僵尸进程: 子进程结束了, 但是父进程没有对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称作僵尸进程 也就是父进程没有回收子进程的PCB (有害需要避免,因为僵尸进程已经挂掉了,对系统没有什么作用,但是依然在进程表占了位置,如果OS有大量的僵尸进程,那么进程号就会被大量无故占用,严重的话再次fork进程可能失败)4.7.1

2021-05-10 15:47:11 164

原创 Linux高级编程之进程

3、进程描述​ 进程是进程实体的运行过程,是系统进行_资源分配_和_调度_的一个独立单位。​ 为了使参与并发执行的每个程序(含数据)都能独立地运行,在操作系统中必须为之配置一个专门的数据结构PCB(进程控制块Process Control Block), 系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。由程序段、相关的数据段和PCB三部分便构成了进程实体(进程) ,所谓创建进程实质上就是创建PCB3.1 进程的基本状态及切换(1) 就绪状态这是指进程已处于准备好运行的状态,

2021-05-10 15:42:58 130

原创 C程序的存储空间布局

2、C程序的存储空间布局​ 我们常说的C内存4区 1、正文段 ; 2、 初始化数据段; 3、 未初始化数据段; 4、 栈 ; 5、 堆2.1 正文段(代码段)​ 正文段:这是由CPU执行的及其指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器,C编译器和shell等) 在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其指令2.2 数据段​ 数据段又分为 初始化数据段 、未初始化数据段、常量2.2.1 初始化数据段初始化数据段: 通常将

2021-05-10 15:35:42 207

原创 Linux高级编程之制作库

4、制作库4.1 库的概念库是写好的,现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:二者主要的区别:​ 静态库在编译时链接, 动态库在运行时链接静态库:​ 名称为 libxxx.a ,在编译时就将库编

2021-05-10 15:21:44 98 2

原创 Linux高级编程之目录IO

3、目录I/O文件IO与目录IO对比目录IO文件IOopendir 打开目录open 打开文件mkdir 创建目录O_CREAT 或者使用create函数readdir 读目录read读文件closedir 关闭目录close关闭文件3.1 创建目录 mkdir函数 #include <sys/stat.h> #include <sys/types.h> int mkdir(c

2021-05-10 15:18:22 90

原创 Linux高级编程之文件I/O

一、文件I/O1、文件IO与标准IO1.1、什么是文件I/O?​ 文件IO就是直接调用内核提供的系统调用函数。1.2、什么是标准I/O?​ 标准IO就是间接调用系统调用函数,是C库函数。1.3、文件IO和标准IO的区别文件IO是直接调用内核提供的系统调用函数,头文件是unistd.h,标准IO是间接调用系统调用函数,头文件是stdio.h,文件IO是依赖于Linux操作系统的,标准IO是不依赖操作系统的,所以在任何操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。2、文

2021-05-10 15:16:29 383 2

原创 Source insight 4.0.0120配置与使用

先上结果操作步骤链接:https://pan.baidu.com/s/1ug5ioi_Mta526M8FKd4TSA提取码:plpg复制这段内容后打开百度网盘手机App,操作更方便哦安装原版"Source Insight"软件,安装结束后,不要运行软件;将附件里的"msimg32.dll"放到安装文件夹内;运行软件,导入附件里的授权文件"si4.52pojie.lic"。...

2021-05-09 09:17:03 1257 1

原创 Source insight 4.0.0106 配置与使用

我这里使用的是 4.0.0106 版本链接:https://pan.baidu.com/s/1dWa_xILtFFEg8xnlIZpeZg提取码:60ap将Source insight安装路径下的sourceinsight4.exe 替换为网盘中的文件即可

2021-04-27 18:28:32 233

原创 28BYJ-48 电机驱动(Linux)

17、28BYJ-48 电机驱动什么,学完了pinctrl子系统和GPIO子系统还只会点灯?今天就来个高级点的点灯这个电机驱动程序说白了就是 点灯1、28BYJ-48 电机是四相八拍电机,所以需要4个GPIO来控制简介:28:步进电机的有效最大外径是28毫米B:表示是步进电机Y:表示是永磁式J:表示是减速型(减速比1:64)48:表示四相八拍内部结构示意图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qYxCbNM4-1619338578619)(li

2021-04-25 16:29:41 1482

原创 linux驱动之 ioctrl接口

18、ioctl接口unlocked_ioctrl 接口1、什么是unlocked_ioctrl 接口?​ unlocked_ioctrl 在之前的名字是ioctrl, 之前的是带锁的,现在的是不带锁的, 原因是为了提高实时性虽然名字发生了改变,但是功能和对应的系统调用均没有发生变化2、unlocked_ioctl 和 read/write 有什么相同点和不同点?1、相同点​ 都可以往内核写数据2、不同点​ read函数只能完成读的功能, write 只能完成写的功能读取大量数据的

2021-04-25 16:13:28 1324

原创 Linux驱动之 pinctrl和GPIO子系统

15、pinctrl 和 GPIO子系统在没有使用这两个子系统之前,我们控制GPIO是直接操作寄存器来完成的,例如 LED灯,就是直接对寄存器进行操作1、什么是pinctrl 和 gpio子系统​ pinctrl 这个是linux用来控制引脚相关的​ GPIO 通用输入输出​ 在引入设备树之后,GPIO子系统是通过pinctrl子系统来实现的,这一点要牢记。pinctrl 主要是用来进行pin脚的初始化2、Linux pinctrl 子系统提供的功能是什么​ (1) 管理系统中所有

2021-04-25 15:58:19 1908

原创 Linux驱动之设备树

14、设备树1、什么是设备树?​ 设备树是一种描述硬件资源的数据结构, 它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。2、设备树的由来要想了解为什么会有设备树,设备树是怎么来的,我们就要先来回顾一下在没有设备树之前我们是怎么来写一个驱动程序的。以字符设备驱动代码框架为例,我们一起来回顾下。任何的设备驱动的编写,Linux已经为我们打好了框架,我们只要像做完形填空一样填写进去就可以了。字符设备驱动框架杂项设备驱动框架通过这些框架,我们可以很容易编写我们的驱动

2021-04-25 15:50:01 947

原创 字符类设备驱动框架

12、 字符类设备驱动框架主要需要解决两个问题 1、 分配主设备号; 2、 生成设备节点1、字符设备和杂项设备1、杂项被是字符设备的一种。2、杂项设备的主设备号是固定的,固定为10,那么我们 要学习的字符类设备的主设备号就需要自己或者系统来给我们分配3、杂项设备可以自动生成设备节点,字符设备需要我们自己生成设备节点设备号, 唯一区分一个设备2、分配主设备号注册字符类设备号的两个方法第一种: 静态分配一个设备号#include<linux/fs.h>extern int r

2021-04-20 15:18:54 263

原创 向驱动传递参数

11、 向驱动传递参数1、什么是驱动传参​ 驱动传参就是传递参数给我们的驱动​ 举例 : insmod led.ko a = 12、驱动传参有什么作用?(1) 设置驱动的相关参数,比如缓冲区的大小(2) 设置安全校验,防止我们写的驱动被人盗用3、怎么给驱动传参数?(1) 传递普通的参数,比如char,int 类型的函数:module_parammodule_param(name, type, perm);name : 传递进去的参数的名称type : 类型 如 ch

2021-04-20 15:15:20 434

原创 linux物理地址到虚拟地址映射MMU

9、linux物理地址到虚拟地址映射MMU在单片机和裸机中操作硬件直接访问物理寄存器即可例如 unsigned int *p = 0x12345678;*p = 0x87654321;但是在Linux上不行,在Linux上,如果要想操作硬件,需要先把物理地址转换为虚拟地址,因为Linux使能了MMU(物理地址转换为虚拟地址),所以我们在Linux上不能直接操作物理地址。MMU的好处?​ (1) 让虚拟地址成了可能​ (2) 可以让系统更加安全,因为有了MMU,我们上层应用看到的内存都是虚拟

2021-04-20 15:12:18 1015

原创 应用层与内核层进行数据交互

8 、 应用层与内核层进行数据交互还是以上节的杂项设备为例因为linux一切皆文件、所以驱动设备在linux中也是以文件的方式存在的。应用层与内核层数据交互也是以文件方式进行struct file_operations 文件操作当应用层使用open打开设备文件时,就会触发驱动设备中的open函数int (*open) (struct inode *, struct file *);当应用层使用close关闭设备文件时,就会触发驱动设备中的release函数int (*release)

2021-04-20 15:04:15 1102

原创 杂项设备驱动框架

7、杂项设备驱动框架Linux三大设备驱动字符设备: IO的传输过程是以字符为单位的,没有缓冲。比如I2C、SPI都是字符设备块设备: IO传输过程是以块为单位的。跟存储相关的,都属于块设备,例如tf卡、emmc网络设备: 与前两个不一样,是以socket套接字来访问的。杂项设备1、杂项设备是字符设备的一种。可以自动生成设备节点。​ 在系统里有很多杂项设备, 可以下面的命令来查看 cat /proc/misc2、杂项设备除了比字符设备代码简单,还有别的区别吗?​ 杂项设备的主设备

2021-04-20 15:00:13 276

原创 linux驱动学习

Linux驱动开发板 ITOP44121、什么是linux驱动​ 基于OS的编程方式和单片机开发(裸机开发)截然不同​ 应用程序的执行是依赖于操作系统的​ 应用程序需要调用linux操作系统的库函数来实现​ 驱动程序是操作系统和硬件之间的桥梁, 应用程序不能直接操作硬件2、Linux驱动的分类1、字符设备驱动2、块设备驱动(存储相关的 tf 、 flash 、 emmc)3、网络设备其中,理解和掌握字符设备驱动的概念最重要,因为工作中遇到的大部分都是字符设备(如LED、蜂鸣

2021-04-20 14:56:53 575

原创 NFS挂载根文件系统失败

[ 111.847661] VFS: Unable to mount root fs via NFS, trying floppy.[ 111.860722] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6[ 111.866710] Please append a correct "root=" boot option; here are the available partitions:[ 111.8751

2021-04-20 14:47:36 595

原创 mount: mounting 192.168.xx.xxx:/home/nfs on /mnt/ failed: No such device

出现这个问题的原因是,内核不支持nfs文件系统,需要配置内核使其支持nfs文件系统1、进入到内核源码2、make menuconfig 使用图形化界面进行配置File systems—>[*] Network File Systems —>

2021-04-11 20:05:05 7076

原创 基于涂鸦模组和ITOP4412开发板的宠物喂食器

基于涂鸦模组和ITOP4412开发板的宠物喂食器​ 在不知不觉中,身边已经充斥着各种智能设备,很多人都过上了智能生活,很多事几乎都不用亲力亲为,不仅人们的生活被智能设备占领,宠物市场也是如此,尤其是宠物智能喂食器已经成为家喻户晓的智能设备,如今也正是宠物智能喂食器飞速发展和技术更成熟的时候,宠物智能喂食器未来是我市场前景将不可估量。近来由于新冠疫情的影响,宠物被独自放置在家中,宠物的温饱成了一个大问题,为了不让铲屎官白天工作的时候担心宠物会饿肚子,宠物喂食器应运而生。1、作品描述​ 宠物喂食器,基

2021-03-29 18:40:31 749

原创 使用git命令推送至GitHub

一般使用git命令推送有两种情况1、项目在本地从零开发,未commit或者pull过任何Git版本,需要将自己本地的项目上传到GitHub新建项目中。2、项目是从远端clone到本地进行开发的,需要将该项目迁移到新建的GitHub项目中。接下来分别说明第一种情况首先新建一个仓库建立本地Git仓库1、初始化本地仓库。在本地项目的根目录执行git init2、将本地项目的所有文件添加到暂存区git add ."."是说当前目录下的所有文件;如果只需要添加指定文件 将“.”换成指定

2020-12-16 09:46:25 301

server_feed-master.zip

server_feed-master.zip

2021-10-18

shell批量解压脚本,可根据关键字进行提取

shell批量解压脚本,可根据关键字进行提取

2021-07-14

空空如也

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

TA关注的人

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