自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Stoneshen的博客

嵌入式程序猿的追寻之路。。。

  • 博客(231)
  • 资源 (15)
  • 收藏
  • 关注

原创 Linux性能学习(4.7):网络_如何优化网络性能

在前面大致讲解了网络相关的一些参数,那么本篇就描述一下如何对网络相关参数进行优化。

2023-09-10 13:30:00 189

原创 Linux性能学习(4.6):网络_孤儿连接、半连接状态、RTS复位报文简述

在前面《TCP三次握手内核参数优化》和《TCP四次挥手内核参数优化》章节了解了一些概念:孤儿连接、半连接状态、RTS复位报文,在本文简单介绍下这些概念。

2023-09-10 12:00:00 347 1

原创 Linux性能学习(4.5):网络_TCP四次挥手内核参数优化

在Client和Server断开连接时候,会经历四次交互,称为四次挥手,本篇简单介绍下四次交互。如上图,客户端和服务端都可以主动先发起close操作,在这里,我们假设Client先发送close操作。2MSL的时长为30*2=60s,RFC793定义了MSL为2分钟,Linux设置成了30s,MSL是指报文在网络中的最长生存时间,之所以定义2MSL,是假设发送的ACK丢失,最大消耗一个MSL时间,然后Server端重发一次FIN报文,最大消耗一次MSL事件,那么此时出于TIME_WAIT状态的Client端

2023-08-06 23:00:00 356

原创 Linux性能学习(4.4):网络_TCP三次握手内核参数优化

在本篇中,引申出以下几个内核参数,除了tcp_retries2和tcp_keepalive_time外,其它内核参数均是和三次握手相关的。

2023-08-06 21:30:00 288

原创 Linux性能学习(4.2):网络_为什么MTU是1500

参考资料:1.2.

2023-07-02 05:15:00 2188

原创 Linux性能学习(4.1):网络_网络相关性能参数

参考资料:1.在前面CPU、内存、IO等部分,都有相关的参数来标识性能,在网络部分也有一些参数可以反应网络的性能。

2023-07-01 23:15:00 287

原创 Linux性能学习(3.3):IO_如何优化IO性能

参考资料:1.

2023-06-11 20:00:00 645

原创 Linux性能学习(3.2):IO_磁盘IO

在上一篇中,大致了解了文件系统的一些知识,了解了不同的文件系统以及VFS的概念,其实在存储介质上也是有这个情况,在嵌入式开发中,会根据不同的项目使用不同的存储介质:spi flash、emmc flash、nor flash、nand falsh等等,不同的存储介质在系统中则会有不同的设备驱动程序。因此,系统会类似于VFS的做法,抽象一层(通用块层)在块设备驱动和文件系统之间,这样用户直接访问标准接口即可,不用关心不同驱动程序的差异。

2023-06-11 15:00:00 1722

原创 Linux性能学习(3.1):IO_文件系统IO

参考资料:1.在Linux下一切皆文件,当我们操作一个文件时候,最基础的就是读写操作,即I/O操作,因此这篇就大致了解解文件系统I/O的相关功能。

2023-05-07 19:30:00 458 1

原创 Linux性能学习(2.6):内存_如何优化内存,提高效率

堆主要是通过malloc动态分配的区域,而栈则是保存局部变量的。在前面我们知道通过malloc来申请内存,即便是有内存池,还是需要消耗时间和性能来进行分配,所以如果将一些变量提前定义好,那么编译器在编译时候就自动分配到栈上,在程序运行时候,不需要再次申请,从而加快效率。但是,这种方式也是有缺点,因为是局部的,所以如果函数调用结束就会自动释放;栈的空间也有限,如果申请的过大就会造成栈溢出。

2023-05-07 17:30:00 523

原创 Linux性能学习(2.5):内存_Ptmalloc与TCMalloc

而Ptmalloc2中则会为申请的内存加四字节的头,并且还会多分配内存,参考《为什么分配的内存比申请的内存大16个字节》。TCMalloc相比较Ptmalloc,对于多线程做了优化,减小了多线程中的锁竞争,为每个线程独立分配内存,无需加锁,所以速度更快,特别是对于小对象的分配基本上不会存在锁竞争;TCMalloc 是 Google 开发的内存分配器,可以替换c 的 malloc () 和 c + + 操作符 new 的实现,用于降低频繁分配、释放内存造成的性能损耗。1.庄明强老师的《Glibc内存管理》

2023-04-02 12:00:00 111

原创 Linux性能学习(2.4)内存_为什么会预分配很大的虚拟内存及Ptmalloc2

当我们是有malloc申请内存时候,Ptmalloc2会预先分配比申请内存更大的空间作为内存池,然后再在内存池中,取出申请的内存给到用户,当用户释放内存时候,内存池会根据一些策略来判断是否释放给系统,如果不释放这块内存,那么就会将这块内存还到内存池中,供下次申请时使用,这样效率会更高。当申请的内存大于当前内存池时候,内存池会继续申请新的内存池来进行管理,一旦申请新的内存池,那么内存池数量就不会减小,即便某块内存池已经完全空闲,也不会减小。另外,单个子线程的内存池的数量最大是8倍的CPU数。

2023-04-02 10:00:00 287

原创 Linux性能学习(2.3):内存_为什么分配的内存比申请的内存大16个字节

在上一篇文章中,探讨了Linux系统对进程以及线程的内存分配问题,然后采用申请1KB内存的方式进行验证,然后发现将第二次申请的内存地址减去第一次申请内存的地址,长度为1040,比我们申请的1024多了16个字节,从而提出一个问题,“在64位系统中,为什么系统分配的内存比实际申请的内存大16个字节?

2023-03-05 07:00:00 637

原创 Linux性能学习(2.2):内存_进程线程内存分配机制探究

第一个问题:64位系统,为什么系统分配的内存比实际申请的内存大16个字节?第二个问题:64位系统,为什么系统会给进程申请132KB的内存,而不是我们真正需要的内存?第三个问题:64位系统,为什么系统会给线程申请64MB的内存,而不是我们真正需要的内存?后面章节将解决这几个问题。

2023-03-05 05:00:00 769

原创 Linux性能学习(2.1):内存_查看系统内存以及Buffer Cached说明

简单介绍下如何查看系统/进程内存相关参数以及各个参数的含义。

2023-02-05 11:30:00 1558

原创 Linux性能学习(1.5):CPU_如何找到CPU使用率高原因

参考资料:1.2.

2023-02-05 02:00:00 475

原创 Linux性能学习(1.4):CPU_如何查看CPU上下文切换参数

在前面大致了解了上下文切换的相关知识,那么如何在系统中查看上下文切换相关的参数?

2023-01-01 22:00:00 910 1

原创 Linux性能学习(1.3):CPU_CPU上下文切换

在Linux下,如果我们使用ps指令可以看到有很多进程在同时运行,但是实际上并不是同一时刻运行的,单核CPU在某一时刻只会运行一个任务,而系统则会通过调度算法(时间片轮转、中断优先、高优先级优先等算法)将不同的任务给到CPU运行,从而造成可以同时执行很多进程的假象。在系统将某一个任务给到CPU运行时候,CPU则需要将当前正在执行的指令进行存储,以便下次执行这个任务,以及需要知道下一个任务的指令的位置,以便加载进来运行,而程序计数器则是用于存放指令所在地址的地方;

2023-01-01 15:15:00 608

原创 Linux性能学习(1.2):CPU_如何提高CPU缓存命中率

在上一篇文章中简单介绍了CPU缓存的相关知识,并且引申出了一个概念—“CPU缓存命中”,那么如何让我们编写的程序尽可能的被CPU缓存命中,从而尽可能的提高运行效率?

2022-12-18 10:15:00 810

原创 Linux性能学习(1.1):CPU_CPU缓存

CPU的运算是需要数据的,因此就需要从内存中读写一些数据来进行运算。但是CPU的运算速度很快,而内存的读写速率相比较于CPU的运行速率就比较慢,因此CPU就需要花费时间等待内存的数据到来或者把数据写入内存,这种操作就无法发挥CPU的全部功力。因此,一种新的读写速度更快的内存—“缓存”被设计出来,用来存储一些需要频繁被访问的数据,这样CPU会先从速度更快的缓存中来读写数据,加快CPU的运算。缓存本质上还是内存,只不过读写速度会比内存快很多。

2022-12-17 23:30:00 581

原创 C函数学习(2):GLib HashTable函数

哈希表是一种基于key-value进行访问的数据结构,可以加快查找的速度,因此在一些需要快速查找是否有重复元素的场景中,常常使用哈希表来实现。

2022-09-04 11:00:00 1557

原创 C函数学习(1):uthash哈希表

文章目录1 哈希表简介2 uthash2.1 定义结构体2.2 键类型为int2.2.1 插入2.2.2 查找2.2.3 删除2.2.4 替换2.2.5 计数2.2.6 遍历2.2.7 示例2.3 键类型为字符串2.4 键类型为字符串2.5 键类型为任意类型1 哈希表简介哈希表是一种基于key-value进行访问的数据结构,可以加快查找的速度,因此在一些需要快速查找是否有重复元素的场景中,常常使用哈希表来实现。2 uthashC语言中不存在哈希,如果自己构建则会很麻烦。第三方开源的代码中已经实现哈希

2022-08-07 08:00:00 1383

原创 嵌入式软件开发杂谈(10):CPU的使用率是如何计算的

在前面介绍了如何获取CPU使用率、如何获取线程的CPU使用率等,但是有个疑问,CPU是如何来计算使用率的?1 时间中断先说一个概念,时间中断。在Linux系统中,0号的中断是一个定时器中断。在固定的时间间隔内发生一次中断,每次中断都会定时更新系统的日期时间、更新CPU统计数用于时间片轮转来调度进程切换。而上面的“固定的时间”,在用户空间,叫做USER_HZ,一般其值是100,即每秒中断100次,在内核文件include/asm-generic/param.h中定义了它的值:# undef HZ#

2022-07-03 18:00:00 1431

原创 嵌入式软件开发杂谈(9):如何查找CPU使用率最高的函数---pref的使用

在前面文章《嵌入式软件开发杂谈(5):线程的CPU使用率》中简单介绍了如何查看线程的CPU使用率,那么问题来了,知道了某个进程或者线程的CPU使用率,那么如何知道是那个函数导致的CPU使用率升高呐?最方便的方法是使用perf工具,perf是一款性能分析工具,不仅可以用来分析系统全局性性能,还可以Fenix进程线程级别的性能,甚至到函数以及汇编级别,这里不介绍perf的用法,有兴趣的可以百度下。参考前面文章的代码,测试代码如下:#include <stdio.h>#include <

2022-06-04 08:00:00 1057

原创 嵌入式软件开发杂谈(8):动态分析工具Valgrind的配置使用

文章目录1 编译1.1下载1.2编译2 运行1 编译1.1下载http://valgrind.org1.2编译#./configure --prefix=/home/work/third_party/valgrind/valgrind-3.16.1/__install --host=arm-linux CC=arm-linux-gnueabihf-gcc然后打开configure文件,搜索armv7* 字段,将其改写为 armv7* |arm#make#make install至此,

2022-05-08 19:15:00 963

原创 嵌入式软件开发杂谈(7):静态分析工具Pclint与source insight的整合

文章目录1 安装1.1 安装1.2 配置2 集成到SI中3 生成头文件4 修改配置5 告警级别6 常见错误消除6.1 告警号406.2 告警号 10571 安装1.1 安装点击安装包中的pclint9setup.exe后, 直接进行安装注意:安装路径不要有中文和空格1.2 配置点击安装路径中的CONFIG.exe,选择如下:2 集成到SI中a)打开Source Insight软件 。b)从Tools菜单中选择“Custom Commands”命令项。点击Add…。c

2022-04-03 23:00:00 1101

原创 嵌入式软件开发杂谈(6):CPU load average简介

参考链接:文章目录1 定义2查看3 值的解释4 负载和CPU使用率之间的关系?在嵌入式开发中,我是一般关注CPU使用率这个参数。但是有次被人问到Load average怎么这么高,当时一脸懵,根本不知道这个参数说的是什么。随后查了些资料,记录下简单的说明,防止遗忘。需要详细了解的参考上面的链接,里面说的更新详细。1 定义在一定的时间间隔内,在运行队列中(即在CPU上正在运行或者等待运行的进程)和处于不可中断状态的平均进程数。2查看使用top可以看到或者使用# cat /proc/loadav

2022-03-06 06:30:00 1258

原创 嵌入式软件开发杂谈(5):如何查看线程的CPU使用率

在正常的开发中,有时候我们需要知道当前进程的每个线程的CPU使用情况,方便对每个线程进行分析,此时就需要在top指令中显示线程的使用情况。在使用中要使用prctl为线程重命名,不然在top中显示的就是主进程的名字,就无法确认是那个线程了。使用指令:#top -Hp PIDPID为进程的PID,使用后可以只看此进程的CPU使用情况。如下:或者使用指令:#top -H或#top然后再输入H即可看到所有进程的线程CPU使用情况。下面代码为上下截图的示例代码:#include &

2022-03-06 00:30:00 1819

原创 嵌入式软件开发杂谈(4):Binutils工具集

文章目录1 addr2line2 nm3 readelf3.1 -h3.2 -l3.3 -S3.4 -t3.5 -s3.6 -n3.7 -d4 size5 objdump6 strings7 strip在嵌入式开发中,如果我们使用GNU的GCC编译器,那么就会有一个比较重要的工具集binutils,该工具集中的一些工具,比较方便我们开发和调试。指令描述addr2line根据指令地址获取对应的函数、源文件名、行号nm列出程序文件中的符号以及在内存中的地址readelf

2022-02-07 10:11:28 988

原创 嵌入式软件开发杂谈(3):Linux下内存与虚拟内存

参考链接:虚拟内存与物理内存的联系与区别Linux虚拟地址和物理地址的映射Linux 虚拟内存和物理内存的理解简单记录下了解的内存与虚拟的关系。总结:1.每个进程有4G的虚拟内存空间,分为3G的用户空间和1G的内核空间2.只有在使用真正物理内存时,才将虚拟内存映射为实际的物理内存3.页表 管理内存与虚拟内存 以及映射关系设备的物理内存是有限的,是比较宝贵的资源,特别是在一些嵌入式设备中。为了能够充分利用和管理系统的内存资源,Linux采用了虚拟内存管理技术。当程序被加载时候,为每一个进程

2022-02-07 10:10:44 515

原创 嵌入式软件开发杂谈(2):Linux最大能创建多少文件?

文章目录1 查看文件描述符数量1.1 系统文件描述符最大值1.2 用户文件描述符限制值1.3 用户文件描述符可修改最大值1.4 查看系统使用的文件句柄数量2 修改文件描述符限制2.1 修改系统限制2.2 修改用户限制3 查看某个进程的使用文件数量曾经遇到一个问题,设备在正常运行的过程中,在打开一个文件时候,提示“Too many open files”,打开文件失败。当时一脸懵,然后检查代码,没有发现什么异常。但是在出现这个问题时候,发现进程的文件描述符数量已经占到了这个进程的被分配的最大值,但是实际上并

2022-01-31 10:00:00 948

原创 嵌入式软件开发杂谈(1):Linux下最大能创建多少线程?

文章目录1 与系统堆栈的限制有关2 与系统可生成的最大线程数有关3 与系统进程数目有关4 与进程拥有VMA的数量有关5 与操作系统有关先上结论:1 与系统堆栈的限制有关2 与系统可生成的最大线程数有关3 与系统进程数目有关4与进程拥有VMA的数量有关5 与操作系统有关1 与系统堆栈的限制有关在前面我们说过,linux系统为每个程序分配4GB的虚拟内存,其中用户空间的虚拟内存为3GB。正常情况下,我们使用ulimit -s查看系统的栈限制,默认是8192即8M,那么当我们创建线程的时候,Li

2022-01-31 07:45:00 3200

原创 Linux杂谈(4):ulimit简介

文章目录1 使用方法2.参数2.1 -S2.2 -H2.3 -a2.4 -c2.5 -d2.6 -e2.7 -f2.8 -i2.9 -l2.10 -m2.11 -n2.12 -p2.13 -q2.14 -r2.15 -s2.16 -t2.17 -u2.18 -v2.19 -xulimit指令可以用来查看以及设置单个用户可以使用的系统资源大小。1 使用方法ulimit: usage: ulimit [-SHabcdefilmnpqrstuvxT] [limit][-SHabcdefilmnpqrst

2022-01-09 20:00:00 707

原创 Linux杂谈(3):Epoll简介

文章目录1 epoll_create2 epoll_ctl2.1 epfd2.2 op2.3 event3 epoll_wait3.1 epfd3.2 events3.3 maxevents3.4 timeout4 示例在前面简单介绍了select的使用方法,但是select也有一些缺点,因此2.6内核引入了epoll,优化了select的性能问题。1 epoll_create函数原型: #include <sys/epoll.h> int epoll_create(int si

2022-01-09 19:30:00 381

原创 Linux杂谈(2):Select简介

文章目录1 select简介2 函数详解2.1 函数原型2.2 参数2.2.1 nfds2.2.2 readfds2.2.3 writefds2.2.4 exceptfds2.2.5 timeout2.3 文件描述集合操作2.3.1 FD_ZERO()2.3.2 FD_SET()2.3.3 FD_CLR()2.3.4 FD_ISSET()2.4 注意2.5 示例3 文件描述符集合细探4 select的缺点1 select简介在linux下,我们可以使用select来进行I/O复用,可以监视多个文件描述符

2021-12-05 17:00:00 875

原创 Linux杂谈(1):Linux IO模型

文章目录1 同步阻塞IO2 同步非阻塞IO3 IO多路复用4 信号驱动IO5 异步IO简单记录一下linux下的几种I/O模型,防止遗忘。1 同步阻塞IO同步阻塞IO是最简单的IO模型,在使用这种模型进行数据接收的时候,如果没有数据,会一直等待,即阻塞在这里,直到有数据才返回。2 同步非阻塞IO同步非阻塞IO,在使用这种模型进行数据接收的时候,不管有没有数据都会返回,不阻塞。如果没有数据,立马返回;如果有数据,从内核空间拷贝数据后返回。如果我们需要读取数据,但是没有数据立马返回,那么我们就需要不

2021-12-05 10:04:24 177

原创 GDB再学习(12):gdb server的使用

关于GDB Server的使用,在以前已经介绍过了,这里只是为了做个标记,归属于这个系列的文章。海思GDB + GDB Server调试(适用于小内存设备)

2021-11-07 17:12:07 697

原创 GDB再学习(11):如何生成Core文件

文章目录1 确认core文件开关是否开启2 修改core生成路径和文件格式前面简单介绍了GDB相关的调试经验,但是在资源有限的嵌入式设备中,很难跑的了GDB ,因此就需要程序异常时候生成的core文件来解析程序的堆栈信息,这时候就需要对linux系统进行一些设置,用于程序异常时候可以生成core文件。1 确认core文件开关是否开启我们输入指令ulimit -a# ulimit -acore file size (blocks, -c) 0data seg size

2021-10-07 19:33:37 2805

原创 GDB再学习(10):线程调试相关

文章目录1 介绍2 代码准备3 指令介绍3.1 线程启动相关打印信息3.2 查询指定id线程或全部线程信息 info threads [id]3.3 切换当前线程 thread thread-id3.4 为当前线程设置一个名称 thread name [name]3.5 查找与regexp匹配的线程信息 thread find [regexp]3.6 在location指定的位置处建立断点,断点的作用范围为指定ID的线程内 break location thread thread-id [ if cond

2021-09-05 16:57:12 1144

原创 GDB再学习(9):断点调试之事件断点

文章目录1 事件断点2 程序准备3 指令介绍3.1 捕获信号 catch signal [signal... | ‘all’]1 事件断点gdb中还提供了catch命令以便我们捕获调试期间的事件,包括信号、程序开始、程序终止和C++中的异常(exception)等。以上引用自《专业嵌入式软件开发 全面走向高质高效编程》在gdb官方的文档中,可以设置以下事件(具体解释可参考官方文档):指令throw [regexp]rethrow [regexp]catch [

2021-08-08 13:42:25 904 1

基于FFMPEG_SDL2_音视频播放_参考音频时钟

基于FFMPEG_SDL2_音视频播放_参考音频时钟,在vs2010上测试ok,是博文《基于FFMPEG+SDL2播放video---音视频同步(参考音频时钟)》中的代码,博文链接:https://blog.csdn.net/u011003120/article/details/82626615

2018-09-11

基于FFMPEG+SDL2播放视频(解码线程和播放线程分开)

基于FFMPEG+SDL2播放视频,播放线程和解码线程分开,在vs2010上测试ok,是博文《基于FFMPEG+SDL2播放视频(解码线程和播放线程分开)》中的代码,链接:https://blog.csdn.net/u011003120/article/details/82284779

2018-09-01

基于SDL2播放yuv视频

基于SDL2播放YUV视频,在vs2010上测试通过,是博文《基于SDL2播放YUV视频》中的代码,详细解释见:https://blog.csdn.net/u011003120/article/details/81985929

2018-08-24

基于FFMPEG+SDL2播放音频

基于FFMPEG+SDL2写的播放mp3文件程序,采用链表队列的方式来传递数据,详细解释见博文《基于FFMPEG+SDL2播放音频》,链接:https://blog.csdn.net/u011003120/article/details/81950045

2018-08-22

ST官方AN2659

ST 官方文档,介绍了STM8 相关的IAP流程以及一些概念。

2018-01-29

STM8L IAP应用程序编程指导

STM8L官方的介绍IAP相关知识,有兴趣的童鞋可以了解下

2018-01-29

wpa_supplicant-0.7.3.tar.gz

无线网络配置工具

2016-08-10

openssl-0.9.8e.tar.gz

openssl-0.9.8e.tar.gz 配合wpa_supplicant-0.7.3.tar.gz使用

2016-08-10

wireless_tools.29.tar.gz

wireless_tools.29.tar.gz,无线配置工具

2016-08-10

JEDI.MP1.mt7601u.v1.5.tar.gz

mt7601u的驱动源代码,从别的网站上下的

2016-08-10

etc.tra.gz

创建ok6410文件系统时使用的配置文件

2016-07-19

uboot start.s 详细分析

关于uboot中start.s的详细分析,网上找到一个大神的。

2016-06-24

wget-1.13.4.tar.gz

wget安装包,用于安装wget服务

2016-05-18

( [嵌入式系统原理与设计].沈刚.苏曙光.扫描版[

( [嵌入式系统原理与设计].沈刚.苏曙光.扫描版[ 学习嵌入式必备书籍

2015-07-02

空空如也

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

TA关注的人

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