自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 二、在内核目录内外编译模块(驱动)及IMX6ULL的GPIO操作方法

set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器,a) 要设置bit n:set_reg = (1。b) 要清除bit n:clr_reg = (1。(1)、直接读写:读出、修改对应位。

2023-02-21 14:36:17 261

转载 一、字符设备驱动框架

对于APP的每一个文件句柄,在内核里面都有一个“struct file”与之对应。驱动程序的核心是file_operations结构体:分配、设置、注册。Device_create表示在“/sys/class/hello_class”目录下创建一个文件“myhello”Class_create表示在”/sys/class“”目录下创建一个子目录“hello_class”file_operations 结构体也在struct file中。(2)、构造file_operations结构体。

2023-02-20 16:59:39 259

转载 5、栈的原理

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。特点:后进先出(LIFO)。

2023-02-12 22:42:41 179

转载 4、单链表复杂实现

单链表复杂实现

2023-02-12 22:41:28 134

转载 3、线性表之单链表

指针访问成员用箭头->,如p->data,如果用结构体访问成员,则如:A.data。堆的函数为malloc,能申请动态内存,可以随时存入值。重点:指针P不能为空。二、基本运算的相关算法。

2023-02-12 22:39:35 67

转载 2、线性表之顺序表

线性表是包含若干数据元素的一个线性序列。1、顺序存储结构的表示。

2023-02-12 22:06:15 57

转载 1、什么是数据结构

1、逻辑结构:按每个元素可能具有直接前趋数和直接后继将逻辑结构分为“线性结构” 和“非线性结构”两大类。根据数据元素的特殊字段(称为关键字Key),计算数据元素的存放地址,然后数据元素按地址存放。将数据结构中各元素分布到存储器的不同点,用地址(或链指针)方式建立他们之间的联系。在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。2、存储结构:逻辑结构在计算机中的实现方法,依赖于计算机语言。数据结构包括数据的逻辑结构和存储结构以及操作。线性结构”和“非线性结构”两大类。

2023-02-12 21:47:16 114

转载 【无标题】

主机发出一个480us的低脉冲,模块也跟着回应一个低脉冲。然后紧跟着主机发送ROM命令和控制命令(转换温度)。等待1s之后,再去读数据。4、通过关开操作来读取数据。

2023-01-16 21:53:12 58

转载 DHT11温湿度传感器

一个完整的数据应该接收到84个跳变沿,公式如下图所示。那怎么计算脉冲之间的时间呢?可通过中断进行计算,后面的时间减去前面的时间。如果高电平在26~28ms之间,那么是0,高电平大于70ms,则是1。如下图所示,主机先发出一个低脉冲信号告诉模块(最小18ms),在拉高信号,模块收到信号后在进行回应。回应之后,在发送数据,数据由下面的四十位组成。

2023-01-16 13:40:53 574

转载 5、步进电机

定子之间的角度为45°,转子之间的角度为60°。如下图所示,(1)当B导通时,3号转子正对B号定子。(2)当B断开时,A导通,A号定子吸引2号转子,转子顺时针转动15°。(3)以此类推,A号定子断电,D号转子导通,又顺时针转动15°。gpio输出为两个1,两个0时,转子转动7.5°。由于电机的电压太大,开发板不能直接接通到电机,所以在中间加入了驱动板。开发板引出四根控制线控制驱动板,驱动板在引出四根线控制电机。相反的,当想要步进电机逆时针转动时,将上面的顺序颠倒。按照逻辑真值表,来处理驱动板的输入输出值。

2023-01-16 13:38:57 144

转载 Ubuntu中VScode的操作

在make的前面加上bear,就能得到compile_commands.json,这个文件记录了make过程中他所编译的所有文件。clangd就是根据这个文件,解析目录,生成索引。索引在.cache/clangd/idex/目录下。方便好用的前提(Ctrl+鼠标点击就能跳转):clangd插件 解析目录,生成索引。

2023-01-14 13:07:12 269

原创 Linux安装pycharm

4、进入/home/book/pycharm-community-2022.3.1/bin。Python程序和里面的文件要求在一个文件夹中。3、解压pycharm,解压就安装了。4、查看Python3安装的位置。5、在./pycharm.sh。5、在pycharm中配置环境。1、查看Python3的版本。7、直接运行Python程序。1、登录MObaXterm。2、安装Python3.6。一、pycharm安装。2、上传pycharm。二、Python安装。

2023-01-08 15:20:13 275

原创 centOS:postfix+dovecot搭建邮件服务器(邮件域外发送)

3、vi /etc/postfix/main.cf //配置main.cf。邮件服务器与其它程序协同工作用以组成有时被称作消息系统的内容。消息系统包括了所有必要的应用程序来保证电子邮件按照应有的路径传送。当你发送电子邮件消息时,你的电子邮件程序,如Outlook或Eudora,发送消息到你的邮件服务器,它再依次发送到其它邮件服务器或同一服务器的保存区,过后再发送出去。作为一个规则,该系统使用SMTP(简单邮件传送协议)或ESMTP(扩展SMTP)来发送电子邮件,使用POP3(电子邮局协议3)或IMAP(因

2023-01-06 23:35:37 1824

转载 4.3_内核目录里编译驱动

1、如下图,如果划红线部分为y,表示把后面这个驱动程序编进内核里面去,成为内核映像的一部分。如果为m,就不会编译进内核映像里,将会称为一个ko文件。3、怎么使变量和文件产生联系通过,编辑内核里面的Makefile。有些驱动程序要么编译进内核,要么编译成模块,可通过对之前的变量进行设置。内核目录的源码第一可以编译成.ko,第二可以编译进内核的映像文件里。3、配置内核成功后,编译有问题的话,一般是没有设置ARCH.2、布尔变量只有两个取值,要么“y”,要么“N”4、如果配置成m,make modules。

2022-11-18 17:50:50 154

转载 4.2_在内核目录外编译模块

上面图片make - C的“C”是指Changeddir。1、KERN_DIR的目录有问题;二、Makefile讲解。2、没有设置工具链;

2022-11-18 17:49:13 133

转载 4.1_LED驱动程序分析

这个“__user”是一个空的宏,那为什么要放一个空的宏在这里呢?起到提示用户的作用,表明这个buf是由用户传进来的,内核里面不可以直接访问这个buf。通过使用copy_from_user,将buf拷贝进val。

2022-11-18 17:47:57 76

转载 3.5_答疑

链接不是将各类.o文件放入内存,而是将.o文件打包到一起,并对用到的函数、变量等分别分配地址,然后生成一个文件。如下图所示,在a.o、b.o中定义全局变量int a 、int b,在main.o中定义函数f1,链接时,会将这些文件都分配一个地址,然后放到文件中。单片机只有main函数,链接的时候是哪个地址,烧写的时候就在哪个地址。对于多任务系统,同一个函数可能多次同时运行,所以得有多个位置,这些位置不是事先确定的,所以链接的时候用的虚拟地址,运行的时候用的物理地址。

2022-11-18 17:46:35 59

转载 3.4_class_create和device_create

驱动和应用联系:通过两个函数“copy_to_user”和“copy_from_user”2、驱动程序辅助信息(自动创建类和节点)驱动和硬件联系:虚拟地址等。1、驱动和其他的数据传输。

2022-11-18 17:45:41 175

转载 3.3_为什么需要虚拟地址

而在Linux芯片中,内存很大,加入几个程序同时运行如果没有内存映射,会使用新的地址去访问f1,会很麻烦,如下图所示。先介绍链接地址,在单片机系统中,每个函数在RAM/Flash中都有一个确定的地址,运行时对地址进行链接。

2022-11-18 17:44:15 225

转载 3.2_地址片选与虚拟地址的引用

如下图所示,在cpu与外设之间,有一个内存控制器,CPU将address的范围发送给内存控制器,然后内存控制器根据地址范围将对应的CSx设置为0,从而控制对应的外设。在单片机上用的是物理地址直接控制对应的外设,单片机CPU上有内存,称为SOC:system on chip。Linux芯片的硬件如下(注意Linux芯片有的有ARM,有的没有。问题: 如下图所示,为什么打印的值不同,而打印的地址相同?要解释这个问题,就要引用虚拟地址的概念。在MPU中,引用了虚拟地址的概念。

2022-11-06 21:48:18 188

转载 3.1_驱动辅助信息及地址空间概念

如下图所示,驱动和应用之间通过“copy_to_user”和“copy_from_user”进行数据传输。通过ioremap,将物理地址映射为虚拟地址。3、软件层 argc 和 argv讲解。2、驱动和硬件之间怎么进行数据传输?1、 驱动和软件怎么进行数据传输?

2022-11-06 21:46:55 69

转载 2.4_数据交互

open文件的时候,这个必须是一个节点,主设备号很重要,根据主设备号找到chrdevs[]中对应的那一项,进而找到对应的结构体。因为这个write函数是要提供给应用层去调用的,调用的时候要求这个函数的返回值是读取到数据的长度,这是系统调用接口函数的规定。3、Linux中echo本质是打开设备节点,然后写数据,cat本质是打开设备节点,然后读数据。1、如下图,为什么write函数的返回值要和copy_from_user中的那个长度一样。4、软件程序中,open怎么寻找驱动程序的?

2022-11-06 17:12:27 804

转载 2.2_入口出口细讲

入口函数在驱动装载之后就再也用不到了,所以可以在装载之后进行销毁,因此可以加上__init。如果驱动程序编进内核,就无法卸载,就无需出口,出口函数就无意义。加上__exit,就可以卸载了。1、在驱动程序中,打印用printk,在应用程序中,打印用printf。printk的信息先会存入kerBuf中,可以调用dmesg进行查看。3、任何一个驱动的入口函数都是init_module。4、驱动程序入口函数加__init的作用。5、驱动程序出口函数加__exit的作用。2、内核里的信息,用dmesg。

2022-11-06 17:09:59 121

转载 2.1_字符设备驱动回顾与数据流程

注:注册的本质就是将file_operation结构体放入数组chrdevs[]中。2、怎么写驱动程序套路。

2022-11-06 17:06:53 52

转载 1.4_深入答疑

在一个驱动程序中,一个函数的的入口函数是固定的,如下图示,调用init_module就相当于调用了hello_init。如果不使用module-init(hello_init)这个宏的话,可以把他注释,然后将入口函数命名为init_module。module-init(hello_init)将hello_init函数定义为一个入口函数,然后通过注册函数register_chrdev将设备号放入chardevs[]里面。以LED灯为例,主设备号表示灯这个驱动,次设备号表示不同的灯。2、次设备号起什么作用?

2022-11-06 17:05:38 88

转载 1.3_字符设备驱动程序框架

先确定是什么文件(类别),在确定主次设备号。要想解决怎么写驱动的问题,就先要找到驱动?

2022-11-06 16:59:57 49

转载 1.2_Linux应用程序与驱动程序的接口

硬件事件产生的就是硬件中断,软件事件产生的就是软件中断。SWI是硬件中断吗?怎么区分软硬件中断?驱动 = 框架 + 硬件操作。APP调用驱动流程图。

2022-11-06 16:58:09 89

转载 1.1_单片机程序与Linux程序的分层

(4)、根据R分辨原因,如R = val1,调用sys_open函数,R = val2,调用sys_read等。在里面首先会判断文件名,然后在找到对应的驱动,调用drv_open。1、为了效率更高,Linux开了一个后门,如下图划线所示,以后访问addr = mmap()的时候就相当于访问了指定的硬件地址,但是也得通过驱动程序。(2)、在某个寄存器R中设置某个值,并产生SWI异常;(1)、应用层在glib.c库中调用open函数;(3)、CPU调用内核中SWI异常处理函数;

2022-11-06 16:51:37 140

转载 Linux驱动程序的基础

使用poll 时,如果传入的超时时间不为0,这种访问方法也是阻塞的。使用poll 时,可以设置超时时间为0,这样即使没有数据它也会立刻返回,这就是非阻塞方式。概念:使用休眠-唤醒的方式等待某个事件发生时,有一个缺点:等待的时间可能 很久。比如调用read 读取按键时,如果没有按键数据则read 函数不会返回,它会让线程休眠等待。有2 个要素:时间、做事,换成程序员的话就是:超时时间、函数。概念:APP不休眠,驱动程序有数据时主动通知APP,APP 收到信号后执行信息处理函数。第五步,应用程序做事情。

2022-10-31 19:03:56 140

转载 Pinctrl与GPIO子系统

目录:一、Pinctrl子系统重要概念二、GPIO子系统重要概念三、基于GPIO子系统的LED驱动程序一、Pinctrl子系统重要概念引入设备树的概念以串口来举例:例子:imx6ull中的pinctrl:二、GPIO子系统重要概念举例:三、基于GPIO子系统的LED驱动程序顺序:图片见:16.3_基于GPIO子系统的LED驱动程序

2022-10-21 11:04:34 134

转载 Linux驱动_按键

这个__user是一个空的宏,放在这里表示用户态的buffer,在内核在驱动程序中不可以直接使用他,使用copy_to_user(buf,&level,1)来读它。poll方式:(针对休眠唤醒方式的缺点,出现了POLL机制,timeout时间过后,内核自己会把应用唤醒)注:应用程序打开驱动程序时,会传入一个标记:阻塞 、非阻塞(查询方式)、休眠、poll、异步通知。主设备号用来寻找驱动程序,次设备号(分辨哪一个按键)给我们使用的,自己想怎么使用就怎么使用。重要性:既是应用开发的基础,也是驱动开发的基础。

2022-10-20 23:06:25 189

转载 Linux驱动_驱动设计的思想(面向对象、设备树)

事实上,每一款芯片它的GPIO操作都是类似的,并且这跟主芯片相关,因此就可以针对该芯片写出比较通用的硬件操作代码。如果硬件很多,导致相对应的.c文件很多,造成内核臃肿。因此引入设备树,将硬件的设置文件不放在内核的.c文件中。先后比较1、2、3。如果1不行,就比较2,2不行就比较3.一般2、3用得比较多。一、Linux驱动_驱动设计的思想(面向对象_分层_分离)1、传统方法的缺点如下,于是引用了设备树,使用配置文件。四、LED模板驱动程序的改造_总线设备驱动模型。1、2、3、4部比较过程具体见文件说明。

2022-10-20 18:05:54 309

转载 驱动-IMX6ULL LED

如下图所示,在编译器中,编译器可能会自作聪明,只执行a=2。但在硬件中,不能这样,假如a=1为使灯亮,a=2为使灯灭。而在Linux系统中,驱动不是直接通过物理地址和硬件进行数据交换,而是通过映射虚拟地址和驱动进行交流。如下图步骤5还可以创建一个class,在class下游创建一个device ,步骤5为了让系统自动创建设备节点,但不是驱动的核心。如下图绿框所示,读取寄存器时,可以通过指针,直接将寄存器地址传给p,从而达到读取寄存器的目的。(3)、a&=~b的意思就是a=a&(~b)

2022-10-18 15:03:00 242

转载 嵌入式驱动开发(普适的GPIO操作方法)

你从GPIOx_DR 中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置GPIOx_DR 让它输出高电平并不会起效果。(4)、读GPIOx_DR 或GPIOx_PSR 得到某位的值(读GPIOx_DR 返回的是GPIOx_PSR 的值)(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了。(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了。

2022-10-17 16:21:43 422

转载 嵌入式驱动开发(普适的GPIO操作方法)

你从GPIOx_DR 中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置GPIOx_DR 让它输出高电平并不会起效果。(4)、读GPIOx_DR 或GPIOx_PSR 得到某位的值(读GPIOx_DR 返回的是GPIOx_PSR 的值)(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了。(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了。

2022-10-17 16:06:12 353

原创 驱动开发(hello驱动程序)

④ 把file_operations结构体告诉内核(根据主设备号在chrdevs[]“数组”中找到file_operations结构体),注册驱动程序:register_chrdev(major, 有个参数代表结构体)。"major"部分可以自己指定主设备号,也可以传入0,让内核给驱动程序分配主设备号;③ 实现对应的drv_open/drv_read/drv_write等函数,填入file_operations结构体。得有一个入口函数:安装驱动程序时,就会去调用这个入口函数。2、怎么编写驱动程序。

2022-10-15 20:57:53 502

转载 2022.09.27嵌入式Linux应用开发基础知识(韦东山补充笔记

对于“”的,搜索当前目录;对于的,搜索下面黄底的目录。三、交叉编译程序_以freetype为例。4、使用freetype显示单个文字。5、使用freetype显示一行文字。一、ASCLL字符的点阵显示。3、交叉编译程序的万能命令。二、中文字符的点阵显示。2、屏幕中显示一个汉字。

2022-09-27 23:21:40 126

转载 2022.09.26嵌入式Linux应用开发基础知识(韦东山补充笔记

UNICODE 仍然向下兼容ASCII,但是对于其他字符会有对应的数值,比如对于“中”、“笢”,它们的数值分别是:0x4e2d、0x7b22UNICODE 中的数值范围是0x0000 至0x10FFFF,有1,114,111 即100 多万个数值,可以表示100 多万个字符,足够地球人使用了。Framebuffer中保存着一帧图像的每一个像素颜色值,假设LCD的分辨率是1024x768,每一个像素的颜色用32位来表示,那Framebuffer的大小就是:1024x768x32/8=3145728字节。

2022-09-26 23:23:21 284

转载 2022.09.25嵌入式Linux应用开发基础知识(韦东山补充笔记)

如上面6.常用的编译方法中,虽然在test2中用-L、-l指定了链接的库,但是这不是运行时的库,运行和链接是两个不同的概念,因区别对待。下面这种直接编辑clean的操作是不正确的,如下面图2所示,当创建一个clean 的文件时,就不会执行“clean”的操作。一般情况下,我们常说的编译包括:预处理、编译(代码错误是在此阶段发现的)、汇编三部分,有时候又包括:预处理、编译、汇编、链接四部分。2、在编译的时候加上- v 他会列出去查找编译时候的步骤,如:gcc -c -o main.o main.c -v。

2022-09-25 17:44:28 567

转载 IMX6ULL_Pro开发板基本操作(韦东山学习笔记)

1、配置编译:内核、设备树、其他驱动程序。为什么编译驱动程序之前要先编译内核?IMX6ULL_Pro烧写系统。3、编译、测试第1个驱动。

2022-09-23 16:11:19 399

空空如也

空空如也

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

TA关注的人

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