自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 12.高级I/O

前言:本章再次回到文件 I/O 相关话题的讨论,将会介绍文件 I/O 当中的一些高级用法,以应对不同应用场合的需求,主要包括:非阻塞 I/O、I/O 多路复用、异步 I/O、存储映射 I/O 以及文件锁,我们统统把它们放到本章《高级 I/O》中进行讨论、学习。1.非阻塞I/O:当对文件进行读取操作时,如果文件当前无数据可读,那么阻塞式 I/O 会将调用者应用程序挂起、进入休眠阻塞状态,直到有数据可读时才会解除阻塞;

2025-07-09 10:13:55 488

原创 11.线程同步

完成后释放互斥锁(解锁);如果释放互斥锁时有一个以上的线程阻塞,那么这些阻塞的线程会被唤醒,它们都会尝试对互斥锁进行加锁,当有一个线程成功对互斥锁上锁之后,其它线程就不能再次上锁了,只能再次陷入阻塞,等待下一次解锁。读写锁有3 种状态:读模式下的加锁状态(以下简称读加锁状态)、写模式下的加锁状态(以下简称写加锁状态)和不加锁状态(见),一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读 写锁。线程同步的几种不同的方法,包括互斥锁、条件变量、自旋锁以及读写锁,当然,除此之外,

2025-07-09 10:09:39 626

原创 10.关于线程

譬如,如果线程 A 创建了线程 B,线程 B 再创建线程 C,那么线程 A 可以调用 pthread_join()等待线程 C 的终止,线程 C 也可以调用 pthread_join()等待线程 A 的终止;默认情况下,当线程终止时,其它线程可以通过调用 pthread_join()获取其返回状态、回收线程资源,有时,程序员并不关系线程的返回状态,只是希望系统在线程终止时能够自动回收线程资源并将其移除。通过调用 pthread_join()函数来阻塞等待线程的终止,并获取线程的退出码,回收线程资源;

2025-07-09 09:58:32 764

原创 9.进程间通讯

信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问,相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志,除了用于共享资源的访问控制外,还可用于进程同步。消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UNIX 允许不同进程将格式化的数据流以消息队列形式发送给任意进程,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。二是只能在父子或者兄弟进程间使用;

2025-07-09 09:39:13 448

原创 8.关于进程

前言:程序在编译链接时,由链接器将引导代码链接到我们的应用程序当中,一起构成最终的可执行文件。程序运行需要通过操作系统的加载器来实现,加载器是操作系统中的程序,当执行程序时,加载器负责将此应用程序加载内存中去执行。所以由此可知,对于操作系统下的应用程序来说,链接器和加载器都是很重要的角色!1.进程和程序:1.1.结束程序:程序结束其实就是进程终止,进程终止的方式通常有多种,大体上分为正常终止和异常终止,正常终止包括:⚫ main()函数中通过 return 语句返回来终止进程;

2025-07-09 09:37:11 883

原创 7.信号(基础)

前言:信号提供了一种处理异步事件的方法。1.信号:信号是事件发生时对进程的通知机制,也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程,其实是在软件层次上对中断机制的一种模拟。大多数情况下,是无法预测信号达到的准确时间,所以,信号提供了一种处理异步事件的方法。2.信号分类:

2025-07-04 09:11:05 523

原创 6.系统信息和资源

系统在启动时会读取实时时间作为系统时间,然后在系统运行时并对其维护;系统在关机时会将系统时间会写入实时时间中,在关机时并进行同步。但是与普通文件不同的是,proc 文件系统是动态创建的,文件本身并不存在于磁盘。proc 文件系统是一个虚拟文件系统,它以文件系统的方式为应用层访问系统内核数据提供了接口。户和应用程序可以通过 proc 文件系统得到系统信息和进程相关信息。得总和,也就是进程从创建开始到目前得总得CPU时间。,对 proc 文件系统的读写作为与内核。获取当前操作系统内核的名称和信息。

2025-07-03 16:17:33 400

原创 5.字符串处理

。。。。。前言:。。。。。。一.字符串相关操作1.字符串输入、输出<1>字符串输出:常用的字符串输出函数有 putchar()、puts()、fputc()、fputs(),前面我们经常使用 printf()函数来输出字符串信息,而并没有使用到 putchar()、puts()、fputc()、fputs()这些函数,原因在于 printf()可以按照自己规定的格式输出字符串信息,一般称为格式化输出;

2025-07-03 16:04:14 445

原创 4.I/O标准库

0、1、2 这三个是文件描述符,只能用于文件 I/O(read()、write()等),那么在标准 I/O 中,自然是无法使用文件描述符来对文件进行 I/O 操作的,它们需要围绕 FILE 类型指针来进行,在 stdio.h 头文件中有相应的定义,所以,在标准 I/O 中,可以使用 stdin、stdout、stderr 来表示标准输入、标准输出和标准错误。它是一个结构体数据类型的指针,包括用于实际I/O的文件描述符、只想文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节以及出错标志等。

2025-07-03 15:51:17 541

原创 【二】21.SPI总线

物理总线控制器的差异,定义了统一的访问策略和接口;其向上提供了统一的接口,以便。:在stm32mp157d-ark.dts中,通过节点内容追加的方式,添加“spi-xxxx.c 命名的源文件。这些文件就是具体平台对应的 SPI。子系统的核心代码部分,提供了核心数据结构的定。控制器驱动和设备驱动的注册、注销、管理等。控制器驱动程序,它的职责是为系统。从设备对应的驱动程序,比如一些。@后面的数字 就是对应 SPI。总线实现相应的读写方法。:每种处理器平台都有自己的。接口的芯片器件对应的驱动程。

2025-06-26 16:05:02 431

原创 【二】20.I2C总线

编写I2C器件的一个驱动程序,起码实现两个部分,I2C主机驱动和I2C设备驱动。I2C主机驱动:SOC的I2C控制器的驱动程序,一旦写好就不需要再做修改,其他I2C设备直接调用主机驱动提供的API函数完成读写操作即可。I2C设备驱动:挂在I2C总线下的具体设备对应的驱动程序。

2025-06-24 14:48:30 438

原创 【二】19.关于LCD和LTDC

(1)什么是LCD:全称Liquid Crystal Display,其构造是在两片平行得玻璃基板中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。(2)像素格式:本次我们使用ARGB8888这种像素格式,一个像素点是4个字节。(3)LCD屏幕接口:STM32MP1支持RGB接口的LCD,其接口名为LTDC。其框架如下;

2025-06-24 14:37:40 239

原创 【二】18.PWM驱动

(3)屏蔽设备树中其他复用的IO:检查一下设备树中有没有其他外设用到 PA10,如果有的话需要屏蔽掉!注意,不能只屏蔽掉 PA10 的 pinctrl 配置信息,也要搜索一下“gpioa 10”,看看有没有哪里用到,用到的话也要屏蔽掉。TIM1 叫做高级定时器,因为 TIM1 的功能非常强大,主要用于电机驱动。PWM 驱动就不需要我们再编写了,ST 已经写好了,前面我们也已经详细的分析过这个驱。— 触发事件,计数器开始、停止、初始化等。①、16 位的向上、向下自动加载计数器。②、16 位可编程的预分频器。

2025-06-19 16:16:13 208

原创 【二】17.关于L的input子系统

④、卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用 input_free_device 函数释放掉前面申请的 input_dev。②、code:事件码,比如在 EV_KEY 事件中 code 就表示具体的按键码,如:KEY_0、KEY_1等等这些按键。运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>(2)上报输入事件:我们需要将具体的输入值活输入事件上报给L内核。

2025-06-19 10:56:27 709

原创 【二】16.关于MISC驱动

MISC驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用MISC驱动。MISC驱动其实就是简单的字符设备驱动,通常嵌套在platform总线驱动中,实现复杂的驱动。运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>(2)MISC设备会自动创建cdev,不需要我们自己动手创建,因此简化简单字符设备驱动开发的代码编写。(1) MISC设备驱动的主设备号都为10,不同的设备使用不同的从设备号。

2025-06-19 10:53:34 267

原创 【二】15.驱动的分离与分层(platform)

在使用设备树的时候,设备的描述被放到了设备树中,因此 platform_device 就不需要我们去编写了,我们只需要实现 platform_driver 即可。platform驱动(使用古老的“platform-device”)运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>platform驱动(使用设备树向驱动描述设备)运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>

2025-06-18 13:41:42 684

原创 【二】14.异步通知(信号)

摘要:本文介绍了Linux设备驱动中的异步通知机制,通过信号实现类似硬件中断的功能。在应用程序中,需使用signal函数设置信号处理函数,并通过fcntl设置进程状态为FASYNC;在驱动程序中,需定义fasync_struct结构体,实现fasync函数,并在设备可用时使用kill_fasync发送信号。这种机制避免了应用程序主动轮询,实现了驱动主动通知应用的功能。文中还给出了驱动和应用代码的具体实现步骤。

2025-06-16 14:32:46 741

原创 【二】13.阻塞IO && 非阻塞

本文探讨了Linux驱动开发中的阻塞与非阻塞I/O机制。在阻塞模式下,当设备不可用时进程会休眠,通过等待队列实现唤醒;而非阻塞模式则采用轮询方式,使用select/poll/epoll等函数检测设备状态。文章详细分析了两种模式的实现原理:阻塞I/O通过等待队列头和队列项管理进程状态,非阻塞I/O则依靠poll操作函数和轮询机制。特别指出应用程序的select/poll调用与驱动poll函数的交互机制,揭示了内核如何监控socket状态并通知用户进程。通过对比两种I/O模式的特点和实现方式,为驱动开发者提供了

2025-06-16 14:27:03 986

原创 【二】12.关于中断

中断发生以后进入IRQ中断服务函数,在IRQ中断服务函数在数组irqTable里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。中断运用代码如下---------------------------->>>>>>>>>>>>>>>>>>>>>>如果处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。L内核提供了完善的中断框架,我们只需要申请,然后注册中断处理函数即可。

2025-06-10 17:05:50 774

原创 【二】11.L内核定时器的使用

Linux内核提供了两种时间管理机制:定时器API和短延时函数。定时器服务基于全局变量jiffies记录系统节拍数,使用timer_list结构体实现单次定时功能,需通过mod_timer实现周期性定时。内核还提供毫秒/微秒/纳秒级延时函数。应用时需注意定时器超时后自动关闭的特性,并可通过在回调中重新开启实现循环定时。

2025-06-04 14:44:32 453

原创 【二】10.L并发与竞争机制

也就是用于线程与线程之间,被自旋锁保护的临界区一定不能调用任何能够引起睡眠和阻塞的API 函数,否则的话会可能会导致死锁现象的发生。线程 B 无法被调度出去,那么线程 A 就无法运行,锁也就无法释放,好了,死锁发生了!L是一个多任务(线程)的操作系统,会存在多任务共同操作同一段内存或者设备的情况,多任务甚至中断都能访问的资源叫做共享资源,需要保护起来。当一个线程要访问共享资源时应先获取自旋锁,锁只能被一个线程持有,只要此线程不是放持有的锁,那么其他的线程就不能获取此锁。<2>、和信号量一样,

2025-05-29 16:00:44 887

原创 【二】9.关于pinctrl和gpio子系统

为什么要有pinctrl和gpio子系统呢?--->>>因为LZ不在想推着凯迪拉克其上班了。

2025-05-29 13:58:44 968

原创 【二】9.关于设备树简介

3>字符串列表:compatible = "st,stm32mp157d-atk","st,stm32mp157";一个SOC可以做出很多不同的板子,这些不同的板子肯定是有共同的信息,将这些共同的信息提取出来作为一个通用文件,其他的设备树。:描述设备状态,可选状态("okay","disable","fail","fail-sss")。(DTS)采用树形结构描述扳级设备,也就是开发板上的设备信息,每个设备都是一个节点。:决定了设备子节点,reg属性中地址信息用几个32位的字长来表示地址。

2025-05-29 13:53:24 702

原创 【二】8.原始 & 新字符设备 & 设备树 & pingctrl和gpio子系统 --->>>下的LED字符设备驱动

字符设备是按字节流顺序读写的设备,如点灯、按键等。Linux中,驱动加载后会在/dev目录下生成文件,应用程序通过操作该文件控制硬件。驱动可通过编译进内核或模块加载运行,模块加载需注册加载和卸载函数。设备号由主次设备号组成,用于标识设备。驱动开发涉及设备号分配、字符设备注册、操作函数实现等步骤。设备树(DTS)以树形结构描述硬件信息,驱动需从设备树获取节点信息并映射物理地址为虚拟地址,配置寄存器后注册字符设备。驱动出口函数需取消映射并注销设备。pinctrl和gpio子系统简化了硬件控制,驱动代码需实现设备

2025-05-14 15:46:04 817

原创 【二】7.关于设备树

0,节点的 compatible 属性中不包含 compat 指定的字符串;0,读取成功,负值,读取失败,-EINVAL 表示属性不存在,-ENODATA 表示没有要读取的数据,-EOVERFLOW 表示属性值列表太小。:0读取成功,负值,读取失败,-EINVAL表示属性不存在,-ENODATA 表示没有要读取的数据,-EOVERFLOW 表示属性值列表太小。0,读取成功,负值,读取失败,-EINVAL表示属性不存在,-ENODATA 表示没有要读取的数据,-EOVERFLOW 表示属性值列表太小。

2025-05-14 14:46:07 756

原创 嵌入式Linux中常用操作

stat filename 或 ls -il。

2025-05-14 13:39:29 167

原创 【二】6.关于bootcmd和bootargs的设置

本文介绍了在嵌入式系统中配置bootcmd和bootargs的两种方式。bootcmd用于设置启动命令,支持从MMC存储设备或网络(TFTP/NFS)加载镜像文件并启动系统。具体命令包括从MMC加载镜像、从TFTP服务器获取镜像以及通过NFS挂载镜像。bootargs用于设置启动参数,支持从MMC或NFS挂载根文件系统,并配置控制台、网络等参数。通过合理配置这些命令和参数,可以灵活实现系统的启动和挂载方式。

2025-05-13 09:30:04 443

原创 【二】5.关于Linux内核及其移植

至此“.config”文件已经保存了所有的配置项,我们需要将起复制一份到源码目录下的/arch/arm/configs/下,并重命名为stm32mp1_atk_defconfig。在arch/arm/boot/dts/Makefile的“dtb-$(CONFIG_ARCH_STM32)”配置项中添加“stm32mp157d-atk.dtb”。将arch/arm/boot/dts/目录下的“stm32mp15xx-edx.dtsi”复制并重命名为“stm32mp157d-atk.dtsi”。

2025-04-29 09:40:44 586

原创 【二】4.关于U-boot及其移植

前言:Linux系统启动是需要一段。

2025-04-24 14:44:19 1254

原创 【二】3.关于TF-A移植

前言:我们自己做的硬件虽然会以ST官方的EVK作为蓝本,但总归多少会有点差异。那么我们就需要在半导体原厂(ST)提供的TF-A移植来适配到我们的平台。这里的移植起始是个适配到自己硬件的过程,此中存在三者之间的关系:ARM官方、半导体厂商(eg:ST)以及我们自己。TF-A是ARM公司出品的一个软件包。-------》》》而ST公司为针对自家的SOC->MP1将ARM出品的TF-A软件包下载下来,然后将自己的SOC芯片添加进去,最后打包好提供给用户,这就是所谓的SDK包。

2025-04-22 13:56:58 710

原创 【二】2.STM32MP1启动详解

STM32MP157芯片内部是没有给用户使用的FLASH,那么系统代码是需要存储在外部的FLASH中,如。

2025-04-17 17:21:37 176

原创 【二】1.Linux系统移植准备

sudo /etc/init.d/vsftpd restart //重启FTP服务。sudo /etc/init.d/nfs-kernel-server restart //安装ssh服务。sudo /etc/init.d/nfs-kernel-server restart //重启NFS服务。1.1.1开启Ubuntu下的FTP服务。//确保文件中这两行没有#注释掉。

2025-04-16 10:42:54 413

原创 【一】3.关于编辑、编译、GCC和Makefile

在Ubuntu下安装build-essential软件包,提供编译程序所需的所有软件包:sudo apt-get install build-essential //安装软件gcc -v //查看GCC编译器版本号//编译输出可执行文件main从版本查看中可知,这里安装的X86架构CPU上运行的程序。嵌入式开发需要安装ARM架构的GCC交叉编译器。

2025-04-14 16:51:38 201

原创 【一】2.Ubuntu基本操作

shell常用基础命令

2025-04-09 15:21:36 136

原创 【一】1.嵌入式Linux缘起

而移植又是非常痛苦的一件事情, 而且移植完成以后的稳定性也无法保证。即使移植成功以后后续的开发工作也比较繁琐,因为不同的组件其 API 操作函数都不同,没有一个统一的标准,使用起来的话学习成本比较高。这个时候一个功能完善的操作系统显得尤为重要:具有统一的标准;单片机开发很难接触到更高层次的系统方面的知识, 单片机用到的系统都很简单,比如 UCOS。就是这样一个系统,当然这样的系统还有很多, 比如 Windows。提供完善的多任务管理、存 储管理、设备管理、文件管理和网络。等等,这些操作系统都是一个。

2025-04-09 11:02:58 149

原创 3.文件的属性 和 属性操作

文件类型和属性

2025-01-06 17:11:34 897

原创 2.文件I/O之系统调用&库函数(常用基础)

文件I/O。

2025-01-06 16:39:27 1008

原创 1.关于什么是“Linux应用编程”

先认识认识什么是应用编程为何物,这是学习应用编程的先决条件。

2025-01-06 15:13:25 362

原创 一个简单播放器(QMediaPlayer, 代码布局)

qt实现播放器

2024-06-04 15:46:32 289

原创 QT中使用sqlite数据库

直接上源码, 需根据自己的数据库表做修改!

2024-05-24 14:34:56 371

空空如也

空空如也

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

TA关注的人

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