- 博客(65)
- 收藏
- 关注
原创 嵌入式学习linux内核驱动8——IIC设备驱动和lm75-dht11
层次化:用户空间→设备驱动→核心层→总线驱动→硬件分离化:设备功能与总线协议分离标准化:统一的接口和操作集可扩展:易于添加新的I2C设备和控制器这种设计使得:设备驱动开发者无需关心具体硬件控制器控制器驱动开发者无需了解具体设备功能用户可以选择直接控制或通过设备驱动访问。
2025-10-13 23:47:33
861
原创 嵌入式学习linux内核驱动7——dts_plantform-irq和中断底半部
2arch/arm/boot/dts/pute.dts 里面需要有ptkey 更新 更新完pute 然后make dtbs cp arch/arm/boot.dts/pute.dtb ~/tftpboot/1更新 key_platform.c(Makefile+Kconfig)modules 然后 cp drivers/char/lkey_platform.ko ~/nfs/imx6/rootfs。2把bootcmd的“run。3运行 ismod。key_app.c改一下。
2025-10-13 16:23:43
957
原创 嵌入式学习linux内核驱动6——dts和GPIO子系统
复制现有开发板DTS文件作为新板型的基础模板。修改文件名以区分不同开发板,例如从imx6ull.dts改为pute.dts。需在Makefile中添加新DTS文件对应的DTB生成规则。新加自己的设备树文件:修改新增一行:pute.dtb(加到对应的SOC下make dtbs编译所有的设备树文件只编译pute.dtsDTS文件由节点(node)和属性组成,节点可嵌套形成树状结构。属性以键值对形式存在,每行以分号结尾。节点可包含子节点(sub-node),形成层级关系。
2025-10-10 22:07:37
751
原创 嵌入式学习linux内核驱动5——动态编译和plantform总线
系统维护文档记录已使用的type值。推荐使用未被占用的ASCII字符作为type。通过_IOC宏自动生成复合命令码。
2025-10-09 20:02:53
969
原创 嵌入式linux内核驱动学习4——LED
驱动程序是用于操作硬件的软件程序。驱动程序使设备能够被操作系统控制和使用。使用struct file_operations定义操作函数集合。该结构体包含open、read、write、release等函数指针成员。驱动需实现这些函数并将地址赋值给对应指针。定义file_operations结构体,包含open、read、write、release等函数指针。函数参数理解:文件指针、缓冲区、数据长度、偏移量等。
2025-10-04 23:35:20
687
原创 嵌入式学习内核驱动3--内核编译
系统上电后经历一系列步骤最终到达shell命令行。启动流程分为多个阶段,其中U-Boot占据前两个关键阶段。根文件系统是第一个被挂载的文件系统。其内容包含操作系统必需的目录结构(/bin, /sbin, /etc, /lib, /proc等)。
2025-10-01 19:20:54
767
原创 嵌入式linux内核驱动学习2——linux启动流程
Linux系统启动过程涉及多个阶段,从硬件上电开始,程序首先在处理器内部的ROM中运行,根据拨码开关选择启动设备(如EMMC或SD卡),随后将Bootloader加载到内存中执行。Bootloader负责初始化内存等硬件,并将内核和DTB文件搬移到指定内存地址,最终启动内核并挂载根文件系统,完成操作系统启动。
2025-09-28 18:08:36
826
原创 嵌入式学习Linux内核驱动1--基本概念
操作系统启动分为三个主要部分:Bootloader(可看作一个小的裸机程序,为linux准备运行环境)、内核(Kernel)操作系统的核心根文件系统(Root FS)按照一定格式组织的一堆文件·只有这三个组件成功加载并运行后,用户才能看到图形界面或命令行界面。这一过程适用于Linux和Windows等主流操作系统。
2025-09-26 23:39:52
543
原创 嵌入式ARM架构学习10——LCD
垂直方向同步信号需要(480+3+32+13=528)个行的时间就是976*528个像素周期。一个行显示需要800+48+88+40=976个像素时钟。期间给出一个 HSYNC 脉冲,告诉显示器“期间给出一个 VSYNC 脉冲,告诉显示器“写完 1080 行到达屏幕最右下角后,在。LCD 的“行同步”和“场同步”本质上是。扫描枪写完一行 1920 个像素后,在。HSPW:行同步脉冲宽度——48个CLK。行同步(HSYNC)——“换行符”场同步(VSYNC)——“翻页符”像素时钟”的单位就是。
2025-09-26 09:40:17
587
原创 ARM架构学习10——ADC+PWM
作用:把GPIO1_IO01变成“模拟通道1”,并且电气上干干净净,不拉偏电压。电压不会瞬间稳定,ADC需要先“充电”一小段时间,再“保持”然后比较。NXP的ADC要求时钟≤40 MHz,这一步就是“降速”到安全区。一切就绪后,CPU把“通道号”写进队列,ADC立刻开始“比”电压。ADC是“数”电路,必须有时钟才能一步一步地“比”电压。相当于把同一个电压测4回,结果除以4,抖动小一半。“硬件平均”——连采4次求平均,把随机噪声抹平。3.告诉ADC“怎么采”——采样模式。1.把“世界”接进来——引脚配置。
2025-09-23 15:54:08
1010
原创 嵌入式ARM架构学习8——串口
这是根据数据流向对通信方式进行的分类。单工通信:数据只能在一个方向上传输,不能反向。一方固定为发送端,另一方固定为接收端。例如:广播、电视。半双工通信:数据可以在两个方向上传输,但不能同时进行。在某一时刻,只能有一方发送,另一方接收。就像对讲机,说话时要按住“讲话”键,此时只能发送不能接收;松开键才能听对方说话,此时只能接收不能发送。全双工通信:数据可以在两个方向上同时、独立地传输。双方都可以同时进行发送和接收操作。例如:电话、手机通话、现代网络通信。核心区别:关键在于数据传输方向和能否同时进行。
2025-09-19 20:58:04
957
原创 ARM架构——学习时钟7.2
通过一边控制转速的增减,另一边测试转速,可以通过闭环控制来调节电机的转动。iMXULL 一上电,外部一个24M的晶振(石英差 稳定的时钟源), 产生396MHZ的时钟,通过时钟树的操作,产生不同频率的时钟供给不同的外设使用。1.1CBCMR的bit18-19:PERIPH_ CLK_SEL 配置为从PFD2(先清零再置01)(396Mhz)tip:ARM工作时钟配置:先配分频值,再配倍频值(减小波动的影响)有源蜂鸣器(1插电即响)(2插入不同频率的PWM波 输出不同音调)
2025-09-18 22:35:38
681
原创 ARM架构学习6.2——中断理解
KEY:作为接收高低电平的信号引脚的名字(用外设功能命令)1.2看key引脚用于io,因此找是否有用于io的,发现了(0101 ALT5 — Select mux mode: ALT5 mux port: GPIO1_IO18 of instance: gpio1)对gpio来说 sion无所谓keyGPIO作为输入,来配置一下电气属性16施密特触发器、实时比较器(HYS)可以消除毛刺,增加了之后,实时性降低15-14PUS 阻值配置 (上拉电阻、下拉电阻,不成文的规则:10K电阻)
2025-09-15 22:45:03
616
原创 嵌入式ARM架构学习7——时钟、定时器
当按键按下或松开时,金属触点不是理想瞬间接触/断开,而是机械振动,导致电平在短时间内反复跳变,这就是抖动。抖动时间:通常为5μs ~ 10ms,劣质按键甚至更长结果:MCU 会误认为按键被多次按下/松开。
2025-09-13 20:03:53
1043
原创 嵌入式ARM架构学习6——中断
中断源发起请求,GIC控制器(中断是否允许、优先级、分发器)报给内核处理,中断处理函数,返回,恢复现场,当按键被按下时,KEY0引脚被直接连接到地(GND),即低电平(0V)。当按键未被按下时,上拉电阻将KEY0引脚拉高到3.3V(高电平)。读 ISR 寄存器 → 判旗 → 清旗 → 业务代码(短!宏定义 → 复用 → 电气 → 方向 → 中断(可选)CP15系统寄存器的主要功能是:整体系统控制和配置。这意味着GPIO引脚读取到的电压为高电平。这意味着GPIO引脚读取到的电压为低电平。
2025-09-13 01:05:06
696
原创 嵌入式ARM架构学习4
这四种工具是构成嵌入式开发工具链的核心组件,它们将人类编写的源代码一步步转化为机器可以执行的二进制文件,并提供了分析调试的能力。① 编译器 (Compiler)功能:将高级语言(如C/C++)或汇编语言的源代码翻译成目标机器的机器指令,输出为一个或多个目标文件 (.o)。工作特点:它是“分块”处理的,每个源文件独立编译。此时,文件中调用的外部函数(如其他文件中的函数或库函数)的地址是未知的,编译器会先用一个符号(如led_init)来占位。对应命令② 连接器 (Linker)功能。
2025-09-11 00:44:24
1058
原创 嵌入式ARM架构学习3——启动代码
preserve8且魔术棒配置ROM地址区域上电后建立向量表 → 切到用户模式并开 IRQ → 给 User 栈留空间 → 跳进 C 的main();同时提供让 C 主动触发 7 号软中断,异常处理完整保存/恢复现场并自动返回用户模式。
2025-09-10 00:10:55
860
原创 嵌入式ARM架构学习2——汇编
立即数:是指在指令编码本身中直接包含的操作数。执行时可以直接使用,无需从寄存器或内存中额外读取。例如:在指令中,0xFF就是一个立即数。判断12位立即数是否合法:ARM指令中的立即数并非完整的32位,而是由一个12位的编码字段(4位旋转值 + 8位立即数)来表示。一个32位的常数是合法的12位立即数,当且仅当一个8位的数值(范围0-255),循环右移偶数位(0, 2, 4, ..., 30)后得到的32位常数。判断方法:您可以想象这个数能否被一个“字节+移位”的组合所表示。
2025-09-08 18:16:41
972
原创 嵌入式学习——ARM 体系架构1
CISC(Complex Instuction Set Computer):复杂指令集架构。RISC(Reduced Instuction Set Computer):简洁指令集架构。(Current Program Status Register):当前程序状态寄存器。(Saved Program Status Register):备份程序状态寄存器。:内核+外设(GPIO、Timer、Uart、PWM、RAM、ROM)(常见X86架构(复杂指令集架构)/ARM架构(简洁指令集架构))
2025-09-06 17:54:43
399
原创 关于嵌入式学习——单片机4
在51上,与dq数据请求线相连接的网络接口是P37,P37通过上拉电阻与VCC相连,说明引脚在空闲状态下处于高电平。复位信号:51单片机复位,问ds18b20在不在。存在信号:“ds18b20"回复一个存在脉冲。三、ds18b20的主从通信方式。
2025-09-05 15:59:22
339
原创 关于嵌入式学习——单片机3
有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。波特率:bps(bit per second),每秒钟传输bit的数量,常见的波特率:2400,4800,9600,115200。定时器以固定频率溢出(或翻转),每溢出一次就产生一个“tick”给 UART,告诉它:“该发/收 1 位数据了”。通信双方没有时钟线进行同步,如Uart:可以通过设置波特率来实现同步(发:2400bps收:2400bps)一、主机发送指令,从机解析主机发送的指令并获得功能码,根据功能码完成对外设的控制,并回复应答给主机。
2025-09-04 21:16:18
1112
2
原创 关于linux软件编程15——数据库编程sqlite3
insert into stu_info values (2,'关二哥',55,'13011112222','gauanerge@163.com','8888888');Access 是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的, 效率也很高. 但是它的同时访问客户端不能多于 4 个。access 数据库有一定的极限,如果数据达到 100M 左右,很容易造成服务器 iis 假死,或者消耗掉服务器的内存导致服务器崩溃。///删除id=1 的数据;
2025-09-03 21:54:18
929
原创 关于linux软件编程14——网络编程5:IO 多路复用总结
int fd;// 文件描述符// 关注的事件(输入)// 实际发生的事件(输出)特性selectpollepoll平台兼容性高(POSIX)高仅 Linux最大连接数~1024无限制(但性能差)无限制时间复杂度O(n)O(n)O(1)用户/内核拷贝每次全量拷贝每次全量拷贝共享内存是否修改输入参数是(需备份)否(revents分离)否触发模式仅 LT仅 LTLT + ET遍历开销高(需遍历所有 fd)中(遍历数组)低(只处理就绪)
2025-09-03 21:32:02
974
原创 关于linux软件编程13——网络编程4
/清除对应的客户端的fd。2. 每次调用需重置 fd_set:内核会修改集合,必须每次重新 `FD_SET`if (i == listenfd) //连接。// i =?多路IO复用的服务器: //实现并发 --- 可以同时处理多个客户端。2. 无需重置集合:`events` 和 `revents` 分离。//非阻塞IO --- 轮询 + CPU(负担中)//信号驱动IO --- 发信号通知一下。//阻塞IO --- 简单 低效。10进程或线程 --- 监控多路IO。
2025-09-03 21:30:11
655
原创 关于linux软件编程12——网络编程3
读操作--->内核中读取数据--->如果没有数据,一直等到,直到有数据--->之后将数据带回到用户空间。读操作--->内核中读取数据--->如果没有数据,不等,直接返回用户空间。// ---专门创建一个子进程 --- 负责通信过程。// ---专门创建一个子进程 --- 负责通信过程。// ---专门创建一个线程 --- 负责通信过程。// ---专门创建一个线程 --- 负责通信过程。一个客户端 ----> 一个进程 或 线程。N个客户端 -----> 一个进程 或 线程。//可以处理多路IO。
2025-09-03 21:22:51
753
原创 关于linux软件编程11——网络编程2
/3.读到文件末尾 ---复制结束。//2.读文件内容,发给服务器。四、sendto和receivefrom函数。//3.读数据写到文件中。//2.创建同名文件。
2025-09-03 21:07:38
217
原创 关于嵌入式学习——单片机2
原理:P11高电平,NPN基极高电平,发射极接地,NPN导通,集电极电电压接近0,BZ1一端VCC高电平,一端低电平,导通,蜂鸣器响;晶振12GHZ------>12分频供给使用 ---->机器周期频率1GHZ---->1000000HZ----->执行一次指令需要1us----->定时器定时0.0025s需要执行------>2500次------>65535计数器溢出----->因此初始值为63035。5.中断优先级:CPU再去处理中断任务时候,会去比较多个中断的优先级,优先去处理优先级高的中断。
2025-09-03 20:44:47
1138
原创 关于嵌入式学习——单片机1
Micro Ctroller Unit(微控制器),集成度比较高,将所有功能集成到芯片中(CPU、RAM、ROM、定时器、UART、10),简单控制,成本低。运算器(数据运算)、控制器(指令控制)、存储器(内存外存)、输入设备(鼠标、键盘、摄像头)、输出设备(显示器)消费电子(手机、蓝牙耳机、智能音响)、医疗电子(心率脉搏、呼吸机)、无人机(大疆D)、机器人(人形四足机器人)编程语言(C/C++)、操作系统(Linux文件、多任务、网络)、数据结构、数据库。// 二进制:1111 1111。
2025-09-02 18:23:55
858
1
原创 关于linux软件编程10——网络编程1
应用:(1).小数据,但是对速度要求较高:(QQ.及时文本信息,语音等实时性要求较高场合)b.提供可靠传输(四个"无",无丢失,无失序,无差错,无重复)特点:a.面向连接(就是在进行通信之前,必须建立好一条逻辑上的通路):(类似 打电话)---可靠(1.连接 2.可靠传输 3.字节流)(域名,计算机名,人类好记忆的网址)转换成百度服务器的IP地址。:(类似 生活中的广播)(1.不可靠,2.无连接 3.数据报)(2).广播,组播//电子教师(vnc-广播)(3).无线网的传输//udp。
2025-08-22 09:01:30
656
原创 关于Linux编程9——进程间通信
进程空间是独立的,共享内存是开辟一段内核空间,进程都映射到这一片空间上,实现空间。exe:利用共享内存和信号灯实现两个进程对共享内存的同步操作(写一次、读一次)2. shmget(开辟的空间是4096(4k)的整数倍)用于线程间通信的信号量称为无名信号量,信号灯是有名信号量。对象可以创建一个消息队列、一个共享内存、一个信号灯。对象在操作系统关闭的情况下数据被回收掉。将进程空间地址映射到共享内存空间中。信号灯是一组信号量,即信号量的数组。读写共享内存空间实现进程间通信。搭配共享内存实现进程间通信。
2025-08-20 09:11:38
240
原创 关于linux编程8——进程间的通信
无名只用于继承关系的进程通信,是父进程在内核中创建管道,子进程继承即可获曲管道文件操作符,因此没有open操作,直接write和read就行。有名操作则需要先open管道文件获取相应的管道文件符。3捕捉:信号来了,按照自定义方式方式处理信号。2忽略:信号来了,不处理信号,忽略信号。1缺省:信号来了,按照默认方式处理。3. 管道中至少有一个读端,其中:管道分为有名和无名。
2025-08-18 22:01:20
854
原创 关于Linux系统编程7——线程
ex:编写3个线程任务,线程1循环打印 "A", 线程2循环打印"B",线程3循环打印"C",要求打印出的字符顺序总为ABC。多线程由于加锁解锁错误导致程序无法继续向下运行的状态称为死锁状态,简称为死锁。1. 可以通过pthread_create第四个参数实现对线程内部的传参。
2025-08-16 20:22:01
993
原创 关于linux系统编程6——线程
(直接调用thread函数(等待被调函数返回才执行原函数)和开辟进程(线程进程一起执行)的区别)tip 定义函数void * thread(void* arg)一定要写参数arg噢。线程结束需要回收线程空间,否则产生僵尸线程。1. 线程本质是进程,线程是任务创建、调度、回收的过程。2. 进程空间:文本段 + 数据段 + 系统数据段。编译线程 Makefile要注意链接库文件!
2025-08-16 01:39:53
987
原创 关于Linux编程5:进程和线程
ex:编写一个程序,将当前系统中所有进程的PID、PPID、Name信息记录到record.txt文件中。(/proc目录下,每个纯数字组成的文件夹就是一个进程,也是该进程的PID号)所有能够被用户看到的地址均为虚拟地址,表示用户可以寻址的范围。实际地址和物理地址之间的映射由内存映射单元(MMU)完成。父进程先结束,子进程会成为孤儿进程,被int进程收养。内存存放数据对应的实际硬件物理地址。2. getpid和getppid。3. exit与_exit。4. 后台执行进程任务。
2025-08-14 22:41:41
1073
原创 关于linux软件编程4:目录IO和一些时间函数
exe:实现从终端输入单词,打印单词的含义。2. struct tm 类型时间。3. char *字符串类型时间。1. time_t 类型时间。
2025-08-13 22:19:30
338
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅