
Linux应用编程
文章平均质量分 78
主要记录Linux日常学习中的重要知识点
Embedded-Xin
沪漂-嵌入式软件开发工程师
正在逐步把之前的笔记整理到博客上,做到稳定的输入与输出!
展开
-
ROS2——foxy apt打包离线安装deb包
需要从A设备复制ROS2环境到B设备,且B设备有可能没网络,所以选择制作离线资源包。原创 2025-04-09 18:29:27 · 466 阅读 · 0 评论 -
strace工具使用——实战解决文件描述符超限too many open files导致CPU飙高问题
CPU异常飙高,会突然出现飙到百分之110的情况。这周突然飙高大概率和程序死循环执行某事情有关,可以选择拿stace快速定位。原创 2025-01-12 16:39:21 · 374 阅读 · 0 评论 -
Linux内存管理(1)——MMU内存管理单元及Buddy算法详解
最近复习Linux内存管理部分,简单将自己的理解记录一下:包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE):随机存取存储器,掉电丢失,CPU直接交换数据的内部存储器,也叫主存(内存)。可以随时读写,而且速度很快:只读存储器,掉电不丢失,只读不可写,用于存放计算机的基本程序和数据:高速缓冲存储器,位于CPU与内存之间,读写速度比内存更快。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。原创 2024-08-28 23:26:02 · 1272 阅读 · 0 评论 -
Linux内核(5)——从udev/mdev工作原理到亲手实现SD卡热插拔
手动创建设备节点的命令:可以用于创建设备节点,创建设备节点的逻辑在内核空间(内核2.4版本之前使用):自动创建设备节点的机制,创建设备节点的逻辑在用户空间(从内核2.6版本一直使用至今):是一种轻量级的udev机制,用于一些嵌入式操作系统中,是busybox中自带的一种udev机制。原创 2024-08-19 23:18:54 · 1719 阅读 · 0 评论 -
faad2交叉编译——aac解码为pcm,解决faad单通道转双通道问题
FAAD是比较成熟高效的开源AAC解码库,这里用于解码AAC生成PCM数据,用于音频播放。这里因为faad库,会将单通道转化为双通道踩了些坑,所以记录一下。我使用的是2.11.0版本,貌似往前的版本没有使用CMake,需要configure配置编译。原创 2024-05-08 19:44:07 · 1006 阅读 · 0 评论 -
IO复用技术(1)——select/poll/epoll原理介绍及使用案例
IO复用中epoll会更高效,内存拷贝次数少,事件复杂度低,且不受fd数量的限制。原创 2024-05-04 21:41:42 · 1107 阅读 · 1 评论 -
Linux程序调试优化(2)—— 一次学会嵌入式Linux下程序崩溃定位
方法名优点缺点gdb调试简单方便,还能调试其他问题基本仅适用于debug阶段coredump文件+gdb栈回溯可用于release版本需要debug版本挂死才能看到具体行号使用不当会引入其他严重问题signal捕捉挂死信号+backtrace回溯堆栈+rdynamic编译参数不需要-g选项,不增大应用程序体积会增大动态符号表,降低程序运行中动态寻找符号表的效率signal捕捉挂死信号+backtrace回溯堆栈+addr2line获取具体函数地址。原创 2024-04-24 00:22:12 · 1593 阅读 · 2 评论 -
网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚
协议窗口大小是否有序接收具体做法停止等待ARQ发送=1, 接收=1有序发送窗口每次只能发送一个数据包,然后就停止等待ack包。接收窗口有序的接收数据包,接收成功后发送ack包给发送窗口,如果收到的数据包是无序的,就直接丢弃连续ARQ-回退协议发送 = N,接收 = 1有序发送窗口每次最多一次性发送n个数据包,接收窗口有序的接收数据包,当接收到有序的数据包后,发送ack包给发送窗口,如果收到的数据包时无序的,就直接丢弃。当数据包丢失的时候,会将发送窗口中的后面的所有数据包都重新发送。原创 2024-04-19 17:52:15 · 1219 阅读 · 0 评论 -
网络编程学习-TCP三次握手四次挥手抓包实战分析
TCP/IP是一个协议族,每个层次负责不同的通信功能。链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和对应的网络接口卡。处理与物理层传输介质(如电缆)之间的物理接口细节。网络层,也称作网际层,处理数据包分组在网络中的活动,例如分组的选路和转发等。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)等。传输层,提供两台主机上的应用程序端到端的通信。原创 2023-11-12 15:57:45 · 388 阅读 · 1 评论 -
Linux程序调试优化(1)——内存占用详解及优化思路
linux开发最重要的两个参数,分别是内存以及CPU使用率,若内存出现严重不足,则在需要使用内存时,可能出现申请不到的情况,导致,Linux系统主动杀死占用内存比较高的进程。原创 2024-04-15 20:21:48 · 2050 阅读 · 0 评论 -
C++基础(1)——学习C++必须要知道的基础数据类型及引用介绍
1)避免不想修改的值被修改2)相比普通引用,可以直接按临时值传递3)相比值传递,能减小时间和空间开销4)相比值传递,能避免截断问题。基本数据类型,最好还是按值传递。//不合法,引用必须引一块合法的内存void func(const int &val)//防止val被误修改当参数类型和引用类型不符时,可被转换为引用类型,将创建一个临时变量,并传递这个临时变量的引用,而因为临时变量不能用来初始化 非常量引用,所以必须是常量引用。原创 2024-04-09 23:15:20 · 685 阅读 · 0 评论 -
C++11新特性(2) ——动态内存和智能指针从入门到入坑
动态内存的使用十分容易出现问题(内存泄漏/非法内存),而智能指针能更安全、容易的使用动态内存,因为他负责自动释放所指向的对象,并且在出现异常时,也会自动释放。:允许指向同一个对象所指向的对象,指向shared_ptr所管理的对象。:和weak相比,主要差异是支持拷贝构造与赋值操作///< 指向string///< 指向int的list默认初始化的智能指针中保存一个空指针,使用方法与指针类似。原创 2024-04-08 23:15:12 · 1090 阅读 · 0 评论 -
Linux多进程通信总结——进程间通信看这一篇足够啦!
五种进程间通信汇总,必看!原创 2024-04-04 11:15:33 · 451 阅读 · 0 评论 -
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 · 1512 阅读 · 0 评论 -
Linux多进程通信(3)——详细说说共享内存原理及使用例程
共享内存的原理便是将相同的一片物理内存映射到进程A和进程B不同的逻辑地址空间,两个进程同时访问这块物理内存(共享内存)。共享内存是进程间通信访问速度最快。例如消息队列,FIFO,管道的消息传递方式一般为1:服务器得到输入2:通过管道,消息队列写入数据,通常需要从进程拷贝到内核。3:客户从内核拷贝到进程4:然后再从进程中拷贝到输出文件上述过程通常要经过4次拷贝,才能完成文件的传递。而1:从输入文件到共享内存区2:从共享内存区输出到文件上述过程。原创 2024-04-01 22:31:40 · 1819 阅读 · 0 评论 -
Linux多进程通信(2)——POSIX信号量使用例程
1),而POSIX信号量分为有名信号量和无名信号量,而System V标准的信号量并不是,Posix通过sem_open单一的调用就完成了信号量的创建、初始化和权限的设置,而System V要两步。POSIX无名信号量,POSIX信号量,用能看到,而System V信号量,则是使用查看。:可以在多进程间使用,多进程通过名字来打开同一个信号量,使用范围更广:一般在多线程使用,因为没有名字,所以没法在多进程中打开同一个信号量。原创 2024-04-01 22:29:51 · 943 阅读 · 0 评论 -
Linux多进程通信(1)——无名管道及有名管道使用例程
管道是半双工通信,如果需要 双向通信,则需要建立两个管道,:只能父子进程间通信,且是非永久性管道通信结构,当它访问的进程全部终止时,管道也随之被撤销:进程间不需要有亲缘关系,是永久性管道通信结构,直到pclose才被关闭。(提供了一个路径名,以FIFO的形式存在于文件系统)原创 2024-04-01 00:54:03 · 692 阅读 · 2 评论 -
Linux多线程(2)-线程间同步的5种方式,一次性说清楚!
这里都是一些个人血和泪的经验~1)锁的粒度太大,容易出现很多线程阻塞等待锁的情况,导致程序并发性差而如果锁的粒度太细,过度的锁开销会使系统性能受到影响,代码变的复杂,所以要找到一个平衡2)在程序开发中,写完lock之后,就要条件反射一般,将unlock写好,防止之后忘记3)在函数内进行lock之后,一定要谨防函数直接return的情况,return 之前要释放锁,否则下次拿锁会出现死锁的情况。4)带锁的线程,在使用pthread_cancle强制取消线程时,要对锁进行处理,详情可见。原创 2024-03-23 23:12:20 · 1877 阅读 · 0 评论 -
Linux多线程(1)- 线程基础概念及AP介绍
1)注册pthread_clean_up线程清理函数,在处理函数内释放锁、共享资源等(效率较高)2)加锁前,使用pthread_setcancelstate,禁止被cancle,随后再重新允许cancle(需要等到一段代码执行完)下面两个宏,分别是用方法1和方法2完成对锁的清理。原创 2024-03-21 19:53:00 · 685 阅读 · 0 评论 -
ntp同步时间原理-openwrt配置编译应用完整版
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。原创 2024-03-16 14:11:54 · 827 阅读 · 0 评论 -
timezoneinfo的裁剪移植之uclibc/gclibc/openwrt的最详细实战版!
因为项目需要,产品售卖到国外各个地区,需要能适配各个国家的不同时区,一些国家可能会有多个不同时区,并且还存在冬夏令时问题,都需要做到一次性的兼容。而目前板子上可用的flash空间也已经不足200KB,需要同时考虑对flash空间节省。网上的资料并不齐全,这里完成后特地进行总结。这里需要做到,例如收到后,需要得出对应时区的UTC偏移,然后更改系统时间,并且是需要适应冬夏令时的情况。按照网上资料进行zoneinfo移植并设置时区后,发现时间并不对,后来查找资料发现。原创 2024-03-07 10:35:26 · 1377 阅读 · 3 评论 -
hexdump以16进制查看文件
在计算机科学中,一个 0 或 1 存储的数据称为一个位(bit,代表 binary digit,即二进制数);连续 8 位称为一个字节。hexdump 可以以可读的格式显示任何类型的二进制数据。原创 2023-07-06 14:39:02 · 961 阅读 · 1 评论 -
Ubuntu桥接模式设置固定IP
最近在做项目时,总是遇到虚拟机IP改变的情况。非常烦,于是决定设一个固定IP。1.第一步,打开虚拟机设置设置桥接模式,记得勾选复制物理连接状态2.打开虚拟网络编辑器点击更改设置选择桥接模式,自动桥接设置完后启动虚拟机即可。3.在终端输入命令 **sudo vi /etc/network/interfaces**添加如下代码:(如果自己的网卡是eth0 则将eth0更改为eth0)auto ens33iface ens33 inet staticaddress 192原创 2021-03-15 20:37:07 · 1230 阅读 · 2 评论 -
ubuntu配置多个git账号同时使用
主要是解决一个电脑下使用多个git账号的问题原创 2022-05-11 22:27:03 · 1466 阅读 · 0 评论 -
C++11多线程运行报错:terminate called without an active exception
在debug项目代码时,发现程序总是发生挂死问题,提示terminate called without an active exception,根据网上资料,大概定位到是std::thread析构函数引起。而挂死原因正是因为这段代码使用不规范。原创 2023-07-17 18:16:22 · 4569 阅读 · 1 评论 -
BSP和HAL层的区别和联系
前言: 之前对这方面的概念,一直理解的很抽象,今天在看到两篇文章之后,有了新的认识,特地进行了总结。引用:https://blog.youkuaiyun.com/tq384998430/article/details/53484512http://www.51hei.com/bbs/dpj-46297-1.html分层思想**在大一大二刚接触编程时,对编程的概念,大概就是能实现指定功能即可,甚至将所有程序一股脑的放入main函数。到后来有了一定的编程思想,将具体功能封装为函数实现。可在大型项目开发中,原创 2020-12-09 16:31:45 · 5756 阅读 · 0 评论 -
malloc动态内存如何正确使用
前言常见错误在实际项目中,经常会需要用到malloc申请动态内存,但使用不当经常会出现内存泄漏问题,下面给出了几种常见的使用错误,以及较为正确的使用方法。常见错误使用局部指针变量申请动态内存#include <stdio.h>#include <string.h>#include <stdlib.h>void malloc_test(char* m, int num){ m = (char *)malloc(sizeof(char) * num);原创 2021-07-13 21:56:21 · 567 阅读 · 0 评论 -
MPU+MCU的优势
前言:最近参加某公司面试时,被问到为什么采用MPU+MCU的架构,而不是纯MPU,或是纯MCU,于是便对网上的资料进行了一些总结。参考:https://zhuanlan.zhihu.com/p/106860696utm_source=wechat_session背景:MPU的全称叫Micro Processor Unit,MCU的全称是Mirco Controller UnitMCU由于主要完成“控制”相关的任务,所以被称为Controller。也就是根据外界的信号(刺激),产生一些响应,做一原创 2020-12-07 14:24:07 · 601 阅读 · 0 评论 -
RTC时钟小结
最近在项目中用到了RTC唤醒,主要的应用场景是单片机在休眠时,由锂电池供电,每隔一段时间,单片机需要被唤醒,向终端传出部分数据,故采用了RTC唤醒。在网上查阅了一些资料后,大概得到了以下结论。RTC实时时钟的特别性主要在于:1.唯一一个具有单片机掉电后还能运行的外设。既在单片机电源VPP断开时,stm32芯片通过VBAT引脚接锂电池,由锂电池给它供电。使得RTC时钟继续工作。所以它可用于单片机休眠后的定时唤醒源2.无论由VPP或者VBAT供电,RTC时钟的数据都存储在备份区域,如果VPP和VBAT原创 2021-01-27 09:28:20 · 937 阅读 · 0 评论 -
为什么使用popen函数代替system
popen 函数与system函数评估比较原创 2022-12-13 17:10:32 · 548 阅读 · 0 评论 -
Linux系统编程——(1)文件IO基础
Linux系统编程文件IO原创 2022-04-10 21:42:01 · 1054 阅读 · 0 评论