- 博客(68)
- 收藏
- 关注
原创 mailbox模型与Linux内核链表
Mailbox(邮箱通信)是,用于同一个 CPU 内核下,任务与任务、中断与任务之间传递简短消息。这里主要实现的是一种软件 Mailbox的私有队列模型,与RTOS不同的是,本软件 Mailbox每个线程自带一个私有的消息队列,信息传输时,使用tid识别,点对点通信,系统维护一个全局链表head,链表每一个节点对应一个线程,节点内部包含该线程专属的消息队列queue,这就是。给某个线程发消息:根据tid找到链表上对应线程的节点,把消息写入该线程自己的queue队列;然后唤醒这个线程。
2026-10-12 21:50:38
222
原创 Linux内核驱动开发——中断与定时器
Linux 中断分为(外设产生,IRQ)和(内核软件触发),现代内核常用分离:硬件中断 → 中断顶半部(快速处理,禁止抢占)→ 底半部(耗时工作,可调度)。
2026-09-28 21:47:22
175
原创 Linux内核驱动开发——gpio子系统
其中需要用到cmd参数一般需要通过拼接得到,为了避免cmd命令重叠,以及误操作设备,ioctl命令是由四个字段拼接而成的。,内核驱动解析 cmd,执行点灯、灭灯、读状态这类操作。通过上面一部分已经完成了DTS设备树的修改,所以这里只需要在驱动程序中修改就可以了,主要使用到一下几个API函数。使用:在 DTS 节点描述 GPIO 信息,驱动通过 of 函数读取,做到。,防止多个驱动抢同一个引脚 参数:gpio 编号,gpio 名字(用于。,驱动注册 platform_driver,内核拿驱动里。
2026-09-27 22:19:02
186
原创 Linux内核驱动开发——字符设备与杂项设备驱动
字符设备:流式,按字节访问,无固定块大小,随机访问不要求;块设备:按固定大小块(扇区,512B)访问,必须经过内核块缓存,支持随机读写。tags 索引文件(ctags)tags 是源码符号索引文件,由生成,Vim/Neovim 用来快速跳转到函数、结构体、宏、变量的定义,阅读 Linux 内核、STM32、i.MX6ULL 这类大工程源码必备进入源码根目录执行:Vim 核心跳转命令 快捷键 / 命令 功能 光标放在符号上,跳转到定义
2026-09-24 20:48:15
194
原创 Linux内核驱动开发——内核编译
。在没有这套机制的年代,改功能要手动改 Makefile、加大量#ifdef,平台一多源码根本维护不动。下面分维度讲设计目的,同时对比如果不这么做会遇到什么坑。
2026-09-22 21:44:01
143
原创 Linux内核驱动开发——boot loader
USB 转串口连接开发板,看开机 log、进入 U-Boot 命令行、设置 bootargs、bootcmd。连接方式与普通串口相同,设置好串口号,以及波特率、数据位、校验位、停止位、流控位,直接就可以建立连接,通过该软件,充当一个类似于Ubuntu里的terminal进行操控板子上的Linux系统,内核启动参数,内核会把。。本质不是内核做全局重定向,而是进程打开 TTY 设备作为自己的 0/1/2 文件描述符,和 PC 上打开终端窗口原理一样(PC 是 PTY,开发板这里是硬件 UART TTY)。
2026-09-21 21:53:03
89
原创 交叉编译——动态库使用
由于我是在imx6ull上运行,是arm环境,所以是需要在imx6ull的Linux系统里,把这个.so的库文件拷贝到系统库的目录里。由于我使用测试是在Ubuntu下编程,然后放到imx6ull上运行,所以编译工具改成。arm-linux-gnueabihf-gcc ,所有的gcc全部替换成这个。完成之后可以用ldd main查看文件依赖路径,看动态库是否连接成功。执行完,当前目录得到。
2026-09-21 12:02:04
145
原创 IMX6ULL裸机开发——PWM
i.MX6ULLipg_clk①、此部分是一个选择器,用于选择 PWM 信号的时钟源,一共有三种时钟源:ipg_clk、ipg_clk_highfreq 和 ipg_clk_32k。②、这是一个 12 位的分频器,可以对①中选择的时钟源进行分频。③、这是 PWM 的 16 位计数器寄存器,保存着 PWM 的计数值。④、这是 PWM 的 16 位周期寄存器,此寄存器用来控制 PWM 的频率。⑤、这是 PWM 的 16 位采样寄存器,此寄存器用来控制 PWM 的占空比。
2026-09-20 21:10:17
242
原创 IMX6ULL裸机开发——RGBLCD
LCD 液晶显示器:Liquid Crystal Display,液晶显示,液晶本身不发光,靠控制透光来显示画面,需要背光。
2026-09-19 17:15:58
125
原创 IMX6ULL裸机开发——ADC
ADC = Analog-to-Digital Converter,模数转换器,把转换成,让数字电路可以量化读取并运用模拟信号:电压、电流、温度传感器输出、音频等,数值连续;数字信号:0/1 组成的二进制数值,只能取有限个档位。决定能把参考电压切分成多少份。常见:8bit、10bit、12bit、16bit。
2026-09-17 20:02:19
135
原创 IMX6ULL裸机开发——I2C通信协议
i.MX6ULL 有 4 路 I2C 外设:I2C1~I2C4,硬件为,裸机无 Linux I2C 驱动,直接操作寄存器,支持标准模式 100K、快速模式 400K。最快典型模式3.4M硬件引脚(复用为 I2C 功能,开漏输出,必须外部上拉)
2026-09-16 21:35:07
174
原创 IMX6ULL裸机开发——串口收发数据
UART(通用异步收发器,Universal Asynchronous Receiver/Transmitter),是嵌入式中最常用的,实现 CPU 内部并行数据与外部串行比特流相互转换。
2026-09-16 10:14:14
205
原创 IMX6ULL裸机开发——EPIT与GPT
EPIT 核心逻辑:计数器从 LR 值向下递减,一般都是设计比较值为0,所以减到 0 产生中断,硬件自动重载 LR 的值,循环往复。示例:IPG=66MHz,预分频 65(66 分频),LR=1000000 计数频率 = 66M/(65+1)=1MHz,LR=1000000 → 定时 1s。i.MX6ULL 的多功能通用定时器,共 2 路(GPT1、GPT2),32 位向上计数器,同样带 12 位预分频器与多时钟源选择。,只用于产生稳定的周期性中断,适合操作系统系统节拍、定时采样、周期性任务。
2026-09-14 20:17:32
199
1
原创 IMX6ULL裸机开发——系统主频和时钟配置
所有 PLL 都基于这个 24MHz 倍频;CCM 模块管理全部时钟选择、分频、门控;内核主频来自PLL2 的 PFD(PLL Fractional Divider,小数分频):528MHz 输入分出 4 路常用时钟:PFD0=352M、PFD1=594M、PFD2=396M、PFD3=297M,是 AHB/IPG 外设总线的常用时钟源。
2026-09-14 19:55:18
222
原创 IMX6ULL裸机开发——按键输入和中断
以 GPIO1_IO18(KEY0)为例,板载外部 10K 上拉,按下为低电平。配置该按键正常工作的流程如下:时钟 → IO 复用 (IOMUXC) → GPIO 方向 → 上下拉 / HYS →(可选外部中断)中间配置的步骤基本与配置普通GPIO流程类似,只不过这里配置为输入模式读取电平可以采用主函数阻塞轮询的方式读取,也可选择中断响应的方式获取外部引脚电平信号ICR寄存器负责管理外部中断触发的电平形式,可选上升沿,下降沿,高低电平,双边沿触发,这里选择的是下降沿触发的方式。
2026-09-14 19:39:53
230
原创 IMX6ULL裸机开发——GPIO的使用
i.MX6ULL 是 Cortex‑A7,ARM32,无操作系统,直接操作寄存器;。GPIO 使用前必须先开启 IO 时钟 → 设置 IO 复用功能 → 设置电气属性 (PAD) → GPIO 方向 → 输入 / 输出读写;这里以GPIO1_3举例子。
2026-09-13 20:51:07
220
原创 IMX6ULL裸机开发基础
start是向量表,必须被链接脚本放置在 0x0 地址(或者 CPU 映射的向量基地址)。如果你的 lds 脚本没有把_start段放到向量基址,向量表跑在其他内存地址,CPU 异常发生不会跳转到这里,整个异常体系失效。标准 ARM 异常向量表布局ARM32 复位之后 PC 从 0 地址取指,向量表 8 条:复位、未定义、swi、预取中止、数据中止、保留、IRQ、FIQ。切换处理器模式初始化各模式栈cps #模式编码。
2026-09-09 21:36:45
149
原创 ARM汇编语言
由于异常处理向量表的地址是从0x00开始偏移,所以起始的物理地址,都要留给异常处理函数的向量表。其中AL为默认状态不需要单独指出,,此时 N 符号位不可信。V=1 代表本次减法发生。
2026-09-08 21:02:09
185
原创 数据结构-复习
内存泄漏:动态申请的堆内存 (malloc /calloc/new),使用完没有释放,并且丢失了这块内存的地址,程序再也无法回收这块内存。内存来自堆 heap,不是栈(栈自动释放,不存在泄漏)后果:内存越吃越多,长期运行程序卡顿、崩溃、被系统杀死,所以使用完成之后必须手动free()排查工具:valgrindvalgrind --leak-check=full ./可执行程序definitely lost:确定泄漏(必须修复)indirectly lost:间接泄漏,子节点没释放。
2026-09-04 17:03:42
252
原创 网络编程-复习
开源免费的网络数据包捕获 & 协议分析软件,俗称抓包工具Wireshark。捕获数据包:抓取经过网卡的网络流量(TCP、UDP、HTTP、DNS 等数据包)优快云博...分层解析数据包:把原始二进制数据包拆开,展示 OSI 每一层的详细字段,比如 IP 地址、端口、序列号、SYN/ACK 标志位优快云过滤数据包:筛选出你想看的流量(指定 IP、端口、协议)追踪会话:查看一条完整 TCP 连接全过程,观察三次握手、四次挥手排查网络故障:定位丢包、延迟、连接失败问题学习网络协议。
2026-09-03 21:48:09
333
原创 Linux编程-复习
程序的一次运行实例称为进程,程序被加载进内存、操作系统为它分配资源后,正在运行的实体进程是操作系统资源分配的最小单位。资源包括:内存空间、文件描述符、信号处理表、工作目录、用户权限等。虚拟地址是操作系统为每个应用进程独立分配的虚构内存地址,并非内存条上真实的物理地址。所有程序代码、指针操作、变量地址,全程使用的都是虚拟地址,CPU 不会直接通过虚拟地址读写真实内存。硬件 MMU + 系统页表会自动完成虚拟地址→物理地址的映射转换: 进程只认虚拟地址,无需感知真实内存位置;
2026-09-02 19:34:10
270
原创 网络编程-HTTP协议
是,用来在浏览器 (客户端) 和 Web 服务器之间传输数据,基于。通信流程:客户端发起 TCP 连接 → 发送 HTTP 请求 → 服务器返回 HTTP 响应 → 可选关闭 TCP。
2026-09-02 10:33:18
217
原创 SQLite数据库
*** @brief sqlite3_exec 查询结果回调函数* @param arg 自定义参数,此处传入表头打印标记变量的地址* @param columns_num 当前行的字段总数量* @param value 字符串数组,保存一行记录的数据内容* @param value_name 字符串数组,保存各个字段的名称(表头)* @return 返回0,表示回调处理正常结束*/// 将void*通用指针转换为int指针,接收外部传入的表头标记int i = 0;
2026-08-29 10:40:46
221
原创 Linux编程-并发TCP服务器实现与IO多路复用
一个进程,通过一块内核监控,同时监听多个文件描述符 (fd),哪个 fd 就绪(可读 / 可写 / 异常),就去处理哪一个。不需要创建进程、线程;单进程就可以并发处理多个客户端selectpollepoll三种并发方案对比方案并发方式优点缺点fork 多进程服务器一客户端一子进程编程简单,进程隔离稳定资源开销巨大;进程切换消耗高;僵尸进程问题pthread 多线程服务器一客户端一线程开销比进程小线程竞态、共享资源需要锁;多线程调度开销。
2026-08-27 21:29:49
322
原创 Linux编程-socket网络编程之UDP
核心特点UDP 是无连接,没有握手,不需要 、UDP 服务端不需要知道客户端是谁,客户端第一次发消息过来,服务器才获取到客户端地址。UDP 客户端可以调用一次 ,不是建立连接,只是在内核缓存服务器地址,之后就可以直接用 send/recv,不用每次填地址。通用收发函数的使用:练习:使用UDP基于多线程或多进程,实现点对点双向通信。多进程实现:server服务器端代码:阶段 1:服务器初始化(fork 之前,父子共享 serfd 文件描述符) 创建 UDP 套接字文件描述符 serf
2026-08-25 21:11:22
208
原创 Linux编程-socket网络编程之TCP
Socket 支持跨不同主机通信,Socket 既支持本机(本地域套接字 AF_UNIX),也支持。
2026-08-22 21:04:48
221
原创 Linux编程-IPC通信之sig信号与systemV共享内存
信号是,内核作为中间人,给进程发送一个整型编号(SIGUSR1、SIGUSR2 常用自定义信号),Linux 中一种,内核发给进程的简短通知,告知进程发生了某个事件。
2026-08-22 19:47:58
350
原创 Linux编程-线程间通信
1. **互斥条件(Mutual Exclusion):** 资源一次只能被一个进程使用。就像筷子一次只能被一个人拿起来。2. **请求与保持条件(Hold and Wait):** 进程在持有至少一个资源的同时,又请求新的资源,而这个资源被其他进程占用。就像哲学家拿起左边的筷子,又等待右边的筷子。3. **不可剥夺条件(No Preemption):** 进程已经获得的资源,在未使用完之前,不能被其他进程强行剥夺。就像哲学家拿起的筷子,不能被其他人抢走。
2026-08-20 21:36:59
178
原创 Linux编程-线程
早期 Linux,只有进程。进程是资源分配的最小单位,创建进程fork()会复制页表、文件描述符、内存空间,开销大;进程间切换要刷新 TLB、更换地址空间,上下文切换开销高;多任务如果全部用多进程,系统性能损耗很大。Linux 内核没有单独的 “线程” 内核对象,。内核提供clone()系统调用,clone()可以选择性共享:虚拟地址空间、文件描述符、信号处理、用户 ID 等资源。
2026-08-18 21:30:05
221
原创 Linux编程-标准IO、系统IO、系统调用函数总结
打开 / 创建文件,返回文件描述符 fd。 flags:O_RDONLY、O_WRONLY、O_RDWR、O_CREAT、O_TRUNC、O_APPEND mode:仅新建文件时生效,设置文件访问权限。 关闭文件描述符,内核释放对应文件资源;进程结束内核自动回收,建议手动调用。三、目录操作函数,DIR*1. 目录打开、关闭 打开指定目录,返回目录流指针;失败返回 NULL。 关闭目录流,释放资源,与 opendir 成对使用。3. 目录流位置控制 将目录读取偏移重置到
2026-08-16 22:04:10
182
原创 Linux编程- 文件与目录操作
在获取文件权限组的时候,我们常采用掩码,按位与的形式获取,而一次性将用户、组、其他的掩码按位或组合在一起,然后再和st_mode进行按位与,即可取出八进制数的文件权限组。其中,对于文件类型的属性,该位st_mode为32位无符号整型数,但是内核真正只使用低 16 位存放文件类型 + 权限,高 16 位保留 / 未使用;返回的DIR为系统定义的文件指针,可以用于接下来的readdir函数传入,读取文件信息。练习:打印当前文件所在的路径,将路径切换到主目录下,在主目录创建123.txt文件。
2026-08-13 21:25:59
185
原创 Linux编程-标准IO和系统IO
标准 I/O(C 库stdio.hFILE *文件指针,工作在用户空间。系统调用(open/read/write)直接操作内核;标准 I/O 在用户层增加缓冲区,用来减少频繁系统调用,提升 IO 效率。Linux系统下,默认打开了三个文件流,分别为stdin、stdout、stderr,文件流结构体成员如下,文件流fd编号固定为stdin 固定为。
2026-08-12 21:33:19
382
原创 Linux编程-日志打印
在使用时需要注意年份和月份,年份给出的是1900至今,因此需要加上1900才是实际年份,月份中为0-11同样需要加1才为实际月份。最后实现思路为,通过time获取日期秒数,通过localtime将秒数转化为具体日期的年月日时分秒。成功时,返回自纪元以来的秒数。tm_sec 分钟后的时间秒数,通常在 0 到 59 范围内,但可高达 60,以容纳闰秒。与printf相同的是,最后的输出数据格式都是通用的,不同的是,输出格式之前的。tm_yday 自1月1日开始的天数,范围为 0 到 365。
2026-08-12 08:54:16
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅