自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 链表【+逆序链表】、循环队列、堆栈讲解(头插法和尾插法)

链表是一种常用的数据结构。相较于数组,链表的好处在于可以动态地分配内存空间,因此可以适应更为灵活的内存需求。数据域和指针域。数据域存储节点的数据,指针域指向下一个节点。将所有的节点连接起来,就形成了一个链表。可以动态地分配内存空间,不受固定大小的限制;插入和删除操作效率高,时间复杂度为O(1);可以轻松地实现栈、队列等数据结构。随机访问不方便,需要遍历整个链表;内存空间占用较大,因为每个节点都需要额外的指针域;不支持快速排序等高级算法。队列是一种特殊的线性表结构,它只允许在队尾。

2023-05-31 20:44:52 2955

原创 多线程环境中的共享变量怎么保护起来的(volatile关键字与互斥锁)

在C语言中,使用volatile关键字可以告诉编译器某个变量是易变的,需要每次从内存中读取或写入,而不是对变量进行优化缓存。因为编译器会对变量进行各种优化,比如寄存器优化、指令重排等等,这些优化可能会导致变量的读写顺序出现问题,从而导致程序错误。在多线程编程中,如果一个变量被多个线程同时访问和修改,那么就会出现竞态条件问题,为了避免这种问题的发生,需要使用同步机制来保护共享变量。但是,同步机制仅能确保互斥访问,不能确保变量访问操作的顺序性和完整性。

2023-05-29 19:25:10 1924

原创 IMX6Ull内核移植详细过程讲解

此外,某些后缀名为 .mod 的文件,如 .mod.c、.mod.o 和 *.mod.map 等文件,是由内核构建系统创建的,用于跟踪内核模块的依赖关系,并在模块加载时加载符号表等信息。例如,在内核编译过程中,会生成大量的模块文件(.ko 文件)、设备树二进制文件(.dtb)、调试信息文件(.dwo)等,而这些文件对于内核的编译和链接来说并不是必需的,因此可以将它们忽略掉,从而减少编译和链接所需的时间和空间。其中,-j 参数用于指定并发编译的线程数。生成的配置文件包含了编译内核所需的各种选项和参数。

2023-05-16 17:11:26 627 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 1227

原创 Linux嵌入式uboot使用tftp网络启动加载zImage、设备树

先来讲一下为什么要使用tftp网络启动加载zImage和设备树。在做驱动开发学习的时候,我们每次涉及到一个学习目标,比如学习led灯设备驱动开发,我们需要去设备树中添加节点,然后进行编译,编译好之后需要将我们的设备树和zImage文件上传到开发板,替换掉开发板上面相对应的文件,然后进行重新启动。所以为了方便,可以使用Linux嵌入式uboot使用tftp网络启动加载zImage、设备树。也就是每次开启的时候,会从我们虚拟机tftpboot。

2023-04-23 15:03:54 673

原创 Linux下ds18b20驱动开发获取温度

对ds18b20不了解的可以查看这篇文章,讲解的比较详细的:STM32一线协议-DS18B20温度传感器采样实现源码是根据上一届学长的,想要参考的可以去拜访一下gitee:代码链接在路径下修改设备树:主节点:从节点:在源码路径下执行进行编译:成功。涉及到的tftp相关的知识不懂的可以参考这篇文章:wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器将我们源码下的和文件加载到开发板:然后tftp命令将我们的两个文件上传到我们的开发板即可。修改开发板上的这两个文件:修改好只有

2023-04-22 17:05:32 1044 3

原创 C语言编写自己的日志系统

在我们自己做项目过程中会用到日志系统来记录程序的信息,这就需要我们自己来完成日志系统。回滚的话暂时没用到,后面用到了在搞搞。

2023-04-19 17:15:31 1537

原创 IGKBoard(imx6ull)-Linux下TTY串口编程

简单来说,tty 是 Teletype / Teletypewriter 的缩写。而 Teletype / Teletypewriter 的中文意思则是电传打字机。点击打开(对终端、命令行和shell等的理解)终端 = tty = Teletype / Teletypewriter = 电传打字机(可以这样理解)简单来说,tty 是终端的统称。早期的终端是电传字打印机(Teletype / Teletypewriter),英文缩写就是 tty。

2023-04-09 10:19:13 448

原创 信号、以及安装信号signal()与sigaction()函数讲解(实例代码)

早期Unix系统中的信号机制比较简单和原始,信号值小于SIGRTMIN的信号都是不可靠信号。由于原来定义的信号已有许多应用,不好再做改动,最终只好又新增加了一些信号,并在一开始就把它们定义为可靠信号,这些信号支持排队,不会丢失。sigaction()==来说,它们都不能把SIGRTMIN以前的信号变成可靠信号(都不支持排队,仍有可能丢失,仍然是不可靠信号),而且对SIGRTMIN以后的信号都支持排队。对于信号发送函数来说也是一样的。之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。

2023-04-06 14:04:02 1146

原创 printk日志级别以及Linux内核atomic_set介绍

printk是 Linux 内核中用于输出信息的函数,它可以将信息输出到各种不同的设备和位置,例如控制台、串口、日志文件等。printk 函数的输出会被写入内核的环形缓冲区中,并由一个或多个后台进程将其传输到目标设备或位置。可以使用dmesg命令来查看内核环形缓冲区中的输出消息。此外,也可以将 printk 输出重定向到其他设备或位置,例如串口或日志文件。需要注意的是,由于 printk 函数可能会在中断上下文或原子上下文中被调用,因此需要遵循一些特殊规则来确保其安全性和可用性。

2023-04-03 16:21:45 1970

原创 Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍

中断处理程序通常被分为两个部分:顶半部分和底半部分,也称为上半部分和下半部分。我们在使用request_irq申请中断的中断服务函数属于中断处理的上半部,只要中断触发。那么中断处理函数就会执行。然而一些中断的产生之后需要较长的时间来处理,如由于网络传输产生的中断, 在产生网络传输中断后需要比较长的时间来处理接收或者发送数据,因为在linux下中断并不能被嵌套。

2023-04-02 17:34:44 639

原创 GIC中断控制器、设备树插件(Device Tree Overlay)以及内核定时器介绍

在我们做按键设备开发之前我们需要掌握必要的基础知识,下面详细介绍。主要参考资料:[野火i.MX Linux开发实战指南]GIC中断控制器、设备树插件(Device Tree Overlay)以及内核定时器介绍

2023-03-30 11:17:31 835 1

原创 Linux下LED设备驱动开发(LED灯实现闪烁)

前面我们介绍了Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统等,大家看这篇文章之前需要提前知道的基础都在这篇文章中:Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍有部分函数没有涉及到的最后会讲解。

2023-03-27 19:26:39 1923

原创 Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍

Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍我们实现设备驱动开发的时候,需要提前了解一些基础知识,下面慢慢介绍。主要参考资料:[野火i.MX Linux开发实战指南]

2023-03-25 11:57:21 3033 3

原创 UNIX环境高级编程-多进程、多线程编程

线程函数执行完毕退出,或以其他非常方式终止,线程进入终止态,但是为线程分配的系统资源不一定释放,可能在系统重启之前,一直都不能释放,终止态的线程,仍旧作为一个线程实体存在于操作系统中,什么时候销毁,取决于线程属性。这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。

2023-03-22 16:22:22 537

原创 Linux下字符设备驱动开发以及流程介绍

Linux内核设计哲学是把所有的东西都抽象成文件进行访问,这样对设备的访问都是通过文件I/O来进行操作。字符设备、块设备、网络设备。字符设备对数据的处理按照字节流的形式进行的。典型的字符设备:串口、键盘、触摸屏、摄像头、I2C、SPI、声卡等;应用程序能够使用系统IO函数open、write、read、lseek、close…来就行访问。

2023-03-19 12:16:03 1367

原创 Linux驱动开发入门与hello驱动开发介绍

现在我们从一个比较高的高度来审视一下GNU/Linux操作系统的体系结构。如下图所示,最上面是用户(或应用程序)空间,这是用户应用程序执行的地方。用户空间之下是内核空间,Linux内核正是位于这里。C基础库(如glibc, eglibc, uclibc等)也属于应用程序空间,它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。

2023-03-17 19:21:00 603

原创 UNIX环境高级编程-网络socket编程

socket 的原意是”插座“,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

2023-03-13 15:59:02 1009 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 2703

原创 行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍

可以理解为:内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。后面讲到的内核缓冲区以及用户缓冲区能够更好理解缓冲区的作用。缓冲区其实可以算是保护我们的硬件的,所有的磁盘都是有寿命限制的(读写的次数不是无限的),到了一定的程度就坏了。所以就将我们要读写的内容都放在缓冲区中,统一进行读写,减少次数。缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。

2023-03-06 11:28:56 3129 1

原创 IGKBoard(imx6ull)-SPI接口编程-回环测试

想要使能40pin扩展口的SPI1的话,需要修改开发板上的DTOverlay配置文件,添加该管脚对SPI1的支持,具体修改具体方法为修改 eMMC 启动介质的 boot 分区下的 config.txt 文件,将dtoverlay_spi1的选项修改为yes,然后重启应用就可以了。虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它。当然,如果要使用上述的参数的话,需要头文件。

2023-03-04 14:55:27 437

原创 IGKBoard(imx6ull)-I2C接口编程之SHT20温湿度采样

从时序中我们可以看见如果需要读和写的话需要发送1个字节数据然后等待从设备响应返回ACK,但是如果使用ioctl系统调用初始化好i2c设备后,设置从设备地址后,便可以使用write和read系统调用进行数据的写入和读取,方便很多。下面右图:我们常用红色框选中的命令,使用非保持主机模式(no hold master)的命令,可以使sht20在测量时候,释放i2c总线,使得主机可以处理其他从设备的通信任务。显示的是以十六进制表示的设备地址的编号,40(16进制)即1000000(2进制)。

2023-03-02 21:13:33 887

原创 IGKBoard(imx6ull)-ADC编程MQ-2烟雾传感器采样

ADC是Analog-to-Digital Converter的缩写,指模数转换器。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式,模数转换器可以实现这个功能。ADC就是数模转换,将模拟量转换为数字量。总之,只要是需要模拟信号转为数字信号的场合,那么肯定要用到ADC。很多数字传感器内部会集成 ADC,传感器内部使用 ADC来处理原始的模拟信号,最终给用户输出数字信号。分辨率:采集精准度的重要因素。

2023-03-01 14:15:09 1220 1

原创 IGKBoard(imx6ull)-PWM编程蜂鸣器编程控制

是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化。高电平占多一点,也是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是PWM的频率要大于我们人眼识别频率(大约80Hz以上最好)。在电机驱动、无源蜂鸣器驱动、LCD屏幕背光调节、逆变电路等都会有应用。是指1秒钟内信号从高电平到低电平再回到高电平的次数(如下图一个周期),即一秒钟PWM有多少个周期。

2023-02-28 13:55:05 396

原创 IGKBoard(imx6ull)-Input设备编程之按键控制

Input子系统是Linux对输入设备提供的统一驱动框架。如按键、键盘、触摸屏和鼠标等输入设备的驱动方式是类似的,当出现按键、触摸等操作时,硬件产生中断,然后CPU直接读取引脚电平,或通过SPI、I2C等通讯方式从设备的寄存器读取具体的按键值或触摸坐标,然后把这些信息提交给内核。使用Input子系统驱动的输入设备可以通过统一的数据结构提交给内核,该数据结构包括输入的时间、类型、代号以及具体的键值或坐标,而内则通过/dev/input目录下的文件接口传递给用户空间。

2023-02-26 16:52:54 213

原创 linux下C语言与GTK3.0实现数据库(sqlite3)课程设计-客户运送(client transportation)

花了大概10天的时间吧,边学边做,前期对GTK根本不了解的,但是照猫画虎还是没问题的。增删改查大概都可以实现的。课程设计涉及到的内容: - 编程语言:C语言 - 图形界面:GTK3.0 - 数据库:sqlite3

2023-02-21 22:55:45 2024 4

原创 C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现

是纳米、纳秒等计量单位的开头字母,一纳秒是10的负9次方秒,是10的负6次方毫秒,是10的负3次方微秒。(后面我们毫秒级的实现也是根据nanosleep函数实现的)这是因为后面讲到的usleep函数中微妙级的实现是根据nanosleep函数实现的。具体实现是根据nanosleep函数实现的,其实我们也可以自己去实现ms的级别运算。可以看见我们函数主要是根据usleep函数实现的,仿照这来写的函数程序。其实说实话我们其实直接可以利用微妙级函数直接实现毫秒级的延迟就行。可以看见5s会有一次显示。

2023-01-28 21:27:27 9658

原创 IGKBoard(imx6ull)-GPIO编程之LED灯设备控制

libgpiod是用于与linux GPIO交互的C库和工具。​字符设备(gpiod代表GPIO设备)由于linux 4.8,GPIO sysfs接口已被弃用。用户空间应该使用取而代之的是字符设备。这个库封装了ioctl调用和简单API背后的数据结构。GPIO(General Purpose Input/Output Port)通用输入输出接口。

2023-01-27 22:01:09 1238

原创 IGKBoard(imx6ull)-文件IO之DS18B20温度传感器采样

DS18B20传感器的工作电压范围为3~5.5v,所以其电源连接3.3v和5v都可以。GND:该引脚要连到开发板的GND扩展引脚上;VDD:该引脚要连到开发板的3.3v 或 5v 供电引脚上;DQ:是DS18B20的数据通信引脚,该引脚应该连开发板上具有1-Wire 协议功能的GPIO引脚上;在IGKBoard开发板上,提供了与树莓派兼容的 40Pin扩展引脚,其定义如下。

2023-01-12 20:04:05 202

原创 交叉编译介绍以及测试讲解

在 X86 架构 Linux 系统下进行 C 程序开发时,我们使用系统的 gcc 编译器进行代码的编译,编译生成的可执行程序直接在 X86 架构下的 PC 下运行的,这个过程叫做本地编译 (Native Compile)

2023-01-08 23:14:23 578

原创 wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器

wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器开发板与虚拟机之间的文件传输,以及解决虚拟机与主机不在一个网段内的问题。

2023-01-07 13:37:19 1050

原创 C语言各种查找算法实现(二分查找、三分查找、顺序查找、插值查找、寻找第k小元素)

1- 生成数组(1)手动生成数组(2)自动生成数组2- 判断升降(判断先升后降 先降后升 升序 降序 乱序)3- 顺序查找4- 二分查找(1)二分查找(单调序列)(2)二分查找(先升后降序列)5- 插值查找6- 三分查找(1)三分查找(先升后降)(2)三分查找(单调递增序列)7- 寻找第k小元素(1)预排序查找第k小元素(2)减可变规模查找第k小元素(3)暴力法查找第k小元素

2022-12-14 22:55:07 1331

原创 python爬取武汉二手房房价

局限比较大,只能存放一页的数据,因为这个网站反扒有点恶心,不想搞了,而且获取一页的数据也够了,多了反而数据不好展示。提前说一下,如果获取的内容都是空的,那就直接去网站上刷新一下,因为有个机制,但时候就知道了。想想后面用PowerBI又将数据整理了一下,感觉房价的确实难分析,因为地点太多了。第一次的爬取老师说可能不够好,这的那的,那就再来一次呗。她推荐我们爬取武汉二手房的房价,因为里面的信息比较全。都有注释,具体字符串怎么处理的就不说了,直接用吧。红色圈出来的都需要爬,这老师,有点坑。

2022-11-29 17:19:35 877 3

原创 stm32-OLED显示屏学习

拖了很久的OLED还没实现的,最近实现了,分享一下怎么实现的。图片和文字都试一下。开发板上两个管脚连接到OLED上面的。PB8和PB9管脚。记得换切换模模式为字符模式。然后点击生成字模。记得在设置中将格式设置为C51格式的。复制代码带二维数组中。这里调用的是OLED_ShowChinese()函数。这个可以直接在头文件中声明,因为英文的字符串都是有线程的编码的,可以直接调用。OLED_ShowString(pos_x, pos_y, “WangDengtao”, OLED_FONT16);下

2022-11-26 17:18:27 2311

原创 OSI(open system internet)七层模型介绍以及NAT(Network Address Translation)技术详解

ISO标准是指由『 国际标准化组织 (International Organization for Standardization), ISO 』,OSI是由ISO提供的。NAT(Network Address Translation)技术详解以及DNS域名解析流程

2022-11-21 16:20:12 1223

原创 python爬虫爬取武汉房价信息

Python爬虫爬取房价信息

2022-11-17 21:57:14 967 3

原创 MQTT介绍以及应用(远程控制LEd灯亮灭以及上报温湿度)

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

2022-11-17 21:45:57 2828 1

原创 STM32-ESP8266-JSON格式上报温湿度+远程控制LED灯亮灭项目笔记

这是根据串口USART1(USART2也是一样的)写的代码画出来的比较好理解的图:(CPU接收到数据怎么样进行存储的)我们可以在STM32单片机上通过软件编程实现一个串口接收转发的程序。连接上ESP8266之后,我们需要进行通信,怎么通信呢?

2022-11-15 09:32:09 5078

原创 自定义函数获取buf时snprintf中sizeof(buf)出现问题导致赋值不全

directive output truncated writing 16 bytes into a region of size 4 [-Wformat-truncation=]warning: argument to 'sizeof' in 'snprintf' call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]

2022-11-13 11:12:35 920

原创 SPI协议介绍

SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,它由一个主设备(Master)和一个或多个从设备(Slave)组成,其中主设备启动与从设备的同步通信,从而完成数据的交换。SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,一般需要4根线,事实上3根也可以。MISO主设备数据输入,从设备数据输出。MOSI主设备数据输出,从设备数据输入。SCLK同步时钟信号,由主设备产生。CS从设备使能信号,由主设备控制。

2022-11-12 23:49:59 3826

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除