- 博客(90)
- 资源 (3)
- 收藏
- 关注
原创 epoll 与select poll区别
(1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。(2)poll==>时间复杂度O(n)poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.
2021-04-26 21:53:03
496
原创 json入门
JSON 语法是 JavaScript 对象表示语法的子集。数据在名称/值对中数据由逗号分隔大括号 {} 保存对象中括号 [] 保存数组,数组可以包含多个对象JSON 值可以是:数字(整数或浮点数)字符串(在双引号中)逻辑值(true 或 false)数组(在中括号中)对象(在大括号中)nullJSON 数字可以是整型或者浮点型"value" : 25 JSON 对象在大括号 {} 中书写:JSON对象在大括号{}中书写,对象可以包含单个或者多个JSON数据。对象(
2020-11-01 18:16:05
471
原创 杂项设备(misc device)
杂项设备(misc device)杂项设备也是嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴,所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的,只不过misc是将一些字符设备存放在misc类中。换句话说,misc设备其实也就是特
2020-10-17 20:03:29
1825
原创 platform平台驱动模型 总线-驱动-设备
platform 总线(1)相对于usb、pci、i2c等物理总线来说,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device。platform总线是虚拟的、抽象出来的。(2)CPU与外部通信的2种方式:地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备,也就是SoC内部集成的各种内部外设。Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/linux/device.h,bus_
2020-10-17 19:01:08
473
转载 推挽、开漏、强上拉、弱上拉、强下拉、弱下拉输出
上拉(Pull Up )或下拉(Pull Down)电阻(两者统称为“拉电阻”)最基本的作用是:将状态不确定的信号线通过一个电阻将其箝位至高电平(上拉)或低电平(下拉),无论它的具体用法如何,这个基本的作用都是相同的,只是在不同应用场合中会对电阻的阻值要求有所不同,从而也引出了诸多新的概念,本节我们就来小谈一下这些内容。如果拉电阻用于输入信号引脚,通常的作用是将信号线强制箝位至某个电平,以防止信号线因悬空而出现不确定的状态,继而导致系统出现不期望的状态,如下图所示:在实际应用中,10K欧姆的电阻是使用数
2020-10-16 17:05:08
9460
1
原创 自旋锁和互斥锁
A hybrid mutex behaves like a spinlock at first on a multi-core system. If a thread cannot lock the mutex, it won’t be put to sleep immediately, since the mutex might get unlocked pretty soon, so instead the mutex will first behave exactly like a spinlock.
2020-10-07 21:09:23
167
原创 等待队列代码实现
hpet_read(struct file *file, char __user *buf, size_t count, loff_t * ppos){ DECLARE_WAITQUEUE(wait, current); /* 定义一个等待队列 */ unsigned long data; ssize_t retval; struct hpet_dev *devp; devp = file->private_data; /* 私有化数据 */ if (!devp->
2020-10-07 20:35:10
249
原创 Linux 阻塞和非阻塞 IO
IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞 IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Outpu
2020-10-04 21:00:50
160
原创 linux驱动开发之地址映射(mmu)
在编写驱动之前,我们需要先简单了解一下 MMU 这个神器, MMU 全称叫做 Memory Manage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU 主要完成的功能如下:①、完成虚拟空间到物理空间的映射。②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。我们重点来看一下第①点...
2020-01-11 14:20:44
1562
原创 Linux 设备号
设备号的组成为了方便管理, Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。 Linux 提供了一个名为 dev_t 的数据类型表示设备号, dev_t 定义在文件 include/linux/types.h 里面12 typedef __u32 __kernel_dev_t;......15 t...
2020-01-09 17:24:54
581
原创 printk的用法及优先级
这里使用了 printk 来输出信息,而不是 printf!因为在 Linux 内核中没有 printf 这个函数。 printk 相当于 printf 的孪生兄妹, printf运行在用户态, printk 运行在内核态。在内核中想要向控制台输出或显示一些内容,必须使用printk 这个函数。不同之处在于, printk 可以根据日志级别对消息进行分类,一共有 8 个消息级别,这 8 个消息级别...
2020-01-09 17:11:11
1708
原创 linux驱动模块的加载和卸载
Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。而且在调试的时候...
2020-01-09 12:04:03
4601
1
原创 字符设备驱动开发总概
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动...
2020-01-09 11:37:37
419
原创 Linux驱动分类简介
Linux驱动主要具有如下几点作用:系统调用是应用程序和内核之间的接口,驱动程序是内核和硬件之间的接口;驱动程序接受上层软件(应用程序、内核)的请求,完成对硬件的操作,屏蔽了硬件的细节;驱动程序将硬件设备抽象成一个文件,应用程序操作文件即操作硬件,符合Linux“一切皆文件”的思想。驱动的分类及特点计算机硬件系统有CPU、存储器以及外设组成,Linux驱动针对的对象是存储器和外设;...
2020-01-09 11:19:17
1739
原创 linux驱动面试题
1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动...
2020-01-09 11:16:42
5473
原创 LCD 时间参数与crt显示器联系
如果将 LCD 显示一帧图像的过程想象成绘画,那么在显示的过程中就是用一根“笔”在不同的像素点画上不同的颜色。这根笔按照从左至右、从上到下的顺序扫描每个像素点,并且在像素画上对应的颜色,当画到最后一个像素点的时候一幅图像就绘制好了。假如一个 LCD 的分辨率为 1024600LCD 是怎么扫描显示一帧图像的。一帧图像也是由一行一行组成的。 HSYNC 是水平同步信号,也叫做行同步信号,当产生此...
2019-12-21 21:11:22
470
原创 ubuntu的子目录用途
但是这些都是 Ubuntu 所需要的,其中有很多子目录和文件我们嵌入式 Linux 是用不到的,所以这里就看一些常用的子目录:1、 /bin 目录看到“bin”大家应该能想到 bin 文件, bin 文件就是可执行文件。所以此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、 mv 等命令。此目录下的命令所有的客户都可以使用。2、 /dev 目录dev 是 device 的...
2019-12-12 20:14:33
302
原创 ubuntu16.04突然无法联网问题解决方法之一
今天,使用ubuntu下载东西时,突然提醒网络连接失败,问题如下:输入:ifconfig输出:ens33 Link encap:以太网 硬件地址 00:11AA:fE:22:FbUP BROADCAST MULTICAST MTU:1500 跃点数:1接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0发送数据包:0 错误:0 丢弃:0 过载:0 载波:0碰撞:0 发送队列长度:...
2019-12-12 17:17:39
1439
原创 Linux 内核启动流程
链接脚本 vmlinux.lds要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。 vmlinux.lds 中有如下代码: vmlinux.lds 链接脚本492 OUTPUT...
2019-12-07 17:30:57
783
1
原创 linux源码剖析五 make zImage 过程
vmlinux、 Image, zImage、 uImage 的区别前面几小节重点是讲 vmlinux 是如何编译出来的, vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zImage 或 uImage 这样的 Linux 内核镜像文件。那么vmlinux、 zImage、 uImage 他们之间有什么区别呢?①、 vmlinux 是编译出来的最原始...
2019-12-06 21:19:28
1060
原创 linux源码剖析四 built-in.o 文件编译生成过程
vmliux 依赖 vmlinux-deps,而 vmlinux-deps=$(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN), KBUILD_LDS是连接脚本,这里不考虑,剩下的 KBUILD_VMLINUX_INIT 和 KBUILD_VMLINUX_MAIN 就是各个子目录下的 built-in.o、 .a 等文件。最终 v...
2019-12-06 21:09:57
2877
原创 linux 顶层makefile源码剖析三 make 过程
125 PHONY := _all126 _all:......192 PHONY += all193 ifeq ($(KBUILD_EXTMOD),)194 _all: all195 else196 _all: modules197 endif......608 all: vmlinux第 126 行, _all 是默认目标,如果使用命令“make”编译 Linux 的话...
2019-12-06 20:04:39
393
原创 linux make xxx_defconfig 过程 Makefile.build 脚本分析
config-targets := 0mixed-targets := 0dot-config := 1ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) dot-config ...
2019-12-05 20:54:06
730
原创 linux 顶层 Makefile 详解
Linux 的顶层 Makefile 和 uboot 的顶层 Makefile 非常相似,因为 uboot 参考了 Linux,前 602行几乎一样,所以前面部分我们大致看一下就行了。1、版本号顶层 Makefile 一开始就是 Linux 内核的版本号2、 MAKEFLAGS 变量MAKEFLAGS 变量设置如下所示:。3、命令输出Linux 编译的时候也可以通过“V=1”来输出...
2019-12-05 20:17:26
1215
原创 linux编译后文件夹
arch 架构相关目录。Linux 自带block 块设备相关目录。crypto 加密相关目录。Documentation 文档相关目录。drivers 驱动相关目录。firmeare 固件相关目录。fs 文件系统相关目录。include 头文件相关目录。init 初始化相关目录。ipc 进程间通信相关目录。kernel 内核相关目录。lib 库相关目录。mm 内存管理相...
2019-12-05 19:41:31
1415
原创 linux源码 编译脚本
#!/bin/shmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfigmake ...
2019-12-05 19:08:55
401
原创 I.MX6U MMDC 控制器简介
MMDC 控制器STM32 的 FMC 或 FSMC 外设用于连接 SRAM 或 SDRAM,对于 I.MX6U 来说也有 DDR 内存控制器,否则的话它怎么连接 DDR 呢? MMDC 就是 I.MX6U的内存控制器, MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、 16 位宽的 LPDDR2, MMDC 是一个可配置、高性能的 DDR 控制器。 MM...
2019-11-27 19:23:33
2202
原创 DDR3 关键时间参数
1、传输速率比如 1066MT/S、 1600MT/S、 1866MT/S 等,这个是首要考虑的,因为这个决定了 DDR3 内存的最高传输速率。2、 tRCD 参数tRCD 全称是 RAS-to-CAS Delay,也就是行寻址到列寻址之间的延迟。 DDR 的寻址流程是先指定 BANK 地址,然后在指定行地址,最后指定列地址确定最终要寻址的单元。 BANK 地址和行地址是同时发出的,这个命令...
2019-11-27 18:36:19
14300
原创 SRAM SDRAM DDR 简介
SRAM为什么要讲 SRAM 呢?因为大多数的朋友最先接触 RAM 芯片都是从 SRAM 开始的,因为大量的 STM32 单片机开发板都使用到了 SRAM,比如 F103、 F407 等,基本都会外扩一个512KB 或 1MB 的 SRAM 的,因为 STM32F103/F407 内部 RAM 比较小,在一些比较耗费内存的应用中会出现内存捉紧的情况,比如 emWin 做 UI 界面。我们简单回顾...
2019-11-27 18:28:21
9726
原创 I.MX6U芯片的UART
I.MX6U 一共有 8 个 UART,其主要特性如下:1、兼容 TIA/EIA-232F 标准,速度最高可到 5Mbit/S。2、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。3、支持 9 位或者多节点模式(RS-485)。4、 1 或 2 位停止位。5、可编程的奇偶校验(奇校验和偶校验)。6、自动波特率检测(最高支持 115.2Kbit/S)。UART ...
2019-11-26 23:09:41
912
1
原创 imx6ull gpt高精度定时器
GPT 定时器是一个 32 位向上定时器(也就是从 0X00000000 开始向上递增计数), GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频, GPT 定时器特性如下:①、一个可选时钟源的 32 位向上计数器。②、两个输入捕获通道,可以设置触发方式。③、三个输出比...
2019-11-26 23:09:18
1265
I.MX6UL_DDR3_Script_Aid_V0.02.xlsx
2019-11-27
ddr_stress_tester_v2.90.exe
2019-11-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人