自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 U-Boot移植 (3)- uboot启动Linux内核测试

uboot 移植到此结束,简单总结一下 uboot 移植的过程:①、不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot、 linux kernel 和 rootfs 等,最终制作好 BSP包提供给用户。我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。

2023-07-04 20:11:17 1030 1

原创 U-Boot移植 (2)- LCD 驱动修改和网络驱动修改

I.MX6ULL内部有个以太网MAC外设,也就是ENET,需要外接一个PHY芯片来实现网络通信功能,也就是「内部MAC+外部PHY芯片」的方案。有两个网络接口ENET1和ENET2,正点原子的开发板提供了这两个网络接口,其中ENET1和ENET2都使用LAN8720A作为 PHY 芯片。NXP 官方的开发板使用KSZ8081这颗 PHY 芯片。更换 PHY 芯片以后需要调整网络驱动,使网络工作正常。ENET1ENET1 的网络 PHY 芯片为LAN8720A,通过 RMII 接口与I.MX6ULL。

2023-07-04 20:09:22 1502

原创 U-Boot移植 (1)- uboot添加自己的开发板

右端灰色的为原厂开发板的相关文件,黄色的为模仿原厂文件,新添加并修改的自己开发板的文件。

2023-07-04 00:10:39 733

原创 U-Boot移植 - 3_U-Boot 命令使用

注意,网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP地址在同一个网段内,比如现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.253,因此 serverip 就是192.168.1.253。其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。

2023-07-03 20:33:45 441

原创 U-Boot移植 - 2_环境搭建和u-boot烧录启动

嵌入式Linux开发,程序编译通常在电脑端的Linux(如虚拟机中的Ubuntu)下进行编译,Ubuntu 自带gcc 编译器,但该编译器是针对 X86 架构的!而嵌入式Linux是ARM架构的, 所以需要一个在 X86 架构上可以编译 ARM 架构代码的 gcc编译器,即。,默认是 3 秒倒计时,在 3 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核了。,configs 目录下有很多跟 I.MX6UL/6ULL 有关的配置,找到与mx6ull相同的,如下图。

2023-07-02 21:38:36 1201

原创 U-Boot移植 - 1_嵌入式Linux系统移植概述

Linux 的移植主要包括3部分:移植「bootloader 代码」, Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设, 然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。bootloader 有很多,常用的就是 U-Boot。

2023-07-02 21:28:14 283

原创 网络环境TFTP&NFS搭建

AppData/Roaming/Typora/typora-user-images/image-20230627213842658.png)]执行以下指令设置开发板 IP,创建一个 get 目录,将虚拟机(192.168.1.254) NFS 共享目录挂载到到开发板的 get 目录中。就是我们上面创建的tftp文件夹目录,以后我们就将所有需要通过TFTP传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。/home/kaka/IMX6ULL/nfs 表示 NFS 共享的目录。

2023-07-02 21:13:29 311

原创 FTP服务器项目

本项目实现一个FTP服务器,通过FTP客户端(如FileZilla)来获取文件列表、下载、上传、删除文件等功能。用到了libevent网络事件库管理socket的连接加入线程池来并发的处理请求,应用创建型模式-工厂模式来管理FTP客户端的请求命令码去注册对象。Libevent的更多内容链接:libevent C++高并发网络编程FTP协议的更多内容链接:FTP协议详解工厂模式的更多内容链接:C++设计模式 - 创建型模式之工厂模式项目完整代码git仓库。

2023-06-11 18:49:26 1846

原创 C++设计模式 - 创建型模式之工厂模式

工厂模式最直观的理解是,减少new创建对象的方式,用接口的方式来返回一个对象,而new创建的方式被封装了简单工厂:调用者只需使用单例工厂就可获取同一范畴的所有产品工厂方法:调用者并不知道它在运行时会获取何种产品,只知道某个特定的工厂能生成出满足需求的产品抽象工厂:调用者可以在运行时从特定的工厂中获得所有信息相关的产品簇(可以对产品进行组合)

2023-06-11 14:26:49 1593

原创 C 语言实现简单工厂模式

印象中,设计模式是由面向对象的语言(C++、JAVA)才能完成的,而 C 语言是面向过程的语言,不能实现设计模式。但C 语言中有函数指针回调函数等机制,使用这些机制便能写出面向对象的优秀程序。LINUX 操作系统,采用 C 语言写的,但是里面很多模块实现都是通过面向对象的设计方式实现的,这也是很多人初看 Linux 源码看得云里雾里的原因。面向过程(Procedure Oriented 简称 PO): 把事情拆分成几个步骤(相当于拆分成一个个的方法和数据),然后按照一定的顺序执行。

2023-06-11 13:58:55 1430

原创 FTP协议详解

FTP为的缩写,即文件传输协议,是TCP/IP协议族中的协议之一。FTP是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。RFC 959定义了FTP协议规范。同大多数Internet服务一样,FTP也是一个客户/服务器系统(C/S系统)。用户通过一个客户端程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。

2023-06-11 13:33:31 11226 1

原创 iptables场景示例

【代码】iptables场景示例。

2023-06-04 21:56:02 132 1

原创 iptables扩展匹配条件

当默认链中的规则非常多时,不方便我们管理。想象一下,如果 INPUT 链中存放了 200 条规则,这 200 条规则有针对 httpd 服务的,有针对 sshd 服务的,有针对私网 IP 的,有针对公网 IP 的,假如,突然想要修改针对 httpd 服务的相关规则,难道还要从头看一遍这 200 条规则,找出哪些规则是针对 httpd 的吗?这显然不合理。所以,iptables 中,可以自定义链,通过自定义链即可解决上述问题。

2023-06-04 21:53:28 601

原创 iptables基本匹配

当数据包来到的时候先匹配第一条规则,如果符合规则则接受。如果不符合第一条规则,接着匹配第二条规则,如果是tcp包执行DROP动作,丢弃报文。如果不是tcp包执行默认规则ACCEPT。当数据包发出的时候先匹配第一条规则,如果TCP包符合规则则接受发出。如果不符合第一条规则,接着匹配第二条规则,不是tcp包执行DROP动作,丢弃报文。从ens38进来的icmp包全都丢弃,从其他网络接口就来的包不匹配第一条规则,执行默认规则ACCEPT。凡是由本机发出的TCP协议报文都允许出去,其他的协议不允许;

2023-06-04 21:51:20 712

原创 iptables的四表五链

对数据包做路由选择之后,将应用此链中的规则,然后将进行路由选择,确认数据包的目标地址是否是防火墙本机,结合内核传送给。当数据包到达防火墙时,如果对应的链内有规则存在,将按照顺序依次从。:出流量,其实就是防火墙本机向外的地址发送数据包,首先被。链做处理,确认通过之后,便可以交给服务器端来进行响应。来进行处理是否需要通过或直接丢弃,最后将交给。:如果是外边的数据包到达防火墙后,要先通过。:如果是外边的数据包到达防火墙后,要先通过。,其表内包括五个链:prerouting。做相关处理,随后进行路由选择,

2023-06-04 21:51:16 1181

原创 iptables和防火墙

*Iptables 是配置 Netfilter 过滤功能的用户空间工具。**netfilter 才是防火墙真正的安全框架(framework),netfilter 位于内核空间。iptables 其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。Iptable 根据规则所定义的方法来处理数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。iptables:用来管理 Linux 防火墙的命令程序,位于目录下,属于用户空间的防火墙管理体系。

2023-06-04 21:47:10 722

原创 STM32的SPI外设

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F407 型号的芯片默认 fpclk142MHz, fpclk2 为 84MHz),完全支持SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。

2023-05-23 20:48:22 1252

原创 SPI 协议

SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是一种**高速、全双工、同步通信总线**。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,要求通讯速率较高的场合。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,无应答机制。

2023-05-23 20:47:38 113

原创 libevent高并发网络编程 - 06_基于libevent的C++线程池实现

本文利用libevent,实现一个C++线程池,,可自定义用户任务类,继承于任务task基类,重写任务基类的纯虚函数实现多态。比如将定义定义处理客户端的请求任务类,实现对客户端请求的并发处理。工作队列:可以理解为线程的队列,一个线程同时可以处理一个任务,空闲的线程回从任务队列取出任务执行。当工作队列空时,线程会睡眠。任务队列:用户将任务加入任务队列,然后通知工作队列,取出一个任务到线程中执行。

2023-05-20 13:17:34 1099 2

原创 libevent高并发网络编程 - 05_libevent实现http客户端

对象来处理底层的网络 I/O,并使用指定的 DNS 解析器解析主机名。实现http客户端的GET、POST请求编写,请求服务器的文件并保存。用于获取 URI 的查询部分,获取路径后面的参数。并指定响应回调函数,配置请求头部和请求数据,最后通过。发送http请求前,需要对目标的URL进行解析。的回调函数,在请求回调函数中处理返回的数据。指定请求类型和请求uri发送http请求。用于获取 URI 的主机名部分。用于获取 URI 的路径部分。获取一个HTTP请求的响应状态码。需要注意的是,在使用完。

2023-05-14 19:27:24 1315

原创 libevent高并发网络编程 - 04_libevent实现http服务器

在libevent中,HTTP的实现主要是通过evhttp模块来完成的。evhttp提供了一个高层次的HTTP服务器接口,可以处理HTTP请求并发送HTTP响应。在源码中,libevent的HTTP协议处理主要是通过evhttp模块来完成的。当客户端发起一个HTTP请求时,libevent将该请求解析为结构体表示,并调用用户设置的请求处理函数进行处理。结构体定义了HTTP请求的各个字段,如请求行、请求头、请求正文等。例如,以下是int major;// 主版本号 int minor;

2023-05-14 19:24:25 2547

原创 libevent高并发网络编程 - 03_bufferevent filter过滤器

是libevent库提供的一个功能,可以通过添加filter对输入或输出数据进行转换和过滤,可以在读取前和写入后对数据进行一系列的预处理操作。是一种包装另一个bufferevent的方式,它提供了两个回调函数:readcb和writecb。这些回调函数可以在读取或写入数据之前或之后对数据进行处理。例如,可以使用bufferevent filter将所有传入数据转换为大写字母,并将其发送到底层bufferevent中。使用进行数据过滤的流程如下创建底层:首先需要创建一个底层的,用于接收和发送原始数据。

2023-05-14 19:21:18 633

原创 libevent高并发网络编程 - 02_libevent缓冲IO之bufferevent

具体而言,bufferevent 会维护两个水位,一个是读取的低水位(read low watermark),另一个是写入的高水位(write high watermark)。而当缓冲区中的数据量达到或超过写入高水位时,bufferevent 会暂停读取并触发写入事件,直到缓冲区中的数据量降到一定程度。会尽可能地将缓冲区中的数据写入网络中,但也要考虑到网络带宽、延迟和拥塞等因素,以确保数据传输的效率和可靠性。函数并不会真正地读取或写入数据,而只是模拟触发相应的事件,从而让事件回调函数被调用。

2023-05-14 19:16:18 1256

原创 libevent高并发网络编程 - 01_libevent事件Event处理

libevent是一个事件驱动框架,可以用于处理网络通信等I/O操作其中,事件处理(Event)和缓冲区( bufferevent)处理是两个不同的组件。事件处理(event)主要负责监听文件描述符上的事件,并在事件发生时调用相应的回调函数进行处理例如,一个TCP连接建立成功后,事件处理器可以监听该连接上是否有可读、可写或异常事件发生,并在事件发生时触发相应的回调函数进行数据处理。缓冲区处理(bufferevent)则是对事件处理的补充,它提供了对I/O数据的缓冲和处理功能。

2023-05-07 19:06:46 1101

原创 linux驱动开发 - 12_platform 平台驱动模型

platform 驱动框架分为总线、设备和驱动,其中总线不需要去管理,这个是 Linux 内核提供的,编写驱动的时候只要关注于设备和驱动的具体实现即可。在没有设备树的 Linux 内核下,需要分别编写并注册 platform_device 和 platform_driver,分别代表设备和驱动。在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要去编写了,只需要实现 platform_driver 即可。

2023-05-03 21:35:35 1001

原创 linux驱动开发 - 11_Linux 下的驱动分离与分层

以input子系统 为例,input 子系统负责管理所有跟输入有关的驱动,包括键盘、鼠标、触摸等,最底层的就是设备原始驱动,负责获取输入设备的原始值,获取到的输入事件上报给 input 核心层。可以看出,每种平台下都有一个主机驱动和设备驱动,左边的主机驱动是必要的,不同平台的控制器不同。最好每个平台的I2C控制器都提供一个统一的接口(也叫做主机驱动),每个设备的也只提供一个驱动程序(设备驱动),每个设备通过统一的 I2C接口驱动来访问,这样就可以大大简化驱动文件。在实际的驱动开发中,

2023-05-03 21:30:17 1169

原创 linux驱动开发 - 10_阻塞和非阻塞 IO

当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。阻塞 IO 访问示意图,应用程序调用 read 函数从设备中读取数据,当设备不可用或数据未准备好的时候就会进入到休眠态。等设备可用的时候就会从休眠态唤醒,然后从设备中读取数据返回给应用程序。非阻塞 IO 访问示意图,

2023-05-03 21:26:07 505

原创 linux驱动开发 - 09_中断

裸机里面中断的处理方法:①、使能中断,初始化相应的寄存器。②、注册中断服务函数,也就是向 irqTable 数组的指定标号处写入中断服务函数②、中断发生以后进入 IRQ 中断服务函数,在 IRQ 中断服务函数在数组 irqTable 里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。在 Linux 内核中也提供了大量的中断相关的 API 函数。

2023-05-03 21:24:41 873 1

原创 linux驱动开发 - 08_内核定时器

Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(叫系统频率),比如 1000Hz, 100Hz 等等说的就是系统节拍率。系统节拍率是可以设置的,单位是 Hz选中“Timer frequency”

2023-05-03 20:35:30 1014

原创 linux驱动开发 - 07_pinctrl 和 gpio 子系统实战

此函数获取 GPIO 编号,因为 Linux 内核中关于 GPIO 的 API 函数都要使用 GPIO 编号,此函数会将设备树中类似**的属性信息转换为对应的 GPIO 编号**,此函数在驱动中使用很频繁!对于驱动开发人员,设置好设备树以后就可以**使用 gpio 子系统提供的 API 函数来操作指定的 GPIO, gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程。此函数用于设置某个 GPIO 的值,此函数是个宏,定义如下。

2023-04-20 20:19:04 503

原创 linux驱动开发 - 06_设备树下的 LED 驱动

可以看出, alpahled 这个节点找到了,并且 compatible 属性值为“atkalpha-led”,status 属性值为“okay”, reg 属性的值为“0X20C406C 0X4 0X20E0068 0X4 0X20E02F4 0X4 0X209C000 0X4 0X209C004 0X4”,这些都和我们设置的设备树一致。编写测试 APP, led 驱动加载成功以后手动创建/dev/led 节点,应用 APP 通过操作/dev/led文件来完成对 LED 设备的控制。

2023-04-17 21:20:59 441

原创 linux驱动开发 - 05_设备树常用OF操作函数

Linux 内核提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,所以在很多资料里面也被叫做 OF 函数。of_iomap 函数用于直接内存映射,以前会通过 ioremap 函数来完成物理地址到虚拟地址的映射,采用设备树以后就可以直接通过 of_iomap 函数来获取内存地址所对应的虚拟地址,不需要使用 ioremap 函数了。of_find_node_by_type 函数通过 device_type 属性查找指定的节点,函数原型如下。

2023-04-13 22:00:01 772

原创 linux驱动开发 - 04_Linux 设备树学习 - DTS语法

设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等在图中,树的主干就是系统总线,IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接到系统主线上的分支。

2023-04-13 21:58:06 1753

原创 linux驱动开发 - 03_新字符设备驱动

字符设备驱动开发重点是使用 register_chrdev 函数注册字符设备,当不再使用设备的时候就使用unregister_chrdev 函数注销字符设备,驱动模块加载成功以后还需要手动使用 mknod 命令创建设备节点。register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API函数。学习一下如何编写新字符设备驱动,并且在驱动模块加载的时候自动创建设备节点文件。​

2023-04-10 21:38:10 481

原创 linux驱动开发 - 02_简单Linux LED 驱动开发

Linux 内核启动的时候会初始化 MMU,设置好内存映射,设置好以后 CPU 访问的都是虚拟地址。比 如 I.MX6ULL 的 GPIO1_IO03 引 脚 的 复 用 寄 存 器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的地址为 0X020E0068。对于 32 位的处理器来说,虚拟地址范围是 2^32=4GB,开发板上有 512MB 的 DDR3,这 512MB 的内存就是物理内存,经过 MMU 可以将其映射到整个 4GB 的虚拟空间。如果点亮的话 说明驱动工作正常。

2023-04-06 21:20:31 408

原创 linux驱动开发 - 01_字符设备驱动开发

​ 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。​在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。​ linux 下的应用程序是如何调用驱动程序的。

2023-04-05 17:37:10 545

原创 Linux内核之内存管理知识结构

应用程序使用malloc()申请内存,使用free()释放内存,malloc()/free()是glibc库的内存分配器ptmalloc提供的接口,ptmalloc使用系统调用brk/mmap向内核以页为单位申请内存,然后划分成小内存块分配给用户应用程序。内核空间的基本功能:虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk用来扩大或收缩堆,sys_mmap用来在内存映射区域分配虚拟页,sys_munmap用来释放虚拟页。以单页为说明,0号页和1号页是伙伴,2号页和3号页是伙伴。

2023-03-16 20:27:54 452

原创 Linux内核之调度策略及优先级

dl_sched_class/rt_sched_class/stop_sched_class/idle_sched_class/fair_sched_class,其中每种调度类都有自己的调度策略。进程在用户模式下运行,无法直接调用schedule()函数,只能通过系统调用进入内核模式,如果系统调用需要等待某个资源,如互斥锁或信号量,就会把进程的状态设置为睡眠状态,然后调用schedule()函数来调度进程。调度类优先级,由高到低进行排列:停机调度类>限期调度类>实时调度类>公平调度类>空闲调度类。

2023-03-15 22:05:58 956

原创 Linux内核之进程原理分析

Linux内核把进程称为任务(task),进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户空间虚拟地址空间。进程有两种特殊形式:没有用户虚拟地址空间的进程称为内核线程,共享用户虚拟地址空间的进程称为用户线程。通用在不会引起混淆的情况下把用户线程简称为线程。共享同一个用户虚拟地址空间的所有用户线程组成一个线程组。C标准库进程术语和Linux内核进程术语对应关系如下:C 标准库进程术语Linux 内核进程术语包含多个线程的进程。

2023-03-15 21:47:40 529

原创 应用层协议设计ProtoBuf

Protocol buffers 在序列化数据方面,它是灵活的,高效的。Protocol Buffer 具有向后兼容的特性,更新数据结构以后,老版本依旧可以兼容,这也是 Protocol Buffer 诞生之初被寄予解决的问题。Protocol Buffer 是 Tag - Value (Tag - Length - Value)的编码方式的实现,减少了分隔符的使用,数据存储更加紧凑。Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。

2023-03-14 21:01:29 323

MySQL 中文完全参考手册5.1

MySQL 中文完全参考手册5.1

2022-08-21

MySQL Workbench软件

MySQL Workbench软件

2022-08-21

空空如也

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

TA关注的人

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