自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 硬件驱动——驱动(4)(platform总线架构)

相比于I2C,SPI这些有实际物理总线的硬件,芯片上面有一些外设之间没有通过总线连接,比如ADC,网卡,如果我们想将这些硬件驱动也通过这种模型设计完成,内核设计者们为我们设计了platform总线架构,也称为虚拟平台总线。设备端包含了物理平台寄存器信息及中断信息,这部分信息目前位于设备树中,内核自动将其转换为platform_device类型,总线负责将设备与驱动进行匹配,匹配成功执行驱动中的probe函数指针指向的接口来加载驱动。驱动:通过总线与设备按照规则匹配后,拿到设备信息,并进行对设备的操作。

2025-10-09 23:06:56 398

原创 硬件驱动——驱动(3)(中断系统)

中断是指CPU在执行程序的过程中,出现了某些突发事件等待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。

2025-10-04 18:40:04 854

原创 硬件驱动——驱动(2)(GPIO子系统)

Linux内核中pinctrl子系统已经实现,我们只需使用即可controller(一种引脚方案的定义和实现)和client(使用某种引脚定义方向)4.在对应的putekey节点中引用该方案二.GPIO子系统1.在设备中指定节点使用的GPIO引脚编码,格式如下:2.在驱动中编写代码:①通过of_get_named_gpio来获得设备中配置的GPIO引脚编号②通过gpio_request注册该引脚被占用③通过gpio_direction_input/output设置GPIO的

2025-10-01 16:23:51 365

原创 硬件驱动——驱动(1)

在驱动代码对应的Makefile中加入编译规则 obj-$(CONFIG__XXX)+= hello.o。对应配置项的CONFIG__XXX会加入.config文件中 CONFIG_XXX = m。1.alloc_chrdev_region:让系统分配主设备号,并占用出设备号开始的前n个设备编号。②动态编译:将驱动代码以模块的方式编译,动态加入内核或者从内核中去除。设备号=主设备号(设备类型)+ 次设备号(该种设备类型的第几个设备)在合适的内核目录下编写驱动代码hello.c。

2025-10-01 16:00:25 929

原创 硬件驱动——I.MX6ULL裸机启动(4)(时钟设置和EPIT定时器设置)

这里的时钟指的是系统运行的频率,我们通常所讲的主频,其实指的就是内核运行程序时的速度问题。IMX的时钟是分离出多个不同的时钟出来,分别加以处理。产生出多路不同频率时钟以提供给不同的外设使用,这个概念称为时钟树,这是因为无论哪种Soc通常都是由一个Soc外部的晶体振荡器提供最基本的频率,之后通过Soc内部复杂的电路进行分离的,形式上很像一棵树的样子,所以被称为时钟树。PLL:锁相环,是一种电路,简单来说就是用来倍频的特殊电路。PLL可以把一个低频升到较高的一个频率了。

2025-09-23 23:35:26 930

原创 硬件驱动——系统移植与环境搭建

uboot启动阶段:(1)自搬移到高地址(2)初始化硬件外设:UART,i2c,网口,EMMC(3)进入用户交互系统,等待用户输入回车(4)没有输入回车执行bootcmd(5)找到zImage和dtb文件(6)bootz加载内核和设备树文件,将bootargs写入设备树choosen节点,并通过r2将设备地址传给内核。linux内核的任务:(1)内存管理MMU(2)任务管理(3)网络管理(4)任务间的通信(5)文件系统的管理。(2)DDR(512M):内存,掉电数据丢失,读写速度快。

2025-09-23 23:10:08 1404

原创 硬件驱动——I.MX6ULL裸机启动(9)(RGBLCD相关设置)

液晶显示器.是现在最常用到的显示器,手机,电脑,各种人机交互设备等基本上都用到了LCD,最常见就是手机和电脑显示器。我们这里所提及的LCD不包括触摸功能,触摸功能是通过另外的设备实现的,LCD在这里只是输出设备。LCD的原理:LCD的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目标。

2025-09-22 23:14:18 2261

原创 硬件驱动——I.MX6ULL裸机启动(8)(SPI相关设置)

1在SPI当中有且只有一个主机。SPI是一种串行外设接口,主要应用于EEPROM,FLASH,实时时钟。AD转换器,还有数字信号处理器和数字信号解码器之间。是一种高速的,全双工,同步的串行通信总线。2.时钟信号线。与i2c类似的,所有设备都需要时钟信号线进行同步,该信号由主机负责提供。主出从入,相当与主机的数据发送线主入从出,相当于主机的数据接收线片选信号,与i2c不同,SPI设备没有所谓的从机地址,连接在总线上的设备通过CS片选信号选择。

2025-09-19 00:08:39 1108

原创 硬件驱动——I.MX6ULL裸机启动(7)(ADC相关设置)

1.模拟信号一般是指连续变化的电压信号,其数值在一定范围内变化。而数字信号是由一系列练得数字表示,只能取有限的值,通常以二进制形式表示2.ADC的工作原理是将模拟信号分割成一系列离散的取样,并将每个取样值转换为相应的数字表示。这个过程涉及到两个主要步骤:采样和量化3.采样:ADC将连续变化的模拟信号在一定时间间隔内进行取样。取样频率决定了每秒采集的样本数,通常以赫兹表示,采样过程通过保持并测量模拟信号在每个采样时间点的电压值来实现。4.量化:采样得到的连续模拟信号经过量化转换为数字形式。

2025-09-17 23:59:25 2129

原创 硬件驱动——I.MX6ULL裸机启动(6)(i2c相关设置)

i2c通信主机时芯片与芯片之间,为半双工的通信方式i2c连接方式为两根线SDA(数据线),SCL(时钟线),时钟线的作用是统一收发速率的电路设置应注意的问题:在SDA和SCL两条线上必须装两个上拉电阻(4.7~10kΩ),上拉电阻越小越强上拉电阻的作用是:保证SCL和SDA都在释放总线时,让SDA保持高电平。

2025-09-17 23:59:10 934

原创 硬件驱动——I.MX6ULL裸机启动(3)(按键设置及中断设置

1.GIC:(Generic Interrupt Controller)通用中断控制器,是ARM架构中用于管理中断的核心模块,主要用于现代多核处理器系统。它负责接收,分发并分发中断请求,减轻CPU负担,使其专注于计算任务。目前GIC有四个版本,V1~V4,现在只有V2~V4正在大量使用,IMX6ULL搭载的是V2的GIC控制器。2.协处理器是一种专门用于辅助CPU执行特定任务的硬件模块,通过分担CPU的运算负荷来提升系统整体效率AMR Cortex A7内核配备了16个协处理器。

2025-09-16 22:43:32 1329

原创 硬件驱动——I.MX6ULL裸机启动(2)

SECTIONS.text : { ... } // 代码段.rodata ALIGN(4) : {*(.rodata*)} // 只读数据段.data ALIGN(4) : {*(.data)} // 已初始化数据段.bss ALIGN(4) : {*(.bss) *(COMMON)} // 未初始化数据段。

2025-09-11 22:47:28 642

原创 硬件驱动——I.MX6ULL裸机驱动(1)

本开发板是由正点原子提供的IMX6ULL-Mini。大多数情况下,一个嵌入式系统硬件部分包括核心板和底板两个部分。核心板主要是Soc所需的必要器件如RAM,NAND(eMMC)等器件组织在一起,这部分电路设计难度相对较大。底板部分通常是由集成商设计。二者通过接插件连接起来。这样的设计大大降低了开发难度,节约了开发时间。

2025-09-11 10:27:21 211

原创 硬件驱动ARM内核以及汇编程序的编写(2)

arm体系采用的方案是满减,但是在进行操作之前,我们必须告诉2440栈底的位置,这里我们把栈底设置为0x40001000,从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。事实上,程序跳转工作更多的是为了实现类似函数的功能,此时lable就是函数的函数名,其实lable本身代表的就是待跳转那一行指令的地址,b指令本质上就是把待跳转那行的地址装入pc寄存器,但是函数在调用完毕之后要回到调用处的下一行指令处执行,为了能够回到调用的下一行,需要使用bl指令。

2025-09-09 23:17:04 1393

原创 硬件驱动ARM内核以及汇编程序的编写(1)

ASR:算术右移(右移时保留符号位(用最高位填充)) <n>立即数移位(移位的位数) LSL:逻辑左移(左移时低位补0) LSR:逻辑右移(右移时高位补0) ROR:循环右移(右移时移出的位循环填入高位)不同 ARM 架构的向量表地址可能不同(如 ARM9 默认从 0x00000000 开始),每个异常的向量地址固定(如复位向量在 0x00,IRQ 向量在 0x18),确保异常能被快速响应。:A系列:application(应用)手机电脑。

2025-09-08 23:31:00 1161

原创 硬件驱动C51单片机——裸机(1)

重点:名词解释必须背过。

2025-09-03 22:22:26 437

原创 项目设计文档——web信息查询项目

解决方法:通过重新复习数据库当中的相关函数,在发送页面将请求报文的正文解析出来,在获得自己想要的部分传递给数据库,数据库通过传来的变量在数据库当中进行查找。web商城信息查询能够帮助学生理解网络通信,数据结构等概念,C语言的高效性和低资源占用特性适合处理高并发查询请求,尤其是在资源受限的嵌入式场景当中。结合C语言与web技术当中的http协议,sqlite3数据库,socket编程,服务端的io多路复用,实现从底层到应用层的完整开发流程。3.在查找商品的详情信息时使用的名字进行定位,一直定位不出来。

2025-09-03 00:24:29 561

原创 Linux下的软件编程——数据库

数据存储:变量,数组,数据存储结构 ------->内存:掉电或者程序运行结束,数据丢失文件 -------->硬盘:掉电或者程序运行结束,数据不丢失数据库,专业的存储数据的结构 ------>硬盘:掉电或者程序运行结束,数据不丢失。

2025-08-29 23:44:18 701

原创 Linux下的软件编程——网络编程(tcp并发服务器创建)

单循环服务器:服务端同一时刻只能处理一个客户端的任务并发服务器:服务端同一时刻可以处理多个服务端的任务。

2025-08-27 22:00:28 628

原创 项目设计文档——爬虫项目(爬取天气预报)

解决方法:通过第一次先解析到外层的JSON数据,然后再依次往里面进行解析,其相应报文中的数字,汉语,字母等都是字符串类型的要用valuestring。解决方法:在一个JSON数组当中转换字符串应该先获得该数组的大小,然后进行循环,利用item进行获取数组,再获取数组当中想要的数据。综合使用了学习到的网络的TCP协议,套接字编程和http协议,与网络服务端建立相关的联系,从网络网址当中爬取自己想要的相关数据。3.在将回复的响应报文保存到文本当中后,不知道怎么将文本当中的数据读到cjson当中。

2025-08-26 21:45:18 438 1

原创 Linux下的软件编程——网络编程(http)

HTTP协议位于应用层,超文本传输协议。

2025-08-25 19:11:18 232

原创 Linux下的软件编程——网络编程(tcp)

重点:1.UDP和TCP区别2.TCP三次握手和四次挥手3.TCP粘包问题及解决办法4.TCP客户端和服务端的编程流程TCP:传输层传输控制协议(流式套接字)

2025-08-25 00:45:20 2965

原创 Linux下的软件编程——网络编程(udp)

不同主机,进程间通信。

2025-08-22 20:03:03 798

原创 Linux下的软件编程——IPC机制(信号和共享内存)

1.信号:实现进程间的通知机制实现进程间的异步通信软中断异步通信:接收方不知道什么时候发送方会发送数据。

2025-08-19 20:31:42 896

原创 Linux下的软件编程——IPC机制(管道)

1.创建无名管道:pipe() pipefd[0]——>读端。4.关闭管道:close()无名管道的:读端:pipefd[0] 写端:pipefd[1]4.管道破裂:读端关闭,向管道中写入数据,发生管道破裂(异常)1.写阻塞:读端和写端都存在,向管道中写数据,当管道满时,发生写阻塞。2.读阻塞:读端和写端都存在,向管道中写数据,当管道为空,发生读阻塞。3.读返回0:当写端关闭,从管道中读数据,若管道中有数据,则读到数据。

2025-08-18 19:24:28 851

原创 Linux下的软件编程——多任务(线程)

轻量级的进程,可实现多任务的并发。

2025-08-15 19:33:09 544

原创 Linux下的软件编程——多任务进程

应用程序 可执行程序 CPU硬盘 硬盘 内存程序和进程的区别:程序:静态的数据集合,存储在硬盘空间当中,程序运行起来可以产生进程;一个程序可以产生多个进程。进程:是一个程序动态执行的过程,需要消耗内存和CPU。一个进程中执行多个程序。进程具有生命周期,从产生到调度再到消亡。

2025-08-14 19:12:28 874

原创 Linux下的软件编程——framebuffer(文件操作的应用)

UI技术:User interfaceframebuffer:帧缓冲,帧缓存技术linux内核专门为图形化显示提供的一套应用程序接口。

2025-08-14 17:16:46 398

原创 Linux下的软件编程——文件IO

文件IO的打开方式:O_RDONLY:只读方式 O_WRONLY :只写方式 O_REWR:可读写方式 O_CREAT:创建文件 O_TRUNC:清空文件 O_APPEND:追加写。(3)文件关闭刷新(4)缓冲区满刷新。

2025-08-12 19:38:23 1087

原创 Linux下的软件编程——标准IO

Linux下的软件编程:1.文件操作—> 一切皆文件 2.多任务—> 进程,线程3.网络编程 4.构建网络服务器5.数据库。

2025-08-10 20:19:41 631

原创 数据结构——重点

数组和链表是两种基本的数据结构,它们在内存管理、访问方式和操作效率等方面存在显著差异。以下是两者的主要区别:1. 内存分配方式‌‌:在内存中需要‌‌存储所有元素。创建时需要预先确定大小,一旦分配后大小固定(静态数组)。‌‌:元素可以分散存储在内存中的‌‌,通过指针连接各个节点。内存分配是动态的,可以随时扩展或缩减。2. 访问效率‌‌:支持‌‌,通过下标可以直接访问任意元素,时间复杂度为O(1)。‌‌:只能‌‌,需要从头节点开始遍历到目标位置,平均时间复杂度为O(n)。3. 插入与删除操作‌。

2025-08-08 20:18:05 823

原创 数据结构——二叉树

例如,第1层(根节点)有1个节点,第2层最多2个节点,第3层最多4个节点。思想:先选取一个基准值,然后将比它大的排到右边,比它小的排到左边,在进行递归调用,‌:若终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1。中序:左根右,先从根开始(不是先访问根)从左开始访问,再访问根,再访问右结点。后序:左右根,线从根开始(不是先访问根)从左开始访问,再访问右,再访问根。思想:将相邻的元素进行比较,内部循环一次,最大的树到最后一个。前序:根左右,先访问根然后访问左,再访问右。

2025-08-08 20:06:34 338

原创 数据结构——哈希表(散列表)

存储数据时,通过对应的哈希函数可以将数据映射到指定的存储位置,查找时。哈希冲突/哈希矛盾:key1!= key2 f(key1) = f(key2)哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系,这个关系称之为哈希。仍可通过该函数找到数据的存储位置。定义:提高数据的查找效率。

2025-08-07 20:12:09 414

原创 数据结构——内核链表,栈,队列

二级指针:1.在被调函数中,想要修改主调函数中的指针变量,需要传递该指针变量的地址,形参用二级指针。2.指针数组的数组名是一个二级指针,指针数组的数组名作为参数传递时可用二级指针接受指针数组,保存多个指针的数组。数组名:数组首元素的地址。

2025-08-06 21:22:47 776

原创 数据结构——Makfile与双向链表

^ : 所有依赖 $< : 第一个依赖 $@ : 生成的目标。4.链接:处理多文件及函数的链接关系。Makefile的语法:gcc main.c fun.c -o a.out -I$(INC) -L$(LIB)依赖文件:main.c fun.c。-L:指定使用到的库所在的位置。-I :指定头文件所在的位置。时间戳:在编译代码时,只编译修改后的源文件,其他没有修改的,只进行链接即可。Makefile:用来管理代码的编译和链接。Makefile中的变量:1.自定义变量。

2025-08-05 20:58:23 883

原创 数据结构——单向链表与网络配置

【代码】数据结构——单向链表。

2025-08-04 23:34:41 366

原创 数据结构——数据结构概念以及单向链表

散列结构(哈希结构):将数据的存储位置与数据元素之间的关键字建立起对应的关系(哈 希函数),根据该关系进行数据存储和查找。线性关系:数据元素与元素之间一对一的关系(存储在数组中的数据)->(顺序表,链表, 队列,栈)数据在内存当中如何存储 (1)变量 (2)数组(顺序表)b.插入和删除元素方便。图形结构:数据元素与元素之间多对多的关系(网状结构)

2025-08-03 22:47:15 623

原创 C语言——结构体,共用体和位运算

(1)如上面已经定义了一个结构体类型struct student,可以用它来定义变量。例如:struct student student1,student2。在定义了变量之后系统会为其分配内存单元(2).在声明类型的同时定义变量int id;它的作用与第一种方法相同。(3).直接定义结构体类型变量其一般形式为:struct成员表列}变量名表列;结构体类型:类型与变量是不同的概念,只能对变量赋值,存取或运算,而不能对一个类型进行赋值,存取或运算。

2025-07-31 23:51:30 930

原创 C语言——指针(4)

标准函数 int main(int argc,char **argv)利用指针的指针对字符串进行遍历,逆序,选取最大的字符串,进行排序,在堆区中动态内存分配,利用malloc函数和realloc函数。char **argv 表示字符型数组当中有argc个元素。函数指针:指针数组作为函数的参数,形参是指向指针的指针。在一维整形数组当中进行动态内存分配。利用函数的回归调用来根据需求选取元素。double 类型的。

2025-07-30 22:25:02 199

原创 C语言——指针(3)

strcpy函数与memcpy函数的区别: memcpy函数是一个用于内存复制的函数,它不仅限于字符串,它可以复制任何类型的数据;在指针前无法通过该指针改变它所指向的变量。void *p: 万能指针 但是不能做指针运算。数组指针:int (* p)[10];两数相等: 1.值相同 2.在内存中是同一个东西。二维数组作为函数参数传递,形参是一个指向一维数组的指针。const: 在普通变量前面是只读变量。指针函数:返回值为指针的函数。

2025-07-29 19:19:06 290

空空如也

空空如也

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

TA关注的人

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