- 博客(82)
- 收藏
- 关注
原创 【学习笔记】怎么解决/dev/sda3: clean, XXX files, XXX blocks
【学习笔记】怎么解决/dev/sda3: clean, XXX files, XXX blocks
2025-08-25 19:14:08
601
原创 【学习笔记】Protobuf相关知识
protobug内容学习,以及proto中关键字的了解,以及protobuf中bytes类型使用json格式传递数据
2025-06-16 19:32:29
861
1
原创 链表【+逆序链表】、循环队列、堆栈讲解(头插法和尾插法)
链表是一种常用的数据结构。相较于数组,链表的好处在于可以动态地分配内存空间,因此可以适应更为灵活的内存需求。数据域和指针域。数据域存储节点的数据,指针域指向下一个节点。将所有的节点连接起来,就形成了一个链表。可以动态地分配内存空间,不受固定大小的限制;插入和删除操作效率高,时间复杂度为O(1);可以轻松地实现栈、队列等数据结构。随机访问不方便,需要遍历整个链表;内存空间占用较大,因为每个节点都需要额外的指针域;不支持快速排序等高级算法。队列是一种特殊的线性表结构,它只允许在队尾。
2023-05-31 20:44:52
3356
原创 多线程环境中的共享变量怎么保护起来的(volatile关键字与互斥锁)
在C语言中,使用volatile关键字可以告诉编译器某个变量是易变的,需要每次从内存中读取或写入,而不是对变量进行优化缓存。因为编译器会对变量进行各种优化,比如寄存器优化、指令重排等等,这些优化可能会导致变量的读写顺序出现问题,从而导致程序错误。在多线程编程中,如果一个变量被多个线程同时访问和修改,那么就会出现竞态条件问题,为了避免这种问题的发生,需要使用同步机制来保护共享变量。但是,同步机制仅能确保互斥访问,不能确保变量访问操作的顺序性和完整性。
2023-05-29 19:25:10
3073
原创 IMX6Ull内核移植详细过程讲解
此外,某些后缀名为 .mod 的文件,如 .mod.c、.mod.o 和 *.mod.map 等文件,是由内核构建系统创建的,用于跟踪内核模块的依赖关系,并在模块加载时加载符号表等信息。例如,在内核编译过程中,会生成大量的模块文件(.ko 文件)、设备树二进制文件(.dtb)、调试信息文件(.dwo)等,而这些文件对于内核的编译和链接来说并不是必需的,因此可以将它们忽略掉,从而减少编译和链接所需的时间和空间。其中,-j 参数用于指定并发编译的线程数。生成的配置文件包含了编译内核所需的各种选项和参数。
2023-05-16 17:11:26
1041
1
原创 I2C驱动框架介绍以及Linux下sht20驱动开发温湿度传感器获取温湿度
I2C 总线驱动: I2C 总线驱动是对 I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。I2C 设备驱动: I2C 设备驱动是对 I2C 硬件体系结构中设备端的实现, 设备一般挂接在受 CPU 控制的 I2C 适配器上, 通过 I2C 适配器与 CPU 交换数据。I2C 核心: I2C 核心提供了 I2C 总线驱动和设备驱动的注册、 注销方法。
2023-04-25 19:07:03
1523
原创 Linux嵌入式uboot使用tftp网络启动加载zImage、设备树
先来讲一下为什么要使用tftp网络启动加载zImage和设备树。在做驱动开发学习的时候,我们每次涉及到一个学习目标,比如学习led灯设备驱动开发,我们需要去设备树中添加节点,然后进行编译,编译好之后需要将我们的设备树和zImage文件上传到开发板,替换掉开发板上面相对应的文件,然后进行重新启动。所以为了方便,可以使用Linux嵌入式uboot使用tftp网络启动加载zImage、设备树。也就是每次开启的时候,会从我们虚拟机tftpboot。
2023-04-23 15:03:54
1303
原创 Linux下ds18b20驱动开发获取温度
对ds18b20不了解的可以查看这篇文章,讲解的比较详细的:STM32一线协议-DS18B20温度传感器采样实现源码是根据上一届学长的,想要参考的可以去拜访一下gitee:代码链接在路径下修改设备树:主节点:从节点:在源码路径下执行进行编译:成功。涉及到的tftp相关的知识不懂的可以参考这篇文章:wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器将我们源码下的和文件加载到开发板:然后tftp命令将我们的两个文件上传到我们的开发板即可。修改开发板上的这两个文件:修改好只有
2023-04-22 17:05:32
1291
3
原创 C语言编写自己的日志系统
在我们自己做项目过程中会用到日志系统来记录程序的信息,这就需要我们自己来完成日志系统。回滚的话暂时没用到,后面用到了在搞搞。
2023-04-19 17:15:31
2465
原创 IGKBoard(imx6ull)-Linux下TTY串口编程
简单来说,tty 是 Teletype / Teletypewriter 的缩写。而 Teletype / Teletypewriter 的中文意思则是电传打字机。点击打开(对终端、命令行和shell等的理解)终端 = tty = Teletype / Teletypewriter = 电传打字机(可以这样理解)简单来说,tty 是终端的统称。早期的终端是电传字打印机(Teletype / Teletypewriter),英文缩写就是 tty。
2023-04-09 10:19:13
707
1
原创 信号、以及安装信号signal()与sigaction()函数讲解(实例代码)
早期Unix系统中的信号机制比较简单和原始,信号值小于SIGRTMIN的信号都是不可靠信号。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。sigaction()==来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。对于信号发送函数来说也是一样的。之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。
2023-04-06 14:04:02
1584
原创 printk日志级别以及Linux内核atomic_set介绍
printk是 Linux 内核中用于输出信息的函数,它可以将信息输出到各种不同的设备和位置,例如控制台、串口、日志文件等。printk 函数的输出会被写入内核的环形缓冲区中,并由一个或多个后台进程将其传输到目标设备或位置。可以使用dmesg命令来查看内核环形缓冲区中的输出消息。此外,也可以将 printk 输出重定向到其他设备或位置,例如串口或日志文件。需要注意的是,由于 printk 函数可能会在中断上下文或原子上下文中被调用,因此需要遵循一些特殊规则来确保其安全性和可用性。
2023-04-03 16:21:45
3193
原创 Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍
中断处理程序通常被分为两个部分:顶半部分和底半部分,也称为上半部分和下半部分。我们在使用request_irq申请中断的中断服务函数属于中断处理的上半部,只要中断触发。那么中断处理函数就会执行。然而一些中断的产生之后需要较长的时间来处理,如由于网络传输产生的中断, 在产生网络传输中断后需要比较长的时间来处理接收或者发送数据,因为在linux下中断并不能被嵌套。
2023-04-02 17:34:44
801
原创 GIC中断控制器、设备树插件(Device Tree Overlay)以及内核定时器介绍
在我们做按键设备开发之前我们需要掌握必要的基础知识,下面详细介绍。主要参考资料:[野火i.MX Linux开发实战指南]GIC中断控制器、设备树插件(Device Tree Overlay)以及内核定时器介绍
2023-03-30 11:17:31
1424
1
原创 Linux下LED设备驱动开发(LED灯实现闪烁)
前面我们介绍了Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统等,大家看这篇文章之前需要提前知道的基础都在这篇文章中:Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍有部分函数没有涉及到的最后会讲解。
2023-03-27 19:26:39
2741
原创 Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍
Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍我们实现设备驱动开发的时候,需要提前了解一些基础知识,下面慢慢介绍。主要参考资料:[野火i.MX Linux开发实战指南]
2023-03-25 11:57:21
3911
3
原创 UNIX环境高级编程-多进程、多线程编程
线程函数执行完毕退出,或以其他非常方式终止,线程进入终止态,但是为线程分配的系统资源不一定释放,可能在系统重启之前,一直都不能释放,终止态的线程,仍旧作为一个线程实体存在于操作系统中,什么时候销毁,取决于线程属性。这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。
2023-03-22 16:22:22
721
原创 Linux下字符设备驱动开发以及流程介绍
Linux内核设计哲学是把所有的东西都抽象成文件进行访问,这样对设备的访问都是通过文件I/O来进行操作。字符设备、块设备、网络设备。字符设备对数据的处理按照字节流的形式进行的。典型的字符设备:串口、键盘、触摸屏、摄像头、I2C、SPI、声卡等;应用程序能够使用系统IO函数open、write、read、lseek、close…来就行访问。
2023-03-19 12:16:03
2604
原创 Linux驱动开发入门与hello驱动开发介绍
现在我们从一个比较高的高度来审视一下GNU/Linux操作系统的体系结构。如下图所示,最上面是用户(或应用程序)空间,这是用户应用程序执行的地方。用户空间之下是内核空间,Linux内核正是位于这里。C基础库(如glibc, eglibc, uclibc等)也属于应用程序空间,它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。
2023-03-17 19:21:00
727
原创 UNIX环境高级编程-网络socket编程
socket 的原意是”插座“,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
2023-03-13 15:59:02
1275
1
原创 I/O多路复用 - select、poll、epoll讲解(epoll工作图解介绍+红黑树)
epoll的实现机制与select/poll机制完全不同。epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
2023-03-07 16:55:50
3798
原创 行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍
可以理解为:内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。后面讲到的内核缓冲区以及用户缓冲区能够更好理解缓冲区的作用。缓冲区其实可以算是保护我们的硬件的,所有的磁盘都是有寿命限制的(读写的次数不是无限的),到了一定的程度就坏了。所以就将我们要读写的内容都放在缓冲区中,统一进行读写,减少次数。缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。
2023-03-06 11:28:56
5155
1
空空如也
在实现delay_us()微妙延时的时候,出现了一些问题。
2022-10-21
在切割字符串sscanf()函数遇到的问题~
2022-10-15
malloc在自定义在函数内分配后需返回地址如何free(),求解
2022-10-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人