自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

定义 GPIO Controller 是芯片厂家的事,那么我们该如何定义自己的节点呢。如下图所示,我在的这个节点中,通过gpios = 多少来设置我在这个节点当中使用的是哪个GPIO节点,一般的使用格式为:GPIO组 引脚 什么电平激活 , 下图中的表示为,此节点使用的是GPIO5组当中的3引脚,当电平为低电平的时候激活如下的设置为设备树当中的例子,只需要看 gpios = 这个属性即可一般来说,如果我们要定义自己的节点,那么格式如下compatible属性。

2024-05-10 22:25:54 882

原创 [IMX6ULL驱动开发]-设备树简述

这个属性有一点重要的作用是,假如我这里有两块板子,板子A以及板子B,同时使用了一个公板的设备树节点XXX.dtsi(dtsi表示可以被设备树使用#include包含),此时我的板子A不需要使用到公板的uart节点,那么我们直接在板子A的设备树中,使用&uart来引用此节点,再把状态设置为disable即可。设备树的属性如果不是自定的,那么可以直接获取,比如说reg属性,就是MEM资源,interrupts属性,就是IRQ资源,这些都是可以直接调用函数platform_get_resource获取。

2024-04-24 21:35:58 989

原创 [IMX6ULL驱动开发]-总线设备驱动模型

在上层驱动中,我们需要获取下层驱动的驱动文件的操作控制函数,但是现在存在如下情况,下层驱动的驱动文件chip_demo_gpio.c需要使用上层驱动传入的device创建函数,上层驱动需要下层驱动的驱动文件chip_demo_gpio.c提供的具体操控的结构体,这就导致了交叉依赖,所以我们在这里需要让下层驱动来初始化上层驱动,也就是具体的操控结构体交给下层来初始化。需要注意的是,device设备的创建和销毁现在不在上层驱动进行,而是在下层驱动中的驱动文件中进行。

2024-04-17 23:09:02 997

原创 [IMX6ULL驱动开发]-驱动的分层及实现

假如我们这里的需求是控制两盏LED灯,那么我们就需要用到次设备号来区分这两个LED灯,次设备号不同,代表我们需要的灯就不同,那么所需要初始化的引脚和操控的引脚也不同,在这里我们传入不同的次设备号,在驱动底层我们通过传入的次设备号来判断到底是进行哪个引脚的初始化。但是其实,把对寄存器的映射等步骤在驱动文件中实现并不是很好的实现,因为不同的开发板,引脚、寄存器都是不同的,为了达到兼容的目的,在对应要填充到file_operation结构体的函数中,实现对应的初始化、操控等步骤。包含对应的定义的头文件。

2024-04-11 21:40:40 952

原创 [IMX6ULL驱动开发]-LED驱动

其实在本人的理解看来,在驱动上面操控LED,和使用STM32在操控LED是大同小异的,因为本质都是控制引脚的输出电平,来达到点亮或者熄灭LED的作用,在这里,我们想要操控LED,我们首先要先清除它的原理图是什么样的。如上图所示可知,想要点亮LED,那么我们需要控制引脚,使其输出低电平,方可打开LED,输出高电平,关闭LED。同时由图可知,LED对应的引脚在GPIO5_3,下面我们来详细分析操控LED的步骤。

2024-04-10 22:11:39 1352

原创 [IMX6ULL驱动开发]-基础驱动

如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态,通过打开对应的设备节点,通过read、write等通过编写的驱动函数来操控设备节点。

2024-03-27 23:50:32 948

原创 [IMX6ULL应用开发]-Makefile

假设我有如下三个文件,a.c b.c c.c ,c.c文件包含了c.h这个头文件,当我们make生成了可执行文件之后,我们修改头文件,然后打算重新编译的时候会被告知无法重新进行编译,因为,我们的makefile中。那么我们如何解决这个问题呢,这里就需要用到依赖文件,通过如下makefile,即使只是头文件被修改了,重新进行make编译也是可以编译的,因为这里我们使用了依赖文件,头文件被更改了,依赖文件也会被更改。为延时变量,假如 A=C,那么直到结束,C不管改变多少次,C最终是多少A就是多少。

2024-03-14 18:28:45 752 2

原创 [IMX6ULL应用开发]-hello程序的交叉编译

Ubuntu虚拟机使用桥接模式直接连接网卡,开发板直接使用网线连接网卡,这样虚拟机和开发板同时连接了此网卡,那么就可以通过此网卡互相ping了。把这个文件挂载到开发板上面尝试运行,所谓的挂载,可以理解为把一个设备挂载到开发板上的一个目录,通过访问这个目录就是在访问此设备了。一般来说,我们是使用虚拟机来作为服务器的,在Ubuntu上进行目标的编译,然后通过一系列手段在开发板上面执行或者传输等。生成一个hello_arm可执行文件,我们使用file查看它的架构,可知它是ARM架构的,所以可以在开发板上面执行。

2024-03-12 14:18:28 702 1

原创 [问题随记]-如何修改网页中input type=file按钮名字

在使用HTML编辑网页的时候经常会出现如下问题,使用<input type=file>的类型控件上传文件按钮的时候,无法对按钮的名字进行修改,如下为解决方案。第一条:定义一个input,类型为file,可以进行文件的上传,把它进行隐藏,当他改变的时候,会把它的值读取到iTest这个text类型的控件中。第三条:主要就是用来代替input type=file,按下这个按钮之后,就相当于按下file类型,上传文件的控件,就可以上传文件。

2023-12-26 16:34:18 831

原创 [问题随记]-在Centos下安装strongswan以及问题解决

首先在strongswan的官网下载安装包并进行解压,得到的文件通过WinScp拷贝到centos下。进入strongswan-4.5.3文件夹,首先安装如下必要的库。基于centos,使用yum进行安装。则检查依赖库是否安装完成是否有遗漏,清除之前的生成文件,重新加上权限。更新一下软件以及库,然后执行。编译后的文件如下所示。

2023-12-19 15:37:57 747

原创 [嵌入式Web]-嵌入式Web服务器之JavaScript

JavaScript的变量不像C语言,是没有类型的,js的变量通过var来对变量进行定义,比如说var x = 10;那么就是定义一个x变量赋值为10,js的变量没有想C语言那样子严格对类型进行匹配的,比如说两个字符串相加,JavaScript中可以直接实现。

2023-09-27 08:48:40 346

原创 [嵌入式Web]-嵌入式Web服务器之HTML

点击 <body></body> 标签开始。每个自定义列表项以 <dt> 开始。每个自定义列表项的定义以 <dd> 开始。<dl>

2023-09-18 14:06:23 572

原创 [物联网]-SourceInsight一些配置

如果右边没有搜寻栏的话,Ctrl+O唤起搜索栏。

2023-09-08 16:08:22 64

原创 [物联网]-路由器相关协议

在隧道模式下,和传输模式的区别就是,传输模式不管是AE协议还是ESP协议均是生成头部在IP头以及传输头中间,但是隧道模式是生成在IP头前面,并且在生成一个新的IP头在最前面,在隧道模式下,AE协议的认证范围依旧是整个IP报文,ESP协议的加密范围是ESP报文头到尾部,所以多了一个旧的IP头,而认证范围也多了一个旧的IP报文头。最简单的情况下,系统受到的一个需要封装的路由的数据包成为负载报文,这个报文首先被GRE封装,成为GRE报文,然后这个报文再被封装到IP报文中,然后由IP报文进行转发。

2023-08-29 17:01:32 132

原创 [C++]-多态

C++的多态是指通过基类的指针或引用调用派生类的成员函数,实现运行时的动态绑定。多态可以使得程序在编译时无需知道具体对象的类型,而在运行时根据对象的实际类型来确定调用哪个函数。简单的来说,就是一个接口有多种实现方式多态的分类多态可以分为静态多态以及动态多态静态多态编译时已经知道确切功能,运行时多态要等到调用的时候才可以知道静态多态:又称为编译时多态,早绑定,比如说函数重载、运算符重载动态多态:又称为运行时多态,晚绑定,比如说虚函数使用虚函数可以解决。

2023-08-13 17:06:35 50

原创 [C++]-继承

继承通常体现在类与类之间,父类(基类)派生出来的类叫做子类(派生类),子类可以从父类那里继承父类的除私有数据外的数据,继承分为三种情况,公共继承、保护继承、私有继承,三种继承的权限影响的是继承后,父类数据在子类中的访问权限子类继承父类总共有三种继承方式,分别为public、protected、private,三种继承方式影响的是子类从父类继承过来的数据的访问权限。

2023-08-08 17:57:00 49

原创 [Keil]-STM32环境搭建

这里的环境搭建实例的芯片基于STM32F013C8T6为例。

2023-08-07 17:27:19 149

原创 [C++]-类和对象提高

this指针在C++中的主要用途就是在成员函数中的形参和类中的成员同名的时候,可以用this指针指向的成员表明为类中的成员。静态成员就是在定义类的时候,在成员前面加static修饰,静态成员是类独有的,而不是对象的,每一个实例化出来的对象共享这个静态成员。比如说普通成员是只有在类实例化对象的时候才会开辟空间,真正存在的,而静态成员是在类定义的时候就已经存在的,同时每个对象是共享一个成员函数的,并不是每一个对象都有一个成员函数。单例模式的意思是,如果定义了一个类,那么这个类有且仅有一个对象存在。

2023-07-30 22:38:02 81

原创 [C++]-类和对象基础

目录【类的概述】1.定义一个类2.在类外定义函数2.1 类外定义2.2 其他文件定义【构造函数】1.构造函数的创建2.构造函数的调用【析构函数】 1.析构函数的定义【拷贝构造】1.拷贝构造的定义2.有参、无参、拷贝构造关系3.拷贝构造的几种调用形式3.1 旧对象初始化新对象调用拷贝构造3.2 普通对象作为函数参数传入,调用拷贝构造 3.3 普通函数作为函数的返回值4.拷贝构造的深拷贝和浅拷贝【初始化列表】【对象数组】【explicit关键字】 访问属性 属性 对象外部 继承性

2023-07-28 20:15:50 59

原创 [C++]-C++前期概念

C++是编程思想为面向对象、泛型编程的语言。C++和C在编程思想上,最主要的区别就是C的编程思想是面向过程的编程思想C++的编程思想最主要是面向对象的编程思想这两者听起来似乎有点抽象,简单的说,C语言的思想就是现在干什么、下一步干什么、在下一步干什么,是通过调用API一步步实现的,而C++是这个对象现在干什么、这个对象下一步干什么,这个对象在下一步干什么。

2023-07-25 18:37:27 65

原创 [Linux]-Ubuntu16下的boa服务器移植

将 boa-0.94.13-src.tar.gz 这个文件拷贝到虚拟机下的tool中。返回上一级目录,将boa.conf拷贝到/home/edu/boa/boa。在www文件下下新建一个index.html,写入然后开启服务器查看。-p用来创建/home/edu/下的boa文件夹。将boa拷贝到/home/edu/boa/boa。进入boa-0.94.13-src文件夹。如果发生错误未找到什么安装什么。修改defines.h文件。打开boa.conf文件。生成makefile。安装完后再次make。

2023-07-23 14:49:30 149

原创 [Linux]-原始套接字

原始套接字指的是在传输层下面使用的套接字,之前使用的流式套接字和数据报套接字是工作在传输层的,并且在接受和发送的时候只能对数据部分进行操作,如果想要自己组建一个报文,那么就需要使用原始套接字。并且原始套接字还可以监听所有经过本机网卡的数据帧或者数据包。

2023-07-22 11:54:05 614

原创 [Linux]-TCP

客户端:主动连接服务器,和服务器进行通信服务器:被动连接客户端,启动新的进程或者线程,通过新的端口号服务客户端(并发服务器)

2023-07-10 20:21:45 120

原创 [Linux]-TCP三次握手四次挥手

通信过程的详解:一开始客户端先向服务器发送“hello tcp”这九个字符,由于此时对于客户端来说,上一条接收到的报文为三次握手期间,服务器发送的报文,所以seq为1,ack为0+1为1。当服务器接受到报文之后,会向客户端发送应答,此时对于服务器来说,上一条接收到的最近的客户端报文为普通通信PSH报文,所以此时seq为1,而ack则为上次报文的seq加上数据长度,也就是1+9为10。此时由服务器向客户端发送PSH通信报文,此时对于服务器来说,

2023-07-09 00:36:02 79 1

原创 [Linux]-TFTP网络抓包

TFTP是一种基于UDP的简单文件传输协议,TFTP的全称叫做,数据传输的模式有两种,一种是octer二进制传输模式,一种是netascii文本模式,这两种模式的区分在组装数据报文的时候会使用到。

2023-07-06 23:58:46 612 1

原创 [Linux]-UDP编程

字节序是多字节看成一个整体的时候存储的顺序,是由系统决定的字节序分为:大端存储和小端存储小端存储:数据的低字节位存储于低地址位大端存储:数据的高字节位存储与低地址位1.socket也称套接字2.socket是一个文件描述符,代表了通信的一端3.类似对文件的操作一样,可以使用类似read、write、close等函数对socket套接字进行网络数据的收取和发送等操作4.使用socke()得到套接字。

2023-07-04 23:40:49 1178

原创 [Linux]-计算机网络

网络节点:路由器和交换机组成路由:网络通信路径我们之前学习过Linux系统编程,其中系统中的进程是通过进程PID来确定的,但是在网络的世界中,仅仅使用进程号以及不能够满足了,因为网络可能是主机和主机之间进行通信,一个相同的进程号在两个不同的主机之间代表的进程是不相同的TCP/IP协议采用端口标识通信的进程。端口的本质是一段内存端口具有以下特点:1.对于同一个系统,一个端口只能对应一个进程2.对于同一个系统,一个进程可以对应多个端口3.对于同一个端口,在不同系统对应不同进程。

2023-07-03 11:13:28 122 1

原创 [Git]-Linux下的git操作

git是一个代码协同管理软件,主要用来完成多人协同开发的时候管理项目在当前工作的位置添加快照,保存工作状态,一般用于版本的迭代可以理解为给版本号取别名另一台主机上面的仓库,可以被其他主机访问。

2023-06-29 21:27:42 4081 1

原创 [Linux]-信号量

信号量(类型sem_t)被广泛的应用于线程和进程之间的同步与互斥,信号量的本质其实是一个非负的整数计数器,它被用来控制对公共资源的访问,当信号量大于0的时候,才允许访问不会发生阻塞信号量的控制使用的是PV原语,P操作可以使当前信号量减一,V操作可以使当前信号量加一,任务之间就是通过这个PV原语来完成线程之间的同步与互斥。

2023-06-28 11:12:48 1049 1

原创 [Linux]-条件变量

之前我们了解过的死锁的一种情况,就是两个线程通过管道互相读取数据的时候,读的线程抢到了互斥锁,但是由于管道的读端带阻塞功能,会使读线程阻塞,造成互斥锁无法解锁,导致写端的线程也阻塞,直接造成了死锁的出现。我们可以通过设置管道读端不阻塞来解决这个问题,但是管道读端如果不阻塞的话,很难读取到数据,那么我们就要使用条件变量来解决这个问题条件变量简单的说,就是休眠当前任务,然后当需要的条件满足的时候,再次唤醒休眠的任务。通常来说,条件变量是和互斥锁一起使用的。

2023-06-26 17:20:03 1379 1

原创 [Linux]-锁

如果进程中有一块公共资源,同时创建多个线程,这些线程有的想要对这块资源进行写操作,有的想要对这块资源进行读操作,那这是不可取的,读写锁用来解决这些问题读写锁的类型为简单来说,就是如果一个任务上了写锁,那么其他任务的读锁以及写锁均会被阻塞,如果任务上的是读锁,那么其他任务读锁不会被阻塞,写锁会被阻塞。其实这是很好理解的,假如公共资源是一本书,一个人(任务)阅读的时候,其他人(其他任务)也可以过来看一看,但是无法在别人看书的时候修改书吧(读锁阻塞写锁,不阻塞其他读锁)。

2023-06-26 00:58:37 123 2

原创 [Linux]-线程

进程和线程的区别进程系统分配资源的基本单位线程CPU执行调度的基本单位上述是进程和线程之前的区别的标准回答,但是难免会过于抽象了。个人理解认为,进程就是线程的一个容器,当进程执行,系统会分配资源给进程,而进程中执行线程。任何一个进程都是由很多线程组成的(一个进程有一个或者多个线程),线程负责执行程序,所以CPU调度执行的基本单位就是线程。进程用来存放线程,线程负责执行。每一个进程默认有一个线程用来执行主函数。

2023-06-24 17:28:05 97 1

原创 [Linux]-进程间通信方式汇总

进程通过感兴趣的消息类型来接受队列中的数据,如果消息类型相同的话,还是遵循先进先出的顺序,否则不同的消息类型是不用遵守先进先出而是随机读取的。:无名管道多用于少量进程之间的通信,同时必须是存在血缘关系的进程。内存映射数据读取也是没有格式的,当在一个进程中修改映射区的数据,物理内存抽象的磁盘文件中也会被修改(可设置),也就是往里面写数据之后,数据还会继续存在。:有名管道可以用于互不相关的进程之间的通信,有名管道是半双工的,数据先进先出,进程之间一对一使用,数据也是没有格式的,所以需要规范读写数据要求。

2023-06-24 11:43:52 86

原创 [Linux]-进程间通信之信号

信号是Linux通信中最古老的通信方法。信号是软件中断,是在软件层次上对中断的一种模拟是一种异步通信(不用死循环等待)的方式。信号可以导致一个正在运行中的异步进程中断,转而处理另一个突发事件。信号主要用来杀死进程(大部分),如果有时候在另一个终端想要退出进程,就是通过发送信号来终止进程。信号具有以下特点:简单、不能携带大量的信息、满足条件发出一个完整的信号周期分为三个部分信号的产生信号在进程中的注册(一般注册自定义函数,注册信号行为)信号在进程中的注销执行信号处理函数。

2023-06-24 01:27:05 266

原创 [Linux]-进程间通信之共享内存

内存映射I/O (Memory-mapped lO)使一个磁盘文件与存储空间中的一个缓冲区相映射当将一个磁盘文件通过内存映射映射到内存(进程的地址空间)之后,文件磁盘地址和进程的虚拟地址空间会存在对映关系,于是进程就可以听过指针的方式来对这一段内存进行读写了。于是当从这段内存中取数据,就相当于读文件中的相应字节。于此类似,将数据存入缓冲区,则相应的字节就自动写入文件看着似乎和管道很相似,都是通过一个媒介往媒介中间写入或者读取,看着像,但是本质还是有区别。

2023-06-23 15:53:33 735 1

原创 [Linux]-进程间通信之消息队列

之前我们使用过的管道比较适用于较少进程之间的通信,那么如果想要实现多个进程之前的通信的话,我们需要使用消息队列消息队列具有如下特点1.消息队列是消息的链表,存放于内存中,内核维护消息队列2.消息队列中的消息是有类型的3.消息队列中的消息是有格式的4.消息队列可实现消息随机查询,并且不一定要遵循先进先出的顺序,而是每个进程可以按照感兴趣的类型进行读取5.与管道相同,读出数据后,消息队列对应数据会被删除6.每个管道都有消息队列标识符,在整个系统中是唯一的7.消息队列允许。

2023-06-22 15:12:47 1407 2

原创 [Linux]-进程间通信之管道

管道,默认情况下为无名管道。无名管道是一种特殊类型的文件,在应用层表现为两个打开的文件描述符,读端为一个文件描述符,写端为一个文件描述符。无名管道具有以下特点1.半双工,数据在同一时刻只可以往一端流动2.数据只能够一端流入一端流出3.写入管道数据遵守先进后出原则4.写入信息无格式,要求写入和读取要遵守约定(比如一个信息五十个字节,那么就不能一次只读取二十五字节,而是应该读取五十字节)5.管道的本质不是文件,而是内存6.管道对应一个缓冲区,每个系统不一样。

2023-06-21 18:53:47 180

原创 [Linux]-进程

程序:静态的,占用的是磁盘空间进程:动态的,进程的(调度、执行、消亡)占用内存空间进程通俗的来讲,就是一个可执行文件从头执行到尾的过程。

2023-06-20 16:07:22 150

原创 [Linux]-文件

所以,close关闭文件是按照个数关闭的,假如两个线程打开了同样的文件,那么就有两个文件描述符,关闭一个减一,只有当文件描述符个数为0,才会回收文件占用的内存空间。转化为二进制也就是 000 000 010 ,按位取反后的值为 111 111 101 ,与给定权限按位与得到的值为 111 111 101 也就是 0776,所以其他用户是没有可执行权限的。使用open函数已可读可写的形式打开一个文件,如果文件不存在,则创建该文件,同时赋予文件权限为0777。文件信息的保存是通过结构体指针来进行保存的。

2023-06-19 00:05:37 252 4

原创 [VScode]-连接服务器无法解析工作区文件夹问题的解决

解决连接Samba服务器无法解析工作区文件夹问题

2023-06-18 20:39:05 2653

空空如也

空空如也

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

TA关注的人

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