自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

嵌入式Linux开发从业者,立志做一名优秀的博客输出者!

主要是嵌入式Linux开发相关,涉及C/C++ Linux,python等

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

原创 C++11新特性(2) ——动态内存和智能指针从入门到入坑

动态内存的使用十分容易出现问题(内存泄漏/非法内存),而智能指针能更安全、容易的使用动态内存,因为他负责自动释放所指向的对象,并且在出现异常时,也会自动释放。:允许指向同一个对象所指向的对象,指向shared_ptr所管理的对象。:和weak相比,主要差异是支持拷贝构造与赋值操作///< 指向string///< 指向int的list默认初始化的智能指针中保存一个空指针,使用方法与指针类似。

2024-04-08 23:15:12 977

原创 Linux多进程通信总结——进程间通信看这一篇足够啦!

五种进程间通信汇总,必看!

2024-04-04 11:15:33 268

原创 Linux多进程通信(4)——消息队列从入门到实战!

1)获取消息队列键值pathname:路径名,是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。proj:1-255之间的数字返回值: 生成一个独有的数,失败则返回-1key 31-24 proj_id 低8位key 23-16 pathname的st_dev属性的低8位key 15-0 pathname的st_ino属性的低16位32位组合而成一个int值,就是我们的ftok的返回值了根据路径名以及数字,合成系统中唯一的Key值。

2024-04-04 11:09:40 1121

原创 Linux程序调试优化(2)—— 一次学会嵌入式Linux下程序崩溃定位

方法名优点缺点gdb调试简单方便,还能调试其他问题基本仅适用于debug阶段coredump文件+gdb栈回溯可用于release版本需要debug版本挂死才能看到具体行号使用不当会引入其他严重问题signal捕捉挂死信号+backtrace回溯堆栈+rdynamic编译参数不需要-g选项,不增大应用程序体积会增大动态符号表,降低程序运行中动态寻找符号表的效率signal捕捉挂死信号+backtrace回溯堆栈+addr2line获取具体函数地址。

2024-04-24 00:22:12 820

原创 音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

的前提下,

2024-04-20 17:47:33 999

原创 网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚

协议窗口大小是否有序接收具体做法停止等待ARQ发送=1, 接收=1有序发送窗口每次只能发送一个数据包,然后就停止等待ack包。接收窗口有序的接收数据包,接收成功后发送ack包给发送窗口,如果收到的数据包是无序的,就直接丢弃连续ARQ-回退协议发送 = N,接收 = 1有序发送窗口每次最多一次性发送n个数据包,接收窗口有序的接收数据包,当接收到有序的数据包后,发送ack包给发送窗口,如果收到的数据包时无序的,就直接丢弃。当数据包丢失的时候,会将发送窗口中的后面的所有数据包都重新发送。

2024-04-19 17:52:15 808

原创 Linux程序调试优化(1)——内存占用详解及优化思路

linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致,Linux系统主动杀死占用内存比较高的进程。

2024-04-15 20:21:48 1066

原创 C++基础(1)——学习C++必须要知道的基础数据类型及引用介绍

1)避免不想修改的值被修改2)相比普通引用,可以直接按临时值传递3)相比值传递,能减小时间和空间开销4)相比值传递,能避免截断问题。基本数据类型,最好还是按值传递。//不合法,引用必须引一块合法的内存void func(const int &val)//防止val被误修改当参数类型和引用类型不符时,可被转换为引用类型,将创建一个临时变量,并传递这个临时变量的引用,而因为临时变量不能用来初始化 非常量引用,所以必须是常量引用。

2024-04-09 23:15:20 594

原创 Linux多进程通信(3)——详细说说共享内存原理及使用例程

共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。共享内存是进程间通信访问速度最快。例如消息队列,FIFO,管道的消息传递方式一般为1:服务器得到输入2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。3:客户从内核拷贝到进程4:然后再从进程中拷贝到输出文件上述过程通常要经过4次拷贝,才能完成文件的传递。而1:从输入文件到共享内存区2:从共享内存区输出到文件上述过程。

2024-04-01 22:31:40 1144

原创 Linux多进程通信(2)——POSIX信号量使用例程

1),而POSIX信号量分为有名信号量和无名信号量,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。POSIX无名信号量,POSIX信号量,用能看到,而System V信号量,则是使用查看。:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量。

2024-04-01 22:29:51 677

原创 Linux多进程通信(1)——无名管道及有名管道使用例程

管道是半双工通信,如果需要 双向通信,则需要建立两个管道,:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)

2024-04-01 00:54:03 507

原创 Linux多线程(2)-线程间同步的5种方式,一次性说清楚!

这里都是一些个人血和泪的经验~1)锁的粒度太大,容易出现很多线程阻塞等待锁的情况,导致程序并发性差而如果锁的粒度太细,过度的锁开销会使系统性能受到影响,代码变的复杂,所以要找到一个平衡2)在程序开发中,写完lock之后,就要条件反射一般,将unlock写好,防止之后忘记3)在函数内进行lock之后,一定要谨防函数直接return的情况,return 之前要释放锁,否则下次拿锁会出现死锁的情况。4)带锁的线程,在使用pthread_cancle强制取消线程时,要对锁进行处理,详情可见。

2024-03-23 23:12:20 669

原创 Linux多线程(1)- 线程基础概念及AP介绍

1)注册pthread_clean_up线程清理函数,在处理函数内释放锁、共享资源等(效率较高)2)加锁前,使用pthread_setcancelstate,禁止被cancle,随后再重新允许cancle(需要等到一段代码执行完)下面两个宏,分别是用方法1和方法2完成对锁的清理。

2024-03-21 19:53:00 563

原创 ntp同步时间原理-openwrt配置编译应用完整版

NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。

2024-03-16 14:11:54 406

原创 块设备驱动(1)-什么是块设备驱动?块设备驱动概念总结

块设备驱动是针对存储设备,例如SD卡、EMMC、NAND FLASH、NOR FLSASH。块设备驱动,当发生写入操作时,并不会立马操作硬盘,因为写之前要擦除,擦写频繁影响flash寿命。对于flash设备而言,,所以对于不对存储设备,Linux里有实现不同的I/O调度算法。而字符设备。借鉴一张在网上找到的图片,框架图当然是学习中必不可备的东西,一眼便能有个清晰的认识其中块设备驱动请求有两种形式,使用requeset_queue请求队列,以及不使用请求队列的。

2024-03-10 20:27:33 1014

原创 timezoneinfo的裁剪移植之uclibc/gclibc/openwrt的最详细实战版!

因为项目需要,产品售卖到国外各个地区,需要能适配各个国家的不同时区,一些国家可能会有多个不同时区,并且还存在冬夏令时问题,都需要做到一次性的兼容。而目前板子上可用的flash空间也已经不足200KB,需要同时考虑对flash空间节省。网上的资料并不齐全,这里完成后特地进行总结。这里需要做到,例如收到后,需要得出对应时区的UTC偏移,然后更改系统时间,并且是需要适应冬夏令时的情况。按照网上资料进行zoneinfo移植并设置时区后,发现时间并不对,后来查找资料发现。

2024-03-07 10:35:26 948

原创 platfor设备驱动(1)-什么是platform设备驱动?platform设备驱动基础总结

Linux系统内核使用bus_type结构体表示总线,该结构体定义在文其中的match函数用于总线完成设备和驱动之间匹配 dev为设备,drv为驱动,所以每一条总线都必须实现这个函数。platform总线是bus_type的一个示例,在其中使用进行驱动和设备之间的匹配。return!return 1;return 1;= NULL;:设备树的匹配方式,通过compatible属性在OF表匹配,匹配后执行probe函数。

2024-02-28 16:31:04 977

原创 Linux中的并发与竞争(2)最简单的自旋锁概念及范例

当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。:如果持有锁的线程能在短时间内释放锁资源,那么竞争锁就不需要做内核态和用户态之间的切换,只需要等到持有锁的线程释放锁,避免了用户进程和内核切换的消耗。:为读和写提供了不同的锁,当没有写操作时,允许多个线程使用读锁,进行并发的读取操作。更适用于读取场合更多的情况。在进入临界区时,线程A获取到锁,并且保存中断状态,禁止了中断,防止被中断服务打断而造成死锁现象。

2024-02-22 23:59:07 480

原创 Linux中的并发与竞争(1)并发是如何发生的以及原子操作介绍

A、B、C任务,同时对共享数据段S进行访问A任务对S写入3000个字符"a",B任务对S写入3000个字符"b",C任务负责读取所有数据,当执行顺序如下时,A将数据从用户态拷贝完成后,还未累加当前访问下标,B便对数据进行了访问,此后C获取数据,获取到的数据并不是3000个字符"a",而是3000个字符"b"。

2024-02-22 23:55:56 375

原创 pinctrl/gpio子系统(2)-gpio子系统介绍及驱动源码简单分析

哈喽~我是徐章鑫,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。

2024-02-02 17:10:06 810

原创 pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析

在如今的驱动开发工作中,实际上已经很少去对着寄存器手册进行驱动开发了,一般板子拿到手,已经有原厂的驱动开发工程师,在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。我们直接基于设备树已配置好的寄存器值,去使用子系统对应的API函数,就能快速完成驱动开发,不需要再那么关心IO寄存器的值,借助这种驱动分层的思想,快速完成驱动开发。其中配置一个GPIO最重要的几点就是配置:从设备树中获取,PIN 可复用为 I2C、SPI、GPIO,当复用为gpio的时候,就需要用到gpio子系统。

2024-01-31 17:24:18 1003

原创 设备树(2)-设备树在Linux系统的具体体现及内核解析设备树文件过程

哈喽~我是Embedded-Xin,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。这里先不深度去跟踪整个解析流程,能看懂设备树,遇到问题能有解决思路,待之后实际用到遇到问题了,再开始来逐步学习,加强记忆。内核启动时解析dtb文件, 后在/proc/device-tree 目录 生成设备树节点文件,过程大概如下。这里先关注结果,不关注过程,之后实际用到了再来捋这个过程~进入soc节点,soc节点下所有子节点和属性如下。这样的话,可以使用spi0访问节点。

2024-01-23 17:21:27 627

原创 设备树(1)-设备树是什么?设备树基础概念及语法

设备树源码文件,采用树形结构描述板级信息,例如IIC、SPI等接口接了哪些设备:设备树头文件,描述SOC级信息,例如几个CPU、主频多少、各个外设控制信息等:DTS编译后得到的二进制文件:设备树工具。

2024-01-19 16:32:46 857

原创 JRTP实时音视频传输(2)-使用TCP通信的案例

先将example1拷贝为myclienttcp.cpp和myservertcp.cpp改写jrtplib/JRTPLIB/examples/CMakeLists.txt,添加myclienttcp和myservertcp编译重新生成Makefile并编译可以看到成功编译了myclienttcp和myservertcp源文件编译通过,这里就去实现demo就行。

2024-01-17 19:39:13 520

原创 JRTP实时音视频传输(1)-必做的环境搭建与demo测试

1)支持协议自动切换。在网络优的情况下使用TCP、网络差的情况下使用UDP,满足实时音视频传输需求,2)支持RTCP ,流量控制,阻塞控制等。需要能支持RTCP,这样便能在这个基础上,根据丢包率等,来进行流量控制。3)便于在嵌入式系统上移植,因为嵌入式系统资源有限,需要体积小。

2024-01-16 20:54:40 935

原创 C++11新特性

如果转换失败,则返回空指针或抛出std::bad_cast异常。若std::function不含目标,则称它为空,调用空的std::function的目标会抛出std::bad_function_call异常。(2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,将其包装的可调用对象的执行结果传递给一个 std::future 对象。

2024-01-06 19:15:23 822

原创 Linux驱动开发(1)-最简单的字符设备驱动开发例子

按照字节流进行读写操作的设备,例如点灯、按键、IIC、SPI、LCD。Linux系统中一切皆文件,驱动加载成功,就会在/dev目录生成文件,对文件操作,则可实现对硬件操作。应用程序运行在用户空间,驱动运行在内核空间,用户空间不能直接对内核操作,因此借助系统调用实现。

2024-01-06 16:04:12 1021

原创 Linux内核(2)-Makefile详解,必须要掌握的编译参数

查看变量V的来源,如果来源于command line,且KBUILD_VERBOSE 赋值为V的值,如果V=1 则quiet=quiet_和Q=@。(MAKEFLAGS)),就是匹配MAKEFLAGS中的s或者-s开头的字符串,如果匹配到的结果不为空,则quiet=silent_启用静默输出。在Makefile中,如果命令前用@,则代表不将命令内容输出,例如@rm -rf $(output)O的来源于 command line,则KBUILD_OUTPUT赋值为变量O的值。%:通配符,匹配任何字符。

2024-01-06 16:01:35 465

原创 Linux内核(1)-内核目录介绍,每个人都应该了解的内核目录结构

不同平台的默认配置文件,例如xxx_defconfig。:编译出的Image和zImage Linux镜像文件。:架构相关目录,例如arm、arm64。: 相应平台的驱动和初始化文件。

2024-01-06 16:00:09 381

原创 裸机开发(2)-裸机实战

Cortex-A内核CPU的所有外部中断都属于IRQ中断,任意外部中断发生都会出发IRQ中断,在中断服务函数中需要判断到底是哪个中断发生。①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。

2023-12-22 17:52:11 1511

原创 裸机开发(1)-汇编基础

函数发生调用时,需要进行线程保护,简单来说,就是先进行压栈操作,将调用函数参数、返回值等存到R0-15寄存器中,在执行完毕后,需要将数据内容从寄存器读出,进行出栈操作,而这一系列操作需要SP指针。芯片上电后SP指针(堆栈指针寄存器)还未初始化完毕,无法执行C代码,所以必须要用汇编设置好C语言环境。

2023-12-22 17:42:02 1131

原创 内核_设备树_文件系统_uboot

操作系统内核运行前的一段小程序,负责初始化硬件设备(如CPU、SDRAM、Flash、串口),加载内核、设备树文件到内存中并执行内核代码。:是一种描述硬件的数据结构,用于管理各种设备的树状结构,在操作系统引导阶段,将数据结构中的硬件信息传递给操作系统。初学一个东西,还是决定将名词全都熟悉一遍啦,不用了解的太仔细,看到的时候能知道大概是什么东西!:嵌入式Linux系统的核心,负责进程管理、内存管理、文件系统管理、网络和设备驱动等功能模块。:一个开源、轻量级的软件工具/命令集合。

2023-12-22 17:23:32 349

原创 uboot学习(4)-uboot移植

bak等等,并在这些结果中排除RCS_FIND_IGNORE变量值中代表的文件和文件夹(因为RCS_FIND_IGNORE变量值代表的文件和文件夹是不执行删除操作的),随后进行删除操作,完成清理编译文件的目的。总结原因,主要是因为ubuntu未安装对exFAT格式的支持,导致SD卡插上后,并未真正挂载上,而是一个虚假的设备节点,在安装文件系统格式支持后,成功解决该问题~可以看到当前SD卡中,无分区,可直接输入n创建一个新分区,分区的具体参数,可以直接回车选择默认。

2023-12-17 20:01:46 796

原创 uboot学习(3)-uboot环境变量

uboot环境变量默认值:include/env_default.h。

2023-12-17 19:58:58 402

原创 uboot学习(1)-uboot目录详解

uboot学习

2023-12-17 19:55:07 451

原创 uboot学习(2)-uboot常用命令

uboot全称Universal Boot Loader。作用:简单来说就是,初始化DDR等外设,将Linux内核从flash中拷贝到DDR中,最后启动Linux内核。

2023-12-17 19:54:10 319

原创 网络编程学习-TCP三次握手四次挥手抓包实战分析

TCP/IP是一个协议族,每个层次负责不同的通信功能。链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和对应的网络接口卡。处理与物理层传输介质(如电缆)之间的物理接口细节。网络层,也称作网际层,处理数据包分组在网络中的活动,例如分组的选路和转发等。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)等。传输层,提供两台主机上的应用程序端到端的通信。

2023-11-12 15:57:45 146 1

原创 栈的向上增长及向下增长解析

所以平时在计算栈偏移地址时,需要注意不同芯片平台栈的增长方向可能不同。1、向下增长,就是从高地址向低地址增长。栈顶即为&arr[254]。2、向上增长,就是从低地址向高地址增长。栈顶即为&arr[0]。压栈操作是从栈顶压向栈底。假设堆栈为数组arr。

2023-08-15 23:46:13 874 1

原创 开发环境搭建:vscode+ubuntu配置远程免密开发

开发环境搭建

2023-07-21 23:35:42 330 1

原创 C++11多线程运行报错:terminate called without an active exception

在debug项目代码时,发现程序总是发生挂死问题,提示terminate called without an active exception,根据网上资料,大概定位到是std::thread析构函数引起。而挂死原因正是因为这段代码使用不规范。

2023-07-17 18:16:22 1667 1

qt5.9-lib-gcc

qt5.9交叉编译环境,亲测可用,欢迎下载,欢迎察看。大家随意下载,使用于linux操作系统,交叉编译的开发环境,是不错的资源

2020-09-18

空空如也

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

TA关注的人

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