- 博客(66)
- 收藏
- 关注
原创 单向链表、双向链表、栈、队列复习(7.14)
1、数据结构:相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构:集合,所有数据在同一个集合中,关系平等。线性,数据和数据之间是一对一的关系树, 一对多图,多对多物理结构(在内存当中的存储关系)顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致。需预先分配空间,大小固定。插入删除需移动大量数据。可以通过下标直接访问指定数据链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。不需要预先分配,大学可变,动态分配。新节点插入删除容易。
2025-07-15 00:08:05
338
原创 I2C集成电路总线
设备之间的通信都是由主设备发起的,从设备被动应答主设备。设备地址类似一个人的名字,因为在I2C总线通信过程中,无论哪个设备发送数据,其他所有设备都能够监听得到,所以每次通信时,主设备先发送要访问的子设备地址,每个子设备都把监听到的这个地址拿来跟自己进行匹配,只有匹配成功的子设备才是真正需要操作的设备。最后一个寄存器就是 I2Cx_I2DR,这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器,注意此时LSB代表的是数据流向,需要按照实际情况设置为1或者0;
2025-07-11 21:47:44
635
原创 【无标题】
2、阻塞io wait_event + 中断(wake_up)4、多路复用io poll事件加入等待队列,中断(唤醒等待队列)platform_device设备,自己注册平台信息 / 设备树文件直接转换为平台信息。platform_bus_type总线(linux内核写好了,我们写另两个)1、中断顶半部:完成基本中断响应。总线通信:串口、usb、i2c、spi、pcie。一、内核定时器(依赖于中断底半部,软中断机制)2、中断底半部:完成耗时操作。
2025-07-10 17:21:44
224
原创 嵌入式自学(7.9)
misc_register:注册混杂设备,主设备号10,次设备号每增加一个设备加一。驱动分层:misc混杂设备:如led、beep就可以放进去,不需要自己构建设备。 device_create_file创建设备调试节点。5、进程状态:运行态、睡眠态(可中断、不可中断)、僵尸态、暂停态。alloc_chrdev_region//构建设备号范围。cdev_add//添加到cdev内核结构。device_create_file 创建调试节点。cdev_alloc//申请cdev。
2025-07-10 09:14:19
378
原创 linux内核两大思想:驱动和设备分离思想、分层思想
由于Linux系统设计的初衷是在不同的平台上都能运行Linux系统,如果按照之前的驱动写法,每个硬件平台由于寄存器不同,我们需要编写不同的驱动代码以适配对应的硬件平台,这个对我们来说过于麻烦,所以我们想把适用于所有平台的通用代码与只能运行在专一平台的专用代码进行分离。不同硬件平台最大的区别在于寄存器,而每个硬件平台都需要完成对LED灯的点亮和熄灭操作,所以每次最好将硬件平台的寄存器信息传递驱动,然后驱动拿到硬件平台的设备信息,再针对此设备进行操作,即设备与驱动分离思想。
2025-07-08 17:53:09
867
原创 字符设备驱动框架和sys文件----led灯驱动(7.5-7.7)
它提供了一种统一的接口,用于查看和操作设备、驱动程序、文件系统等内核对象。sysfs存放在内存中,挂载在/sys目录下,文件系统中的文件不对应硬盘上任何文件。1. 设备信息显示:将内核对象(设备、驱动、总线等)的属性以文件形式展示在/sys目录下,例如设备状态、配置参数、硬件拓扑等。2. 动态设备管理:实时反映系统设备变化(如热插拔),目录结构随设备增删动态更新支持设备分类。*字符设备驱动加载到Linux内核方式:静态加载和动态加载。,编译到内核中, Linux内核启动后直接拥有了该内核模块。
2025-07-08 00:18:16
1531
原创 u-boot编译及源码分析、linux内核编译及裁剪
bootcmd保存着uboot默认命令, uboot倒计时结束以后就会执行bootcmd中的命令。uboot是bootloader的一种,主要作用是在内核加载前对硬件设备初始化,并为内核的运行提供引导功能。V=0:控制编译输出的详细程度, 0表示启动静默/精简输出模式, 1表示完整的编译命令,便于调试。2. uboot图形界面是基于ncurses库编写的,所以需要先安装该库。生成的结果文件主要是位于uboot顶层目录的: u-boot.imx文件。1. 解压uboot压缩包,并进入uboot源码目录。
2025-07-06 17:32:09
670
原创 Linux系统移植(7.4)
昨日回顾:系统移植一、linux系统:1、u-boot 引导加载内核 2、zImage 内核镜像 3、.dbt设备树文件 4、rootfs 文件系统二、硬件资源:im6xull 芯片内部:96k rom(原厂启动代码)、 128k ram(在DDR初始化前为系统提供运行空间) cache(i、d、L2) 芯片外部
2025-07-06 15:54:50
690
原创 Linux内核驱动(前言、工程环境搭建及linux系统移植)(7.3)
驱动开发难点:1、c语言基础 2、工程环境搭建(脚本、makefile、apt-get软件下载工具、网络配置) 3、编程思想(多年优化后的源代码可能难理解,一些编程框架理解起来困难) 4、数据结构(内核链表高集成度不熟悉) 5、硬件操作、通信调试方法(逻辑分析仪使用、芯片手册阅读、内存泄漏调试、栈崩溃调试)可以把bootloader看作一个软件、代码等,即uboot.bin,完成硬件初始化、引导内核启动、给内核传参(比如各种需要的文件在哪)。
2025-07-03 23:39:35
1305
原创 时钟(6.25-26)
1、PLL1的设置, PLL1又称ARM_PLL,这个PLL的设置是通过寄存器CCM_ANALOG_PLL_ARMn来设置的(第714页)下图。我们之所以要设置AHB_CLK_ROOT 、 IPG_CLK_ROOT和PERCLK_CLK_ROOT的时钟,是因为我们之后的外设实验需要使用这三个时钟,从时钟树图中可以看出: IPG_CLK_ROOT和PERCLK_CLK_ROOT分别给ADC和I2C外设提供时钟,这两个外设是我们之后要学习的重点,而这两个根时钟又是由AHB_CLK_ROOT 提供时钟的。
2025-07-02 23:16:40
1075
原创 imx6ull芯片中断机制6.24-6.25
此外GIC还有一个GICC_EOIR寄存器,当我们处理完中断之后,要通知GIC我们已经处理好中断了,否则, GIC会认为中断未处理,还会再次触发中断处理,我们通常把这个过程称为清除中断标记,只不过这里清除的是GIC的中断标志。由于不同的中断源对应不同的中断处理函数, I.MX6U 有 160 个中断源,所以需要 160 个中断处理函数,我们可以将这些中断处理函数放到一个数组里面,中断处理函数在数组中的标号就是其对应的中断号。6、当多个中断到来的时候,选择优先级最高的中断通知给 CPU Core。
2025-07-01 23:41:04
977
原创 adc模数转换器
一般采用逐次逼近法的ADC会先拿采用电压Vadc跟基准电压Vref的1/2进行比较,如果Vadc>Vref,则结果为1,否则结果为0。比如一个比较了8次的ADC外设,它就称为8位ADC,其结果是0~255之间的一个数值,设该数值为n,那么实际电压就是Vref * (n/255)。➢ I.MX6ULL的时钟源可以是igpclk、 igpclk/2和ADACK,其中ADACK是I.MX6ULL内部提供的时钟源,只能提供给ADC外设使用,这样做的目的是保证系统处于低功耗状态时, ADC依旧能够运行。
2025-07-01 17:06:27
746
原创 LCD驱动编写
LCD 显示器都是由一个一个的像素点组成,像素点就类似一个灯(在 OLED 显示器中,像素点就是一个小灯),这个小灯是 RGB 灯,也就是由 R(红色)、 G(绿色)和 B(蓝色)这三种颜色组成的,而 RGB 就是光的三原色。我们的计划是这样的:选通PLL5作为时钟源是肯定的,这里先把PLL5的倍频因子设置为42,那么从PLL5输出的频率就是1008MHz,之后在2这个位置4分频,再在3这个位置8分频,那么结果为1008/4/8=31.5MHz,最后再把4这个位置选通就OK了。
2025-06-30 20:25:24
896
原创 uart串口通信(6.26)
CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的时候UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为80MHz。我们需要1分频,即为b101。
2025-06-29 22:08:18
782
原创 利用imx6ull板学习裸机arm板开发(6.22-6.24)
一、代码编写编译环境:代码编写:在windows下载一个vs code编写源码,通过FiliZilla软件上传到ubantu,编译:在linux的ubantu终端编译。具体步骤: 1、在https://www.filezilla.cn/download下载FileZilla,FileZilla作为客户端, Ubuntu作为服务端。此外还需要在Ubuntu下安装SSH服务器: sudo apt-get install vsftpd ,并配置文件: sudo vi /etc/vsftpd.conf
2025-06-29 18:08:39
1578
原创 spi `
mosi主出从入 miso主入从出 sclk时钟同步 cs片选信号:低电平有效。分辨率+-1024 量程 +-16g 速率1000`数据流结构体:设备地址、寄存器地址、寄存器长度、数据、总长度。cpha:时钟相位,0第一个边缘到来采样,1第二个边缘采样。cpol:时钟极性,当spi空闲时的电位0低电平,spi:同步串行全双工通信。spi速率:400mb。
2025-06-28 15:58:11
199
原创 利用汇编代码编写启动文件,实现main.c文件跳转(6.19-6.21)
8bit 常数范围(0~255),位移的步进值是以2为单位(即实际位移 2 * rotate 位),可以表示循环有以(0~30)偶数位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30。事实上,程序跳转工作更多的是为了实现类似函数的功能,此时lable就是函数的函数名,其实lable本身代表的就是待跳转那一行指令的地址,b指令本质上就是把待跳转那行的地址装入pc寄存器,但是函数在调用完毕之后要回到调用处的下一行指令处执行,为了能够回到调用的下一行,需要使用bl指令。
2025-06-27 11:04:43
1333
原创 嵌入式自学四十八天
Prescale: 预分频器 降频 Fin/m = Fout。时钟开了后,先到时钟根产生器,对时钟频率更改,用于不同外设。PLL:锁相环电路 倍频功能:Fin*n = Fout。PFD:相位分子分频器 Fin *n/m = Fout。/n 表示分频因子二进制位数。0表示原样,1表示二分频。
2025-06-25 21:50:08
185
原创 嵌入式自学第四十七天
gic:通用中断控制,最多连8个内核,每个内核最多对应1020个中断源,12-31PPI:私有中断。0-15 SGI:软件产生中断 32 - 1019 SPI:共享中断,外设中断。[13] v:保存异常向量表基地址0,可通过VBAR寄存器修改基地址。组优先级:x xxxx,最高位是组优先级,后面是选择优先级,0最高。arm设计:gic控制器:屏蔽中断、检测中断优先级。中断在0x87800000,_get_协处理器:cp0-cp15用于协助内核工作,中断处理函数需要参数,代表中断源编号。
2025-06-25 09:56:31
174
原创 嵌入式自学第四十六天(6.24)
bss ALIGN(4) : {*(.bss) *(COMMON)} // 未初始化数据段。.data ALIGN(4) : {*(.data)} // 已初始化数据段。// 显式初始化为0的全局变量。// 未初始化的非静态全局变量。.rodata ALIGN(4) : {*(.rodata*)} // 只读数据段。.text : { ... } // 代码段。// 初始化为非零值。- `.rodata.cst4`:4字节常量(如float类型的常量)
2025-06-23 17:30:34
441
原创 嵌入式自学四十五天
空增(Empty Increment)和空减(Empty Decrement)通常指在栈或队列操作中,指针先移动再执行读写操作。mrs:MRS指令用于将特殊寄存器(如CPSR或SPSR)的值读取到通用寄存器中,常用于状态检查或模式切换前的备份。msr:MSR指令与MRS相反,用于将通用寄存器的值写入特殊寄存器(CPSR/SPSR),通常用于修改处理器状态。stmfd指令:保存多个寄存器用满减,不加!,{r0 - r12,lr}CPSR是ARM架构中的当前程序状态寄存器,用于存储处理器的状态和控制信息。
2025-06-23 08:58:58
312
原创 嵌入式自学第四十四天
1、RAM分类:sram(static ram)用晶体管存储0、1。速度快,成本高,存储密度低。dram(dynamic ram)动态存储,用电容充放电存储0,1。功耗大,需要外接刷新电路,读写速度低于sram。成本低,存储密度大。sdram(synchronous dram)增加了同步电路,提高dram的数据读写速度。ddr ram(全称ddr sdram即double data rate sdram),为sdram的下一代。目前已发展到ddr5。
2025-06-20 17:27:19
474
原创 【无标题】
8051架构、x架构(CISC复杂指令集计算机)、arm架构(RISC:简单指令集计算机)。CPSR:当前程序状态寄存器:描述当前内核状态。cisc机器指令复杂:桌面、大型、费电,80%情况下只能用到20%功能。M 单片机。MMU:内存管理单元。内存映射:虚拟地址,提高物理内存使用效率。寄存器、缓存、主存、磁性缓存、磁盘、磁带、光盘。LR:链接寄存器 保存函数返回地址等。SPSR:保存SPSR状态信息。冯诺依曼架构:数据指令存一块。打开指令缓存,关闭数据缓存。dram动态,,,,,电容。
2025-06-20 09:20:45
299
原创 【无标题】
51单片机拉高电压,释放总线,总线的电压就由18b20的电压决定。开始处于释放状态,主机低电位一段时间,ds一段时间后释放。读暂存存储器,温度转换(44h)、读暂存(BEh),当电流不足时,减小电阻,增加电流,保证双方。上拉电阻保证双方释放总线后,电平是高电平。上拉电阻:在总线接上一个电阻。
2025-06-19 15:08:01
173
原创 嵌入式自学第四十二天
在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。内部RAM容量有限(通常为256字节),而外部RAM可扩展至64KB。通过xdata声明变量,可以避免内部RAM空间耗尽。在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。
2025-06-18 21:26:03
776
原创 嵌入式自学第四十一天
定时器中断高于外部中断。最大65535,溢出后中断。中断处理:当cpu处理程序时,有另一个任务到来,cpu立刻运行另一个。定时器:里面有自增型计数器。给计数器一个初值,来达到定时中断的作用。为了消影,可以加个初始化,为了完全导通二极管,可以加个延时。中断向量表vector,一个指针数组,保存中断函数地址。51单片机晶振主频:12MHz 、11.0592MHz。中断允许IE:TCON ET0:1 EX0:1。2、cpu检测是否响应中断及中断源是否被屏蔽。每个寄存器有一个地址,可通过地址访问。
2025-06-17 19:10:34
165
原创 嵌入式自学第四十天
:按位与,用途:指定位清零,其他位不变。可以看到四组这个,对应32个引脚,这就是芯片内部四个八位寄存器:p0,p1,p2,p3。reg |= (1 << n) | (1 << m)p2:10010010八位,1为高电平,0为低电平,最低位是21号引脚。st89c51单片机。st89c52:半圆朝上,左上角是1号引脚,右下角是21号引脚。二极管单向导电,竖线一边是负极,当负极是低电平,就导通。
2025-06-16 19:30:21
401
原创 嵌入式自学之网络编程汇总(6.3-6.6 ,6.9)
②监听性能不随着监听描述 符数的增加而增加,是O(1)的,不再是轮询描述符来探测事件,而是由描述符主动上报事件;④ select返回-1表示错误,返回0表示超时时间到没有监听到的事件发生,返回正数表示监听到的所有事件数(包括可读,可 写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。*2、作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。
2025-06-12 16:06:45
1606
原创 数据库学习第一天(6.10)
sqlite> insert into user3 (NULL,'李四',23,datetime('now',‘+8 hours’));///删除id=1 的数据;2、标准SQL语句:===》通用语法在其他平台可以直接使用。////select。///删除表中所有数据。===>用sqlite3 来打开一个名称为test.db的本地数据库。
2025-06-10 17:43:28
842
原创 嵌入式自学第三十一天
文字可以通过字模工具获取要操作的像素点坐标数组,也可以通过字库进行操作,最原始的图像是位图,文件信息中前54字节是头信息,包含图像的大小等参数,剩下的就是连续了BGRBGR像素点数据,我们可以循环取三字节,再倒序就得到RGB参数了,然后输出。else if (vinf.bits_per_pixel == RGB565_FMT) // 16位色模式。si+=0.01) // 0-360度循环。if (vinf.bits_per_pixel == RGB888_FMT) // 32位色模式。
2025-05-29 19:09:50
536
原创 嵌入式自学第三十天(5.28)
v释放sem_post v释放信号量不阻塞+1 二值信号量。mutex互斥锁在进程pcb块,ret 为0说明别人在用,1说明空闲。初始化:int sem_init(,0线程用1进程用,1);请求与保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放。定义:pthread_mutex_t mutex;初始化:man pthread_mutex_init。不剥夺条件:进程以获得的资源,未使用完不能强行剥夺。
2025-05-28 20:51:56
720
原创 嵌入式自学第二十九天(5.27)
线程回收:栈区资源回收:int pthread_join(pthread_t thread,void **retval)(1)非阻塞式,代码继续走,能回收就回收,不能回收继续运行程序,但需要判断子程序返回信号,缺点是cpu占有率高。(2)创建:int pthread_create(*新线程线程号,属性(NULL默认8m),函数名,*参数)(6)设置分离属性,与主线程分离,目的线程消亡,自动回收空间,不能调用join回收。//栈区系统自动回收。线程是平级的,创建新线程时默认有一个主线程,新创建的是次线程。
2025-05-27 20:17:56
466
原创 嵌入式自学第二十八天(5.26)
pcb里的退出状态:man wait查看wstatus,正常结束传exit的值,随意写,被信号关闭,传信号值,64个信号。else if (WIFSIGNALED(status)) //异常结束。else if(WIFSIGNALED(status)) //异常结束。if (WIFEXITED(status)) //子进程正常结束。//如果有注册有清理函数,只能调用exit,if(WIFEXITED(status)) //子进程正常结束。
2025-05-26 20:30:58
694
原创 嵌入式自学第二十七天
调度算法:sched 非实时系统(SHCHED_OTHER,batch,idle),实时系统(SCHED_FIFO,rr)一个程序可以运行多次,变成多个进程,比如开启多个终端,一个进程可以运行一个或多个程序比如打开钉钉,聊天直播都被打开。pcb进程控制块,位于kernal(内核),是一个结构体,包含进程标识符、进程状态、内存分配、返回地址等信息。(1)进程:正在运行的程序,会去分配内存空间,并受到cpu的调度。linux中的状态,运行态,睡眠态,僵尸,暂停态。c函数exit()程序结束,资源释放。
2025-05-25 22:29:41
485
原创 嵌入式自学第二十六天(5.22)
time_t a = time(time_t *tloc)传NULL 或者long返回秒数。(5)目录操作:opendir、readdir、closedir。注意:关闭文件采用fclose,因为封装的比没封的功能全一些。printf("目录文件\n");printf("普通文件\n");printf("其他文件\n");printf("块设备\n");(2)文件流转文件描述符:fileno。(3)文件描述符转文件流:fdopen。注意:目录流DIR* dir指向目录。DT_LNK 符号链接,软链接 l。
2025-05-22 18:34:44
651
空空如也
这个程序结果是什么?
2022-11-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人