- 博客(30)
- 收藏
- 关注
原创 BH1750光照采集(I2C子系统 + platform框架 + 字符设备驱动)
BH1750 返回的光照值是一个,表示传感器测量的光照强度。其高 8 位和低 8 位分别传输。格式传输的。即高位字节在前,低位字节在后。BH1750 输出的原始数据需要进行字节序转换(因为 BH1750 是大端格式,RK3568是小端,然后计算实际的 Lux 值。BH1750 通过0x100x200x13命令会编译内核源代码树中的所有内核模块,并生成.ko文件。
2025-03-15 11:59:00
651
原创 探索中断与异常(涵盖软/硬中断,顶/底半部,中断/异常向量表)
在程序执行过程中,如果有中断事件发生,cpu会暂停正在执行的程序,去处理中断服务程序,处理完成之后继续执行被打断的程序,中断的来源只有硬中断,软中断只是中断底半部的一种机制,这一点在网上有争议,也是困惑我很久的地方,很多人以为 硬件中断就是硬件触发的,软件中断就是软件触发的,如(通过SVC指令模拟出类似中断的场景),其实不然,硬件中断是异步的,是由外部硬件异步触发的中断信号,与当前执行的指令无关,而异常是同步的,跟当前指令相关,虽然他们比较相似但不是一个概念,这篇文章,就来澄清一些混淆。
2025-02-24 14:17:01
652
原创 虚拟机双网卡配置与路由转换----实现嵌入式开发板外网访问
在开发板移植了MQTT-paho库之后,会遇到一个问题:开发板无法访问外网。具体问题表现为开发板和PC通过桥接模式连接,导致它们处于同一子网,开发板只能访问内网,而无法访问外网(如阿里云服务器)。为了让开发板能够访问外网,您可以通过在PC虚拟机上配置NAT模式的网卡,将PC内网网卡作为网关转发数据至外网网卡,从而实现开发板的外网访问。本质上就是;而通过NAT模式配置的网卡则涉及,使得开发板能够通过PC的内网网卡作为网关,将数据转发到外网网卡,从而实现外网访问。二层转发原理链接优快云。
2025-02-20 17:14:02
699
原创 深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)
HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在HTTP/1.1中,使用了长连接技术,允许一个连接复用多个请求和响应,减少了TCP三次握手的消耗。MQTT是一种轻量级的、基于发布/订阅模式的消息传输协议,使用TCP协议进行传输,端口为1883(非加密)和8883(加密),客户端通过发布(Publish)消息到某个主题(Topic),而其他订阅(Subscribe)该主题的客户端会接收到消息。
2025-02-20 16:39:38
861
原创 Select到Epoll的底层实现(涵盖红黑树,事件驱动,mmap,kqueue)
API作用select监控文件描述符的状态变化,检查哪些文件描述符就绪FD_ZERO清空一个文件描述符集合FD_SET将一个文件描述符加入到集合中FD_CLR从文件描述符集合中删除一个文件描述符FD_ISSET检查某个文件描述符是否就绪FD_COPY复制文件描述符集合用于指定select函数的超时时间初始化文件描述符集合:首先,通过FD_ZERO清空文件描述符集合,接着使用FD_SET将需要监控的文件描述符添加到集合中。这些文件描述符可以是套接字、管道等。设置超时时间:通过设置超时时间(tv_sec。
2025-02-20 12:17:32
762
原创 C语言中的线程池与内存池:提升性能与资源管理
在高性能系统中,资源管理和优化至关重要。尤其在需要频繁创建销毁线程和对内存管理比较敏感的场景中,线程池和内存池这两种技术发挥了至关重要的作用。它们的核心思想是:通过预先分配一定数量的线程或内存块,在使用和归还时直接从池中获取和归还资源,而不需要操作系统来频繁地进行分配和释放。这种方法有效地减少了系统调用的开销,避免了频繁创建销毁线程和内存碎片的问题,从而大大提高了程序的效率。
2025-02-19 17:27:38
331
原创 死锁(涵盖产生原因,解决方法,GDB,Valgrind死锁调试)
破坏互斥条件:使用无锁数据结构,既然多线程通信需要频繁使用锁,如果使用链式双队列的形式通信,有点类似于发邮件,每个线程独有一个消息队列,通信只需要往特定的队列放消息就行,就不需要锁了。总的来说,解决和预防死锁的方法很多,但最基础的还是按照顺序申请锁,锁的申请和释放成对出现,那么出现这种问题,但代码很多,看起来不方便,这就需要一些调试方法了。破坏循环等待条件:对锁进行全局排序,要求线程按固定顺序申请锁,比如(如锁1、锁2、锁3),如果线程已持有锁2,则不能再申请锁1,只能申请锁3。
2025-02-19 10:37:15
260
原创 交换机三层转发原理(涵盖ARP,ICMP,IP协议)
ICMP工作在网络层,通常用于调试网络通信,比如Ping就是基于ICMP协议,当网络通信失败的时候,可以Ping一下然后使用wireshark抓包,就会看到ICMP报文,会告知错误信息,超时或主机不可达。与二层转发(基于MAC地址)不同,三层转发主要关注的是。路由表是三层转发的核心,它包含了设备到不同网络的路由信息。主要是实现网络层的通信,提供路由和寻址的能力,使数据包能够在不同的网络之间传输。:根据路由表中的信息,设备会选择最合适的下一跳并转发数据。(特别是目的IP地址)来进行路径选择和数据转发。
2025-02-18 14:13:15
577
原创 Xorp架构下的XRL,Unix_TCP_ Socket与异步IO回调函数技术
Xorp架构是一个轻量级的分布式框架,专为高并发环境设计,具有模块化、异步处理和高效通信的特性。其核心理念是通过模块间的异步通信实现灵活的系统交互,模块之间的通信通过XRL协议进行。模块化设计:系统的各个功能模块相对独立,模块之间通过XRL协议进行通信。异步通信:所有的输入输出操作都通过异步机制进行,避免了同步操作带来的阻塞。高效的XRL协议:XRL是一种轻量级的请求响应协议,具有小而高效的数据格式,能够在高并发场景下保持高性能。
2025-02-17 18:17:59
726
原创 Git从基础到进阶
Git 是一种分布式版本控制系统,它允许开发者在本地机器上维护代码的完整历史记录,同时支持多人协作开发。与集中式版本控制系统(如 SVN)不同,Git 的每个开发者都有完整的代码仓库副本,这使得开发更加灵活和高效。
2025-02-17 17:00:31
867
原创 以太网交换基础(涵盖二层转发原理和MAC表的学习)
以太网是当今局域网中最广泛使用的通信协议标准。它定义了局域网中使用的电缆类型和信号处理方法。以太网基于**CSMA/CD(载波监听多路访问/冲突检测)**机制运行,是一种广播型网络。在早期的以太网中,所有设备共享同一介质,这导致了冲突域的概念——即所有设备竞争同一带宽。然而,随着交换机的出现,每个接口都成为一个独立的冲突域,从而大大减少了冲突的发生。MAC(Media Access Control)地址是网络中唯一标识一个网卡的地址。每个网卡在出厂时都会被分配一个全球唯一的MAC地址。
2025-02-17 16:51:51
1082
原创 计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
计算机网络是现代信息技术的核心,它通过复杂的协议和设备实现数据的高效传输。从OSI七层模型到TCP/IP模型,从交换机、路由器到防火墙,每一个组件都在网络中发挥着重要作用。通过理解网络的基本概念、协议模型和设备功能,我们可以更好地利用网络资源,解决实际问题。无论是在企业网络管理还是个人学习中,掌握计算机网络的基础知识都是至关重要的。
2025-02-17 16:47:13
1272
1
原创 嵌入式百科知识点
是一种标准的计算机内部总线,与Platform总线不同,他是实际存在的,用于连接主板上的不同外设,比如显卡网卡存储卡等,最多可以支持32个设备,传输速率很高,即插即用,在设备运行的时候插入,操作系统会自动配置设备并加载相应驱动程序,在pc机和高端的嵌入式设备上用的比较多。X86 架构采用 CISC 设计,指令集复杂,且指令集长度是可变的,一条指令可以包含多个功能,所以处理的时间比较长,功耗比较大,x86一般为多核 CPU,可以实现真正的多线程并行,性能很强,在PC机和高端嵌入式设备用的比较多,追求高性能。
2025-02-17 14:47:27
558
原创 流量拥塞控制技术---PFC/ECN/TCP滑动窗口
其核心思想是:当接收端检测到拥塞时,向发送端发送 PAUSE 帧,暂停特定优先级的流量传输。:当发送方连续收到三个重复的ACK时,认为发生了丢包,触发快速重传,并将ssthresh设置为丢包发生时cwnd的一半,cwnd重置为1个MSS,进入快速恢复阶段。ECN 是一种基于 IP 层的显式拥塞通知机制,通过标记报文头中的拥塞状态,通知发送端调整发送速率,避免拥塞加剧。:接收方根据自身的处理能力和缓存状态,动态调整窗口大小,发送方根据接收到的窗口大小信息,实时调整发送速率。:需根据网络实际负载配置。
2025-02-17 14:45:39
1275
原创 分布式系统中---gRPC 高效通信与跨平台互操作性
map 以键值对形式存储数据,在这个场景中,通常以接口名称等作为键,对应存储 PFC 或 ECN 数据的结构体作为值。gRPC是谷歌开源的RPC框架,RPC是远程调用协议,可以像在本地调用API一样去调用远程服务器的接口,gRPC规定了内容序列化转换协议Protocol Buffers,传输协议为HTTP/2,支持多种开发语言,可以跨语言调用API接口,而且传输效率很高,资源占用率很少,gRPC 支持流式通信,客户端和服务端之间建立持久的连接,减少请求/响应的开销,从而实现更高效的数据传输。
2025-02-17 14:33:25
589
原创 简单网络管理协议----SNMP
SNMP简单网络管理协议是一种应用层协议,他为不同种类和厂商的网络设备提供够一个统一的管理接口,对这些设备进行监控,每个应用层协议都有一个传输层协议作为辅助,SNMP的报文就是用UDP来传输的,网络管理员可以利用SNMP平台在网络上的任意节点完成信息查询、信息修改等工作。
2025-02-17 14:30:07
907
原创 硬件IIC(I2C子系统)与软件IIC
IIC主要特点就是同步,半双工,多主多从机制,同一时刻只能有一个主机与一个从机通信,设备间的通信是通过开漏进行的,IIC又分为模拟IIC和硬件IIC,模拟IIC就是将俩个GPIO引脚分别当作SDA和SCL,通过高低电平模拟出起始,结束,ACK,NACK信号,硬件IIC依赖于I2C子系统,通过编写驱动层IIC_deriver,通过adapter与硬件进行交互。硬件IIC和模拟IIC的区别?
2025-02-17 14:25:57
323
原创 细讲 ARM开发板上电流程
在bootloder,linux内核,根文件系统已经完成配置的前提条件下,开发板上电,u-boot启动并初始化cpu和始终,关闭mmu和看门狗,启动linux内核,在内核态初始化硬件和设备驱动,挂载根文件系统,然后内核创建init进程,通过上下文切换,内核从内核态降级为用户态,启动init进程,init进程启动其他用户进程从内核态到用户态的上下文切换通过保存内核态进程的状态、恢复用户态进程的状态,并更新程序计数器,使CPU切换到用户模式,继续执行用户程序。
2025-01-17 11:31:17
634
原创 嵌入式---那些不起眼又很重要的知识点(想起一个补充一个)
在我们学习的过程中,尤其是初学者,很多知识点都只知道一个概念,没有深究过其意义,也很少在实际开发中使用,过段时间就会疑忘,等到面试的时候被问到又头大的一比,最近在重新学习一个新的开发平台,树莓派和香橙派,分别用到了全职H616开发板和瑞芯微RV1126,都是ARM架构的,相当于回顾了一遍知识,也对曾经一知半解的知识点有了更深入的了解,在此篇将会总结一些容易被忽略的小知识点,更为重要的知识点将会单独写一篇来总结,此篇未完待续,持续更新。
2024-12-28 16:45:47
242
原创 嵌入式----C++(仅记录学习日志)
最近秋招结束,发现好多公司都要求会c++,做为linux应用开发程序员,c++和qt将会是我们必须的一项技能。个人认为,C语言更偏向于底层驱动的实现,如操作寄存器,而C++则适用于更上层的应用,如QT的设计和图像处理,音视频编解码等。C语言注重的是过程,只有过程对了,才有可能得到正确的结果C++注重的是结果将,属性和行为整合在一起。
2024-12-26 21:14:17
725
1
原创 UART串口编程
如果使用linux操作系统进行开发的话,UART协议内核已经帮我们做好了,只需要进行函数调用就行,但自己动手写一下uart协议,也可以加深理解主要是对termios结构体进行操作,使tcgetattr读取端口属性,tcsetattr设置端口属性,ioctl设置端口状态。
2024-12-23 20:45:32
138
原创 基于PWM+定时器对SG90舵机的开发
舵机使用三线制,其中一个线是PWM信号线,通过改变PWM占空比实现不同角度的转动,PWM的频率为50HZ,周期为20ms,不可过高(需要给舵机伺服系统响应时间,50HZ也是行业标准,确保不同型号的舵机之间具有一定的兼容性),以SG90为例子,其占空比和转动角度的关系如下图所示。
2024-12-23 14:48:06
165
原创 中断
在程序执行过程中,如果有中断事件发生,cpu会暂停正在执行的程序,去处理中断服务程序,处理完成之后继续执行被打断的程序,中断来源分为软件中断和硬件中断。硬中断和软中断的区别?硬中断是外设引起的而软中断是中断指令引起的,硬中断具有可屏蔽性,也就是可以设置寄存器的值让中断不会被其他中断所打断,可以防止中断嵌套所带来的不稳定性,而软中断不可屏蔽,一旦触发就会立即执行,硬件中断要快速的完成任务,称为上半部,而软件中断具有延迟执行的特性,属于下半部。中断和异常的区别?
2024-12-20 14:37:19
505
原创 回顾线程
互斥锁通过限制对共享资源的并发访问,间接实现了线程间的同步,保护共享数据,对于互斥锁来说,与自旋锁相比它需要消耗大量的系统资源来建立锁,当线程被阻塞时,线程被加入等待线程队列,当锁可用时,线程从等待队列取出,但是在线程被阻塞期间,它不消耗CPU资源。
2024-09-27 18:52:29
566
1
原创 (一万字总结!!)Linux驱动
全双工通用异步收发器(串行),使用3根线完成:发送线(TX)、接收线(RX)和地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信。
2024-09-20 22:01:36
1411
1
原创 数据结构
选择一个基准元素,将列表中的元素分割为两部分,使得左边部分的所有元素小于基准元素,右边部分的所有元素大于基准元素,然后对这两部分分别进行递归排序。每次从待排序的数列中选出最小(或最大)的一个元素,存放在数列的起始位置,直到全部待排序的元素排完。对每个子表进行插入排序,第一趟步长默认为n/2,第二趟步长为d/2,直至步长为1为止。将待排序数列中的元素两两进行比较,直到将最大的数移动到末尾,一共进行n-1趟。从第二个数开始,跟前一个数比较,找到对应位置插入。
2024-09-19 20:32:35
178
原创 嵌入式ARM体系
但是立即数作为操作数现,只有12位空间,32位立即数显然不能直接编码进去,机器指令中的12位操作数的编码由8位常数和4位循环右移值构成,由8位常数循环右移那另外4位取值的2倍得到最后的32位立即数,但并不是所有32位立即数都可以这样编码操作所以编译系统为我们提供了伪指令LDR,实现任意立即数直接载入寄存器。比较指令的运算结果会影响CPSR寄存器的N、Z、C、V标志位,比较指令的运行结果Z=1时,表示运算结果为零,两个数相等;CPSR寄存器中存放着当前程序的运行状态,比如条件标志位的N、Z、C、V。
2024-09-03 22:11:07
1287
原创 深入进程间通信(涵盖UDS,MMU,内核,系统调用,mmap)
进程是程序运行的实例,是系统进行资源分配和调度的基本单位,若干进程可能与同一个程序相关,同时也是线程的容器。
2024-08-29 21:21:06
637
原创 Linux数据库sqlite3
如果向数据库中插入100万条数据,在默认的情况下如果仅仅是执行sqlite3_exec(db, “insert into name values ‘lxkxf', ‘24';这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高。REAL:浮点值 TEXT:文本字符串 INTEGER:带符号整形。
2024-08-28 20:18:39
456
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人