自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小嵌同学的博客

小菜的学习分享

  • 博客(200)
  • 资源 (1)
  • 收藏
  • 关注

原创 SPI驱动学习六(SPI_Master驱动程序)

SPI 是“串行外设接口”的缩写,它在嵌入式系统中广泛使用,因为它是一个简单且高效的接口:基本上是一个多路复用的移位寄存器。它的三个信号线分别为时钟线(SCK,通常在 1-20 MHz 范围内)一个“主机输出从机输入”(MOSI)数据线和一个“主机输入从机输出”(MISO)数据线。SPI 是一种全双工协议;每在MOSI线上移出一位(每时钟一位),MISO线上就会移入一位。这些位在去往和从系统内存传送的过程中会被组装成各种大小的字。一个额外的芯片选择线通常是低电平有效的(nCS);

2024-09-23 00:06:13 957

原创 SPI驱动学习五(如何编写SPI设备驱动程序)

SPI Master(或者说控制器) 通过platform总线设备驱动模型进行实现,SPI Device通过SPI driver驱动模型来实现。SPI设备的设备树节点,会被转换为一个spi_device结构体。在SPI子系统中,用spi_transfer结构体描述一个传输,用spi_message管理多个传输。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。在这个节点下,创建子节点,用来表示SPI设备。将该部分内容添加到主控板的设备树文件中。在设备树里,找到SPI控制器的节点。

2024-09-08 23:31:34 1953

原创 SPI驱动学习四(通过SPI操作外设模块)

首先要确定内核中已经含有spidev。要操作OLED,只需使用SPI接口发送数据,并不需要使用SPI接口读取数据。整体过程与SPI DAC模块类似,将该设备树内容添加到主控板设备树文件,重新编译内核,烧录到主控板重启即可;显存被分为8页、127列,要写某个字节时,需要先指定地址,然后写入1字节的数据。DAC模块接在这个插座上,那么要在设备树里spi1的节点下创建子节点。OLED上有128*64个像素,每个像素只有2种状态:亮、灭。让DC引脚为高,发起SPI写操作即可。对于OLED的初始化,在参考手册。

2024-09-08 19:27:01 797

原创 SPI驱动学习三(spidev的使用)

1. 驱动框架  设备树示例:下图请双击放大查看!!!  设备树里某个spi设备节点的compatible属性等于下列值,就会跟spidev驱动匹配:  匹配之后,spidev.c的会被调用,它会:  spidev.c通过file_operations向APP提供接口,上层通过这些接口操作SPI设备  为了便于大家深入学习,我借助阿里的对整个文件代码进行了注释,在这里分享给大家:二、SPI应用程序分析  内核提供的测试程序:,这里不提供源码,大家自己打开内核源码这个文件,学习驱动源码应该都有。

2024-09-01 22:53:37 1776

原创 SPI驱动学习二(驱动框架)

在SPI Master对应的设备树节点下,每一个子节点都对应一个SPI设备,这个SPI设备连接在该SPI Master下面。在设备树里,会有一个节点用来表示SPI控制器。会在设备树里使用子节点来描述SPI设备。这通常意味着该节点的资源大小是隐含的,或者不需要明确地在设备树中指定资源的大小。考虑一个设备树的片段,其中定义了一个总线节点,并且包含两个子节点:一个内存节点和一个设备节点。, Linux中使用spi_master结构体描述SPI控制器,里面最重要的成员就是。在设备树中,对于SPI Master,

2024-09-01 21:09:00 1747

原创 Linux: SPI应用编程

在 Linux 中,SPI(Serial Peripheral Interface)是一种串行通信协议,用于在主设备(如 CPU)和一个或多个从设备(如传感器、存储器等)之间传输数据。SPI 通信通常通过四个基本信号线进行:时钟(SCLK)、主输出从输入(MOSI)、主输入从输出(MISO)和片选(CS)。

2024-08-29 23:55:54 984

原创 SPI驱动学习一(协议原理)

SPI(Serial Peripheral Interface)协议是一种用于微控制器与外部设备之间串行数据通信的标准接口协议。SPI协议由摩托罗拉公司最初开发,广泛应用于各种电子设备中,如传感器、存储设备、显示器等。SPI是一种同步串行通信协议,允许多个外部设备与主设备(通常是微控制器)进行数据交换。SPI协议的基本通信方式是全双工,即可以同时进行数据的发送和接收。也可以是单向的,数据传输的长度通常以字节为单位。SPI协议没有定义速度限制,读写操作由主设备发起,且外设的写操作和读操作是同步完成的.

2024-08-19 23:27:42 994

原创 Linux 用户管理相关命令与配置文件详解

最近在搞 Linux 的用户管理,所以将一些知识进行简单的整理,分享给大家,也作为自己的学习笔记!passswdshadowgroup配置文件位于/etc目录下,这三个文件记录了系统用户信息以及用户登陆密码,这些文件的生成与修改与adduser、addgroup以及passwd命令相关。走读busybox源码可以发现,使用adduser新增用户时,该命令内部是会调用到addgroup以及passwd命令的实现函数的,所以只使用adduser就可以同时生成或修改这三个配置文件。

2024-08-19 00:14:46 681

原创 C++版设计模式简介 与 初识 工厂模式

关于并发编程的更多内容我会在后续的实际开发中进行总结,然后分享给大家!接下来将会和大家一起学习C++的设计模式😷(1)设计模式 是 软件开发人员在软件开发过程中 面临的一般问题的解决方案。(2)这些解决方案是众多软件开发人员经过 相当长的一段时间的 试验 和 错误总结出来的。(3)使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

2024-08-18 21:24:27 907

原创 Linux 内核RCU机制的使用

RCU背后的基本思想是将更新操作分为“移除”和“回收”两个阶段。移除阶段会删除数据结构中对数据项的引用(可能通过用这些数据项新版本的引用来替换它们),并且可以与读者(读操作)同时运行。之所以能够安全地与读者同时运行移除阶段,是因为现代CPU的语义保证读者将看到数据结构的旧版本或新版本,而不会看到部分更新的引用。回收阶段则执行在移除阶段从数据结构中删除的数据项的回收工作(例如,释放它们)。由于回收数据项可能会干扰同时引用这些数据项的任何读者,因此在读者不再持有对这些数据项的引用之前,回收阶段不能开始。

2024-08-11 22:42:47 990

原创 Modbus协议了解与简单使用

Modbus 是一种串行通信协议,用于工业自动化系统中的数据传输。它被广泛应用于监控和控制设备。Modbus 协议由 Modicon(现在是施耐德电气的一部分)在 1979 年开发,用于其 PLC(可编程逻辑控制器)中。它是一种开源协议,可以在不同类型的网络和设备中使用。它是用于在电子设备之间的串行线路上传输信息的方法。

2024-07-21 21:01:37 921

原创 基于syslog协议的Linux系统日志服务程序的了解与使用

syslog协议是一种标准化的方法,用于在网络设备间传输日志信息,允许各种设备如服务器、路由器、防火墙等,将日志消息发送至中央日志服务器,便于集中管理与分析。以下是syslog。

2024-07-14 22:57:28 1026

原创 Linux于自动化编译程序命令——make

在Linux系统中,make命令是一个强大且有用的工具,它被广泛用于构建和管理软件项目。本文将详细介绍make命令的使用以及它在开发过程中的重要性。

2024-06-23 23:18:29 1416

原创 解析中断引起的调度延迟问题

  硬件中断和软件中断都有可能导致调度延迟,但两者的影响方式略有不同。  硬件中断:当硬件设备发送中断请求时,CPU 会立即响应中断并执行对应的中断处理程序。在处理硬件中断时,CPU 会暂时中断当前任务的执行,切换到中断处理程序,处理完中断后再切换回原任务。硬件中断有可能打断正在执行的任务,引起调度延迟。  软件中断:软件中断是由软件程序触发的中断,通常是通过系统调用或软中断指令来实现。软件中断不像硬件中断那样突然而来,一般在优先级比较低,不会立即打断正在执行的任务。但是,软件中断也需要处理,其处理过程可能

2024-06-10 23:21:01 1216

原创 深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD(Memory Technology Device)子系统是Linux内核的一个组成部分,它为各种类型的闪存和EEPROM设备提供了一个统一的接口。/dev/mtd*和,它们的用途、区别以及如何在实际场景中应用这些知识。MTD(Memory Technology Device)子系统是 Linux 内核中的一个子系统,用于管理非易失性存储器设备,如闪存芯片(NAND、NOR 等)。

2024-03-26 00:04:40 5001 1

原创 Linux:管道文件及相关API

在 Linux 系统中,管道是一种非常常用的进程间通信机制,它简单、高效,并且易于使用。本文将深入介绍 Linux 管道的原理、分类、特点以及使用方法,帮助读者更好地理解和应用管道在系统编程中的重要性。在 Linux 系统中,管道文件相关的 API 主要包括pipe()mkfifo()open()read()write()等函数。

2024-03-03 23:18:38 2216

原创 Linux: shm_xx系列函数使用详解

分离共享内存段后,如果没有其他进程仍然连接着该共享内存段,系统会释放该共享内存段,从而释放相关资源。函数是用于生成 System V IPC 键值的一个实用工具函数,可以通过指定文件路径和项目标识来确保生成唯一的键值,用于进程间通信的各种资源的创建和访问。函数时,需要注意确保对共享内存的大小和权限的设置,避免潜在的问题,比如内存溢出或者权限不足等。函数的返回值是共享内存标识符(shmid),用于后续对共享内存段的访问操作,比如连接共享内存、获得共享内存的地址等。

2024-03-01 00:31:36 1920

原创 初识 Rust 语言

自Linux 6.1起,初始的Rust基础设施被添加到Linux内核中。此后为了使内核驱动程序能够用Rust编程语言编写,Linux内核已经合并了许多其他管道和内务管理工作。随着即将到来的Linux 6.8内核周期,第一个Rust网络驱动程序将被引入。去年vivo开发者大会上发布的蓝河操作系统,也使用了Rust语言进行开发。作为一名软件开发人员,对于新技术总要保持着好奇心和不断进取的精神,过年抽空简单看了看Rust语言,在这里简单总结分享一下!

2024-02-18 23:18:59 1505

原创 Linux:简单聊聊线程调度

在 Linux 中,线程调度是由内核管理的过程。内核负责根据预定义的调度策略和优先级来决定哪个线程在给定的时间点运行。它的目标是提高系统的并发能力、公平性和响应性。下面是一些关于 Linux 线程调度的详细信息:调度策略SCHED_OTHER(默认):基于时间片轮转的策略,允许多个线程共享 CPU 时间。SCHED_FIFO:先进先出策略,优先级高的线程会一直运行,直到它主动放弃 CPU。SCHED_RR:基于时间片轮转的策略,优先级高的线程运行一段时间后被抢占。

2024-01-28 18:27:27 1855 1

原创 C语言:va_xx、getopt_xx、str_xx等函数

在C语言学习过程中,有些函数并不会怎么见,但是在工作以后经常会见到和使用。今天在这里和大家简单介绍一下。

2024-01-14 20:12:42 972

原创 Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx

本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件,共同学习!/proc/kmsg是一个特殊的文件,它提供了内核消息缓冲区的访问,这个缓冲区包含了内核产生的所有消息,包括各种调试和错误信息,如内核的启动打印。/proc/kmsg文件通常只能被 root 用户或具有相应权限的用户读取。这个文件通常被用于调试和故障排除,因为它可以提供关于内核发生事件的详细信息。注意:这是一个缓冲区,所以其内的数据是会被刷新覆盖的!!!一般情况下,你可以使用以下方式来使用/proc/kmsg。

2024-01-14 19:13:08 2903

原创 Linux:NTP校时、PTP校时

在进行网络协议通信时,我们有时候需要计算通信的延迟。一般的方式就是:A端获取本地时间信息并将其填充到网络数据包中进行发送,B端收到数据包后进行解析获取到A发来的时间,然后B获取本地时间进行运算,网络延迟 = B端本地时间 - A端本地时间。NTP(Network Time Protocol)是一种用于同步计算机时间的协议。它能够确保计算机时钟与全球统一的时间标准保持同步。NTP使用一组分层的时间服务器来提供准确的时间参考。顶层的时间服务器会从原子钟或其他高精度时间源获取时间,并将它们传播到更低层的服务器。

2024-01-12 00:59:20 4302

原创 Linux:/proc/sys/vm/目录各文件详解

proc/sys/vm/ 目录是 Linux 系统中的一个特殊目录,它包含了与虚拟内存子系统相关的系统内核参数。这些参数可以用来配置系统的虚拟内存管理策略,包括内存分配、页面置换、内存压缩、NUMA 等方面的设置。用户和系统管理员可以通过修改这些内核参数来调整系统的内存管理行为,以优化系统性能或满足特定的应用需求。

2024-01-01 23:41:03 2288

原创 Linux:查询当前进程或线程的资源使用情况

proc 目录是一个特殊的虚拟文件系统,它提供了对内核运行时信息的访问,包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统,而是基于内核数据结构的一个接口,通过这个接口可以获取系统的运行时状态。:此目录以进程的 ID(PID)命名,并包含与该进程有关的文件和目录,如之前所讲的 /proc/pid/目录。:该文件包含有关 CPU(处理器)的信息,如厂商、型号、频率、缓存等。:该文件包含有关系统内存的信息,如总内存、可用内存、缓存、交换分区等。

2023-12-24 23:55:16 3299

原创 Linux:线程优先级设置

同一优先级的多个线程中,一旦某个抢占式线程获取CPU,除非被更高优先级线程抢占(比如在非实时线程中创建一个更高优先级的实时线程),或该线程主动让出CPU资源,否则该线程将会一直占用CPU(但总会分配一点资源给SCHED_OTHER非实时线程)。另外,需要注意的是,只有具有足够权限的用户才能设置较高的实时线程优先级。,轮询式调度(实时线程),实时循环,设置优先级1-99,以循环方式运行,每个线程都有一个时间片来执行任务,时间片耗尽后,该线程将被放入队列的末尾,而较低优先级的线程有机会执行。

2023-12-24 17:54:52 5667

原创 Linux:APP运行与用户态以及内核态、APP收到的信号处理

在 Linux 操作系统中,用户态和内核态是两种不同的工作模式,它们用于区分操作系统内核和应用程序之间的权限边界和资源访问等。用户态:用户态是指应用程序或用户程序运行的模式,它是用户程序能够访问的最高权限层次。在用户态中,程序直接使用 CPU、内存和其他系统资源,它是处于操作系统的最低特权级别下运行的。内核态:内核态是指操作系统内核运行的模式,它是操作系统内核能够访问的最高权限层次。在内核态中,操作系统内核可以直接操纵硬件设备、执行 CPU 指令和访问内存等,它是处于操作系统的最高特权级别下运行的。

2023-12-21 00:16:05 1553 1

原创 Linux 栈回溯

日常工作中,我们在开发软件程序时,经常会遇到程序奔溃的问题,导致程序奔溃的原因有很多,我们一般都是定位到相关代码,再去查询具体原因。而定位到bug相关代码往往需要依赖栈回溯这个功能,知道程序是在哪里挂掉的。在Linux系统中,栈回溯(stack trace)是用于跟踪程序执行期间函数调用的一种技术,记录了程序在出现错误或异常时,从当前位置开始追溯回到程序的执行起点,包括每个函数的调用关系和相应的返回地址。栈回溯可以帮助开发人员快速定位问题所在。

2023-11-28 00:16:58 1797

原创 Linux中的实时线程

Linux中的线程调度策略,实时线程和普通线程

2023-11-27 00:04:23 1525

原创 GCC编译器CFLAGS、LDFLAGS详解

在Linux开发中,我们经常用到Makefile来管理代码,进行代码的编译。一般的Makefile中都会包含CFLAGS、LDFLAGS两个选项,用于指导编译和链接的过程。有时候我们总是不注意这两个选项的一些区别,将某些编译选项放到链接选项中,导致编译生成的程序出现无法预知的问题;

2023-09-15 22:52:35 10595

原创 Linux perf使用思考

缓存相关事件可以帮助你了解程序对缓存的使用情况,如缓存的命中效率、缓存失效引起的开销,从而针对性地优化程序的内存访问模式。需要注意的是,分支预测错误的优化是一个复杂而细微的过程,具体的优化策略可能因程序的特征和目标平台的不同而异。通过综合考虑程序的访问模式、数据局部性、内存分配、预读取等因素,以及实际测试和性能分析的结果,可以有效地减少缺页异常的发生,提高程序的性能和响应速度。虽然计数模式和采样模式可以监测和记录相同的性能事件,但计数模式提供了精确的事件计数,而采样模式提供了更丰富的上下文信息。

2023-09-11 23:24:26 508

原创 蓝牙发展现状

了解蓝牙当前的发展现状,各个领域

2023-09-03 17:54:58 758

原创 Linux性能计数器

性能计数器是在大多数现代cpu上可用的特殊硬件寄存器。这些寄存器统计特定类型的hw事件的数量:例如执行的指令、遭受的cachemisses或错误预测的分支,而不会减慢内核或应用程序的速度。这些寄存器还可以在事件数量达到阈值时触发中断——因此可以用于分析在该CPU上运行的代码。错误预测的分支是指处理器的分支预测机制在条件分支指令中错误地预测了分支的结果。分支预测是现代处理器中使用的一种技术,通过在实际解析之前猜测分支指令的结果来提高性能。

2023-08-27 23:01:58 1194

原创 揭秘蓝牙技术:从概念到应用的全解析

蓝牙技术是一种短距离无线通信协议,它允许设备之间在10米(根据版本不同,距离有所差异)范围内进行数据传输。该技术的命名源于挪威神话中的蓝牙王,据说他能沟通天地,将分散的部落联系在一起。正如蓝牙王所体现的精神,蓝牙技术也扮演着设备之间“连接者”的角色。1994年,瑞典电信巨头Ericsson的一支团队开始研发蓝牙技术,旨在解决移动设备之间的数据传输问题。1998年,蓝牙技术联盟(SIG)成立,成员包括Ericsson、Nokia、IBM、Toshiba和Intel等公司。

2023-08-26 00:35:21 1921

原创 Linux内核《CPU负载计算》

在实际的产品开发中,我们往往需要关注CPU的负载,确保程序可以长久稳定的运行,并且能够重复发挥SOC的性能。Linux中提供了一些命令可以帮助我们统计这些信息,如top、uptime ,但是关于负载的计算原理我们大多时候并不是很清楚,今天就和大家一起学习了解下!在Linux内核中,CPU负载通常是指系统中正在使用和等待资源的进程数量,即使系统中的处理器核心没有100%的利用率。CPU负载可以帮助我们评估系统中的工作负荷,并判断是否有足够的处理资源可用。也可以认为。

2023-07-18 23:55:33 2051

原创 蓝牙HID模式下输出中文原理简介

蓝牙是一种无线通信协议,用于短距离数据传输。它的主要功能是在电子设备之间创建无线连接,并支持数据传输。HID (Human Interface Device) 是一种通用设备协议,用于连接人机界面设备,如键盘、鼠标、游戏手柄等。当蓝牙和HID结合使用时,人机接口设备可以通过无线蓝牙连接到其他电子设备,从而实现数据传输和控制。例如,如果一个蓝牙键盘和一个电脑连接,当用户在键盘上输入字符时,它们将通过蓝牙连接发送到电脑,然后在电脑上显示出来。

2023-07-16 23:52:43 2100

原创 CAN 简介

CAN(Controller Area Network)是一种串行通信协议,最初由Bosch公司开发,用于在汽车和工业控制等领域中进行数据通信。CAN协议具有高可靠性、高速度和多节点的特点,因此在现代汽车的控制系统中得到了广泛使用。关于协议的细节,参考阅读(我自己看过了,觉得讲的不错,自己就不重复造轮子制造垃圾了):CAN总线详解CAN总线协议详解。

2023-05-14 17:36:13 3998 2

原创 V4L2系列 之 V4L2驱动框架

本篇文章主要介绍Linux内核中的V4L2框架,本篇文章所用内核版本:linux-4.19v4L2 (Video for Linux 2),是linux的一套视频框架,共主体位于内核,可以理解为是整个linux系统上面的视频源捕获驱动框架。其广泛应用在嵌入式设备、移动端以及个人电脑设备上面,市而上使用视频图像采集的设备如:手机、IPC、行车记录仪都会用到这个框架来进行视频采集。v4L2允许 应用程序 控制图像传感器以及传输格式,应用程序 借此完成拍照、预览、视频记录等图像传感器数据应用。

2023-04-23 00:28:06 3973

原创 V4L2系列 之 初识V4L2

由于进行linux音视频开发,通常会涉及到音频以及摄像头视频驱动,所以对V4L2以及ALSA驱动框架进行学习,并整理相关的笔记和大家分享!

2023-04-10 00:03:41 1021

原创 设备树实践操作

(1)根据设备节点的compatible属性, (2)在驱动程序中构造/注册 platform_driver, (3)在 platform_driver 的 probe 函数中获得中断资源

2023-02-27 00:30:44 618

原创 JSON入门与简单使用

这几天工作中需要了解json的基本使用,所以抽时间在网上找了点资料学习了一下,这里进行简单总结,和大家分享一下。JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) , JS 对象简单数据格式 JSON 是轻量级的文本数据交换格式, JSON 是存储和交换文本信息的语法,类似 XML。JSON 独立于语言: JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。

2023-02-20 00:19:02 1012 1

SSD1306-Revision 1.1 (Charge Pump)数据手册

oled模块芯片数据手册

2024-09-03

Linux 内核RCU机制的使用

内核文档,由rst文件转换而来

2024-07-07

can总线学习指南.pdf

本文档适用于进行can总线驱动开发的朋友阅读,讲解了can总线的原理以及一些错误排查手段

2023-07-23

Linux内核《CPU负载计算》

一个培训机构的资料从不同角度去讲解CPU负载,有兴趣的可以自己学习研究下

2023-07-18

在Windows使用VSCode搭建嵌入式Linux开发环境

嵌入式开发环境搭建,分析内核源码,进行驱动代码以及应用层代码开发

2023-02-05

windows端安装英伟达显卡驱动教程

本教程用于进行数据集训练安装所需显卡驱动

2022-05-19

空空如也

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

TA关注的人

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