自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小嵌同学的博客

小菜的学习分享

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

原创 深入了解 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 1834

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

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

2024-03-03 23:18:38 1386

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

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

2024-03-01 00:31:36 1104

原创 初识 Rust 语言

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

2024-02-18 23:18:59 1283

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

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

2024-01-28 18:27:27 1234

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

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

2024-01-14 20:12:42 940

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

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

2024-01-14 19:13:08 1916

原创 Linux:NTP校时、PTP校时

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

2024-01-12 00:59:20 2316

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

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

2024-01-01 23:41:03 1535

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

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

2023-12-24 23:55:16 1897

原创 Linux:线程优先级设置

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

2023-12-24 17:54:52 2986

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

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

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

原创 Linux 栈回溯

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

2023-11-28 00:16:58 1343

原创 Linux中的实时线程

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

2023-11-27 00:04:23 1249

原创 GCC编译器CFLAGS、LDFLAGS详解

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

2023-09-15 22:52:35 5775

原创 Linux perf使用思考

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

2023-09-11 23:24:26 278

原创 蓝牙发展现状

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

2023-09-03 17:54:58 508

原创 Linux性能计数器

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

2023-08-27 23:01:58 884

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

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

2023-08-26 00:35:21 1019

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

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

2023-07-18 23:55:33 1535

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

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

2023-07-16 23:52:43 1578

原创 CAN 简介

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

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

原创 V4L2系列 之 V4L2驱动框架

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

2023-04-23 00:28:06 3273

原创 V4L2系列 之 初识V4L2

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

2023-04-10 00:03:41 895

原创 设备树实践操作

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

2023-02-27 00:30:44 407

原创 JSON入门与简单使用

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

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

原创 Linux 程序开发 之 库打桩机制

Linux 链接器支持一个很强大的技术,称为库打桩(library interpositioning),它允许你截获对共享库函数的调用,取而代之执行自己的代码。使用打桩机制,你可以追踪对某个特殊库函数的调用次数,验证和追踪它的输入和输出值,或者甚至把它替换成一个完全不同的实现。基本思想:给定一个需要打桩的目标函数,创建一个包装函数,它的原型与目标函数完全一样。使用某种特殊的打桩机制,你就可以欺骗系统调用包装函数而不是目标函数了。

2022-12-12 00:44:42 1423

原创 浅谈linux开发板用户登录之getty/login/passwd

在我们使用Linux设备时,开机启动后总会遇到一个用户登录界面,类似于QQ号登录一样,但是Linux输入密码是不显示输入的字符的,这个和Windows不一样,有的设备并未有这个过程,对于其背后的机制,大家是否清楚呢?

2022-12-08 23:50:57 1964

原创 C++并发编程

(1)内核和应用  在Linux程序开发中,涉及到了许多的并发操作,根据程序的上下层关系可分为两部分,一部分是在内核中,即操作系统本身的在运行过程中就包含有大量的并发操作,如硬件驱动程序和内存管理以及进程调度模块就在同时运行着;另一部分就是我们经常说的应用程序,运行在linux系统之上的程序,如一个服务器应用程序,同时存在两个线程在运行,一个负责监听客户端,一个负责处理客户端的请求;(2)进程和线程  进程是系统进行资源分配的基本单位,线程是CPU进行调度的基本单位。一个进程中包含多个线程。有关于进程线

2022-12-06 23:52:27 1225

原创 音视频开发基础概念

一个图片的基本单位, pix是英语单词picture的简写,加上英语单词“元素element”,就得到了**“pixel”**,简称px,所以“像素”有“图像元素”之意。每个通道的位深越大,能够表示的颜色值就越大,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。

2022-11-10 00:24:23 1085 5

原创 C++中的断言机制与gtest单元测试

C++,gtest测试框架(1)测试是对软件的功能、可靠性、兼容性等要求所做的检验(2)测试有多种分类和概念,譬如白盒和黑盒,自动化测试等白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒" 法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒" 法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。

2022-10-30 15:39:17 2071 2

原创 C++编程功底和常用规则

本文章不建议C++小白阅读,否则你无法理解其中的一些精髓,一些属于C++独有的语法知识。掌握代码规范在日常开发中尤为重要,这是一个软件程序员的基本素养!(1)代码简洁精炼,美观,可读性好;(2)高效率;如深拷贝与浅拷贝,C++拷贝函数(传值和传引用),++i 比 i++效率高(i++在运算过程中使用了临时变量)(3)高复用,可移植性好;可以跨平台/操作系统(4)高内聚,低耦合;(5)没有冗余;代码注释简洁易懂,无多余废话。代码无多余无用语句,逻辑清晰简洁。(6)规范性,代码有规可循;

2022-10-21 00:03:46 814

原创 基于HI3516/HI3518/HI3559内部ADC驱动实现

最近实际开发中需要实现海思SOC内部自带的一个ADC的驱动,但海思SDK中并未提供相应的软件驱动支持,故需要自己去实现,整体流程也比较简单,不过对于第一次接触海思开发的人来说有一点困难。

2022-10-16 16:53:10 1669

原创 中断系统中的设备树

一、中断概念的引入与处理流程1、何为中断?  中断是为单片机具有对外部或内部随机发生的事件实时处理而设置的。为了便于大家理解中断概念,给大家举一个例子:  至于能看这篇文章,各位应该都是单片机和嵌入式老手了,中断应该都懂,给大家简要回忆下就行了。(1)中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。(2)微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并不等于微观上的并行,有时候宏观上是并行的,微观上是串行

2022-09-22 00:24:52 1016

原创 uboot源码分析(基于S5PV210)之uboot的硬件驱动部分

(1)最早出现的是MMC卡,卡片式结构,按照MMC协议设计。(相较于NandFlash芯片来说,MMC卡有2个优势:第一是卡片化,便于拆装;第二是统一了协议接口,兼容性好。)(2)后来出现SD卡,兼容MMC协议。SD卡较MMC有一些改进,譬如写保护、速率、容量等。(3)SD卡遵守SD协议,有多个版本。多个版本之间向前兼容。(4)iNand/eMMC在SD卡的基础上发展起来,较SD卡的区别就是将SD卡芯片化了(解决卡的接触不良问题,便于设备迷你化)。

2022-09-19 00:38:08 3703 1

原创 uboot源码分析(基于S5PV210)之uboot的命令体系与环境变量

命令举例:version命令(command.c中33行开始的do_version函数)(1)U_BOOT_CMD宏基本分析(,,,,,)cmd_tbl_t={,,,,,}((,section()))这个宏定义在uboot / common / command . h中。#name , maxargs , rep , cmd , usage , help } __attribute__ :gcc扩展语法,用于给前边这个变量 cmd_tbl_t __u_boot_cmd_version。

2022-09-18 23:36:13 250

原创 uboot源码分析(基于S5PV210)之uboot如何启动内核

(1)bootm.c从110行到144行就是uboot 对 准备给linux内核传递的参数 进行处理。(2)Starting kernel … 这个是uboot中最后一句打印出来的东西。这句如果能出现,说明uboot整个是成功的,也成功的加载了内核镜像,也校验通过了,也找到入口地址了,也试图去执行了。如果这句后串口就没输出了,说明内核并没有被成功执行。原因一般是:传参(80%的原因)、内核在DDR中的加载地址·······1 、启动 4 步骤第一步:将内核搬移到DDR中(链接地址处 )

2022-09-15 00:29:19 626

原创 uboot源码分析(基于S5PV210)之启动第二阶段

(1)这个函数在uboot/lib_arm/board.c的第444行开始到908行结束。(2)这464行还不是全部,因为里面还调用了别的函数。(3)为什么这么长的函数,怎么不分成两三个函数?主要因为这个函数整个构成了uboot启动的第二阶段。(1)第二阶段主要是对开发板级别的硬件、软件数据结构进行初始化。cpu_init 空的board_init 网卡、机器码、内存传参地址dm9000_pre_init 网卡gd -> bd -> bi_arch_number 机器码。

2022-09-13 00:14:14 496

原创 uboot源码分析(基于S5PV210)之启动第一阶段

(1)在C语言中,整个项目的入口就是main函数(这是C语言规定的),所以譬如说一个有10000个.c文件的项目,第一个要分析的文件就是包含了main函数的那个文件。(2)在uboot中因为有汇编阶段参与,因此不能直接找main.c。整个程序的入口取决于链接脚本中ENTRY声明的地方。ENTRY(_start)因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。(1)当前状况:我们知道在uboot中的1000多个文件中有一个符号叫_start,但是我们不知道

2022-09-12 01:21:55 651

原创 uboot源码分析(基于S5PV210)之零距离初体验

(1) . gitignore,git工具的文件,git是一个版本管理工具(类似的还有个svn),这个文件和git有关,和uboot本身无关的,不用去管。(2) arm_config . mk,后缀是 . mk,是一个Makefile文件,将来在某个Makefile中会去调用它。(3) 三个Changelog文件,修改记录文件,该文件记录了这个uboot项目的版本变迁以及每个版本较上个版本修改的记录。正式的项目都有这些记录的。可以直接忽略,主要是给维护uboot的人用的。

2022-09-08 00:50:56 1495

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关注的人

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