自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1405)
  • 问答 (2)
  • 收藏
  • 关注

转载 (第十四步) STL: alloc内存配置器解析

对于创建自己的STL库来说,重点就在于alloc配置器,其他大部分还是好理解的。

2024-04-26 12:45:33 6

转载 《STL源码剖析》提炼总结:空间配置器(allocator)

STL是一个标准,只对接口进行规范,接口背后的实现可以有不同版本,所以目前流行的STL如Visual C++采用的P. J. Plauger 版本,GCC编译器采用的SGI STL版本等都是常见的STL。在接口之下,我们看到还有两级配置器,上面的接口根据情况调用这两个配置器,第二级配置器实现了内存池和自由链表,当程序多次进行小空间的配置时,可以从内存池和自由链表中获取空间,减少系统调用,提升性能。的接口,注意,不同于之前标准的allocator,这里不需要实例化一个空间配置器,只需要调用。

2024-04-26 12:44:11 4

转载 C++内存分配详解四:std::alloc行为剖析

最上边和最下边的cookie用来记录整个内存的大小。在前边的文章中我们已经了解,一般常见的内存池是为一个类维护一个内存池,说是一个类,其实它的限制并没有那么的严谨,应该说是为了一种大小的子空间维护一个内存池,也就是说,只要每次分配的内存空间的大小相同(如容器),那么就可以使用同一个内存池为其分配内存。此时,我们再次申请分配64byte的内存,这时由于pool中有内存,且大于所需分配的内存,那么就在pool中切割出尽量多的子块(大小为需要的64byte),然后将第一块交付,将剩下的挂载在#7的队列上。

2024-04-26 12:43:15 4

转载 空间的配置和释放 std::alloc

C++的内存配置基本操作时::operator new(),内存释放的基本操作是::operator delete()。这是两个全局函数相当于C的malloc()和free()函数。是的,正是如此,SGI正是以malloc()和free()完成内存的配置和释放。而且采用了复杂的内存池memory pool整理方式。对象构造前的空间分配和析构后的空间释放,定义在头文件<stl_alloc.h>中。看完了对象的构造行为和内存释放前的对象的析构行为,我们现在来看看内存的配置和释放。

2024-04-26 12:42:09 1

转载 STM32 CAN通信 滤波器配置总结

define CAN2_INIT_COMPLETE 0x20 //CAN2初始化完成标志 //#define CAN_BUS_ERROR 0x40 //CAN总线错误标志 #define CAN2_RESET_COMPLETE 0x10 //CAN2控制器复位完成标志。此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。

2024-04-25 20:12:57 4

转载 STL源码解析(gcc-4.8.5版本)

最近刚参考侯捷的<STL源码剖析>查看了STL相关的代码实现,收获有一些,追其溯源,本质上的话就是template的模板匹配以及有一些算法的结合;

2024-04-23 19:35:57 9

转载 vector

对于容器,他的存储原理就是一个数组,对于数组空间申请的话,那么就是基于中的空间分配器去进行空间申请;

2024-04-23 19:34:31 5

转载 STL 源码分析六大组件-allocator

我们都知道 size_t 在32位和64位系统上是不一样的,size_t已经可以解决平台差异了,那为什么还要引入size_type,这里我们可以理解为size_t是属于全局的,而size_type是跟容器相关的,是属于STL的一套,在其他容器中也是一样的。当然,如果我们不特别说明,直接在Linux系统下使用标准C++的stl容器,在为容器元素分配内存时,使用的方式就是类似于正常的new和delete,这种方式对于不频繁分配,并且一次分配大块内存的使用情况是适用的,典型的容器像。后续会一一分析介绍!

2024-04-23 19:33:25 8

转载 STL空间分配器源码分析(三)pool_allocator

pool_allocator是一种基于单锁内存池的空间分配器,其内部采用内存池思想,通过构建16个空闲内存块队列,来进行内存的申请和回收处理。每个空闲队列管理的内存块大小固定,且均为8的倍数,范围从8到128字节,按8的倍数递增。该空间分配器最小分配单位为8字节,低于128字节(含128)的内存块申请,采用内存池分配策略,高于128字节的内存块申请,直接从操作系统new申请。

2024-04-23 19:31:12 8

转载 c++ 9.2.0 . allocator(4)bitmap_allocator

_Alloc_block:bitmap_allocator给容器内存的最小单元;)block: bitmap_allocator一次内存申请(向CRT)的单位:包含M个_Alloc_block和相应的管理开销;)free_list: bitmap_allocator的父类,负责和CRT交互,负责真正的内存申请和回收, 同时负责全回收block的管理,根据策略决定是否回收给操作系统;)__mini_vector: 作者实现的类似于std::vector容器;

2024-04-23 19:30:26 3

转载 侯捷——STL源码剖析 笔记

通过面向对象高级编程(上)的学习,我们可以将malloc分配出的内存区块分为这几个部分。functor为算法服务,当算法需要一些额外准则时,我们使用仿函数来辅助实现算法。适配器在STL组件的灵活组合运用功能上,扮演着轴承、转换器的角色STL所提供的各种适配器中:1)改变仿函数接口者,称为函数适配器;2)改变容器接口者,称为容器适配器;3)改变迭代器接口者,称为迭代器适配器对于函数适配器,适配器他也需要获得对应的仿函数一些信息。tuple是C++11新标准里的类型。

2024-04-23 19:29:32 2

转载 关于 GNU 的 STL 版本更替

起初我以为是系统的原因,所以我安装了 Cygwin,又去 Linux 上用 yum 安装了 gcc 和 g++ ,并查看了它们的 libstdc++,发现还不是 SGI 的实现(比如不存在 stl_alloc.h 头文件)。GNU STL 是在 SGI STL 基础上开发的,所以 SGI STL 我就不再单独列出了。的安装目录,其相对路径为 .\lib\gcc\x86_64-pc-cygwin\10\include\c++,我们下面的目录都以此目录为根目录)找到所有 STL 文件。最近在看侯捷老师的《

2024-04-23 19:28:07 2

转载 STL之空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。

2024-04-22 16:54:39 7

转载 SGI-STL Allocator

改了前辈的代码...如果对我代码或者注释有意见欢迎 pr...

2024-04-22 16:53:28 4

转载 走进STL - 空间配置器,STL背后的故事

SGI 以malloc,而非 ::operator new 来分配内存,有历史因素,也有重配内存的因素在里面吧。SGI STL 的空间配置器与众不同,且与STL标准规范不同,其名为alloc,而非allocator。我在CSDN上也看到不少此类文章,但是大多是生搬硬套,很多点都讲的不清不楚,我在查资料的时候也是很懵。虽然SGI也配置了allocatalor,但是它自己并不使用,也不建议我们使用,原因是效率比较感人,所以我尽量把自己能看懂的内容摘取,看不懂的都去查了资料,工具包都嵌在文中了,或注释,或链接。

2024-04-22 16:52:30 4

转载 一篇文章彻底讲懂malloc的实现(ptmalloc)

C语言提供了动态内存管理功能, 在C语言中, 程序员可以使用 malloc() 和 free() 函数显式的分配和释放内存. 关于 malloc() 和free() 函数, C语言标准只是规定了它们需要实现的功能, 而没有对实现方式有什么限制, 这多少让那些追根究底的人感到有些许迷茫, 比如对于 free() 函数, 它规定一旦一个内存区域被释放掉, 那么就不应该再对其进行任何引用, 任何对释放区域的引用都会导致不可预知的后果 (unperdictable effects). 那么, 到底是什么样的不可预知

2024-04-22 16:51:02 10

转载 STL——模拟实现空间配置器

n)这里面内部四个成员函数其实都是单纯的转调用,调用传递给配置器的成员函数,这个接口时配置器的配置单位从bytes转为了个别元素的大小。SGI STL中容器全部使用simple_alloc接口,例如protected://专属空间配置器,每次配置一个元素大小if(...)...为了将问题控制在一定复杂度内,到此以上的这些,仅仅处理了单线程的情况。对于并发的情况,它的处理过程会相对更复杂。

2024-04-22 16:49:54 3

转载 STL空间配置器

在 C++ 里,当我们调用 new 和 delete 进行对象的创建和销毁的时候,也同时会有内存配置操作和释放操作:这其中的 new 和 delete 都包含两阶段操作:对于 new 来说,编译器会先调用分配内存;然后调用构造对象内容。对于 delete 来说,编译器会先调用析构对象;然后调用释放空间。为了精密分工,STL allocator 决定将这两个阶段操作区分开来。对象构造由负责;对象释放由负责。内存配置由负责;内存释放由负责;

2024-04-22 16:45:26 2

转载 SGI STL二级空间配置器--内存池源码剖析

在上图,可以看到在一级空间配置器中,construct和destroy,对容器对象的构造和析构,其中构造使用了定位new的方式,在指定的内存上进行对象的构造,construct调用了p->~T(),这是由于析构函数名和类型是一样的。事实上,在我们使用STL容器时,有一点没有关心到的是我们默认使用了标准库里边的空间配置器,当然标准这样的做法是为了减少学习成本,但是当我们深入学习时,就一定要明白这些容器底层是如何工作,才能注重效率,才能用好STL容器。二、二级空间配置器(内存池的分析)

2024-04-19 18:01:17 15

转载 std源码剖析及C++内存管理(二)

为了管理的方便,实际分配的大小都被调整为 8 的倍数,所以有 16 个 free lists,分别为 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128 bytes。在allocate中我们知道一级分配器是malloc分配,二级分配器是free_list管理,所以释放内存的时候,需要做判断,根据不同分配器来做不同处理,大于128字节,直接free释放掉,小于128字节,回收到free_list中.对应到G4.9就是_ret.

2024-04-19 12:53:45 11

转载 基于运动合成分解的舵轮底盘运动模型(以正三角形三轮底盘为例)

此文档原本是对附录中代码的解释,也可单独作为舵轮底盘分析的参考,除第9节的弃用方案外都已经过实践验证,第9节内容及原代码虽最终未被采用但其思路方法或许仍有些许值得参考借鉴之处,故也保留未删,也欢迎批判指正。各小节排列顺序即程序中顺序,代码已有较详细的注释,不再逐一说明功能。以下所有出现的变量除有说明外,都是结构体Wheel3(三轮底盘)中的变量,所有角度变量若无说明都为弧度制。由于调试时有过多次修改,部分代码可能和说明不一致。程序代码可分为三部分,第一部分为转机器人坐标系,单独作为一个函数;

2024-04-19 12:50:15 11

转载 线性代数导学(六):点积与叉积的作用

通过点积与叉积运算,计算机可以根据其结果的正负,判断两个向量之间的相对方位(上,下,左,右)。同时点积可以用来做投影,叉积可以用来建立三维直角坐标系。

2024-04-18 15:39:09 11

转载 CAN总线错误帧详解

在这一状态下,节点Node_A检测到一个错误就会发送带有被动错误标志的错误帧,因为被动错误标志是连续六个隐性位,所以这个时候总线上正在传输的报文位流不会受到该被动错误帧的影响,其它的节点该发送的发送,该接收的接收,没人搭理这个发送被动错误帧的节点Node_A。Tips: 处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,整个总线才相信它报告的错误,允许它破坏掉发送中的报文,也就是将这一次的发送作废。

2024-04-18 15:31:15 19

转载 一篇易懂的CAN错误帧指南

本文来自于本人公众号的几篇文章的合集,CAN帧类型中,错误帧可能会经常听到,但又非常陌生。就我做多年软件开发经历,看到过位填充错误,但也没有去分析或解决过错误帧的案例。如果提到Bus off,通讯丢失,E2E之类的,那大多数人都有所耳闻了,为什么会这样呢?这是因为错误帧属于很基础的知识点了,如果对这个基础知识有兴趣,继续下文。

2024-04-18 15:28:18 42

转载 [CAN] CAN BUS的错误检测和错误状态管理

控制器局域网络(Controller Area Network, CAN)是当今汽车和工业自动化系统的重要标准。可靠性是CAN总线协议的核心优势之一,这使其成为安全关键应用的理想选择。CAN总线错误的发生可能有多种原因,比如电缆故障、噪声、不匹配的终端电阻、CAN节点故障等。识别、分类和解决此类CAN错误是确保整个CAN系统持久性能的关键。错误处理可以识别和拒绝错误的信息,使发送者能够重新传输信息。此外,该过程有助于识别和断开持续传输错误信息的CAN节点。CAN 总线的错误管理主要需要从三个方便进行分析。

2024-04-18 15:21:12 10

转载 CAN总线技术 | 物理层04 - 终端电阻与双绞线(特性阻抗120欧)

广州虹科录制的CAN总线技术课程非常不错,建议同学们学习一下。B站的地址:https://www.bilibili.com/video/BV1gD4y1U7bJ?p=1新手最容易犯错的就是忘记在CAN总线上添加终端电阻,还有必须使用双绞线(特性阻抗约120欧)。CAN总线上的终端电阻一般使用120欧,CAN线缆一定要购买特性阻抗约120欧的电缆。

2024-04-18 15:20:00 46

转载 特征阻抗(特性阻抗):解析

如果传输线上传输的信号是低频信号,假设是1KHz,那么信号的波长就是300公里(假设信号速度为光速),即使传输线的长度有1米长,相对于信号来说还是很短的,对信号来说传输线可以看成短路,传输线对信号的影响是很小的。但是对于高速信号来说,假设信号频率提高到300MHz,信号波长就减小到1米,这时候1米的传输线和信号的波长已经完全可以比较,在。和电阻,电容,电感一样,传输线也是一种理想的电路元件,但是其特性却大不相同,用于仿真效果较好,但电路概念却比较复杂。3、传输线有两个很重要的特征:特征阻抗和时延。

2024-04-18 15:19:00 37

转载 射频同轴电缆特性阻抗测量方法的探讨

但被测电缆内部的阻抗不均匀性引起的反射不可忽视 ,测试时应把这部分影响消除掉,从而使得单个连接器中最主要的反射源来自电缆阻抗与标准阻抗的偏差, 最终可以通过测得单个连接器电压驻波比直接获得被测电缆的特性阻抗。当频率小于200 MHz 时, 单连接器法测量的电缆特性阻抗值在各频率下几乎相等, 且与传输相位法测量的结果十分接近 ,而当频率大于 200 MHz 时 ,其测得的特性阻抗测量值明显增大 , 这是由于连接器中的剩余电抗(不完全补偿)随着频率的增加而增大所致。式中 C 为单位长度的电缆电容。

2024-04-18 15:17:56 13

转载 用网线做RS485总线,需要注意这些!

专用通信电缆的“专用”主要是指,电缆的特性阻抗在120Ω,因为大多数RS485设备的内置阻抗匹配电路都是按照120Ω设计的,如果电缆的特性阻抗不是120Ω,就会阻抗不匹配,反射波会干扰原始信号导致失真。网线也是同样的,如果你用的网线特性阻抗刚好是120Ω,那么直接用RS485的120Ω终端电阻,就能很好阻抗匹配,很不幸的是,大多数网线的特性阻抗是100Ω。双绞线是抵抗差模干扰的好手,而屏蔽线则是抵抗共模干扰的利器,所以,尽量用带屏蔽层的网线,能有效改善共模干扰带来的影响,尤其是工作环境有大功率设备的时候。

2024-04-18 14:45:26 38

转载 RS-485 (TIA/EIA-485-A)网络连接指南

介绍RS-485网络的正确连接方法,包括双绞线布线及正确安装匹配电阻的建议。列出了正确端接和错误端接下的接收器波形。给出了从简单的单发送器/多接收器网络到多个收发器及多个分支电路的配置。本应用笔记提供连接RS-485网络的基本指南。RS-485规范(官方称为TIA/EIA-485-A)没有特别规定应该如何连接RS-485网络。尽管如此,规范还是给出了一些指南。这些指南和良好的工程实践是本应用笔记的基础。然而,本文提出的建议并不能涵盖设计网络的所有不同方式。RS-485在多个位置之间发送数字信息。

2024-04-18 14:18:00 17

转载 mahony 互补滤波器

陀螺仪,测量角速度,具有高动态特性,它是一个间接测量角度的器件。通过加速度计得到 Δ q a c c ^ \widehat{\Delta q_{acc}} Δqacc​​ ,然后校正四元数中的横滚(roll)和俯仰(pitch)分量。在 px4 中,磁力计使用 GPS 信息 [ 0 , 0 , m a g ] [0, 0, mag] [0,0,mag] 进行校准,故,公式与加速度计相同。在预测环节得到的四元数 q e b ( k ) q^b_e(k) qeb​(k) ,通过加速度计和磁力计的值进行校正。

2024-04-17 20:02:11 15

转载 MPU6050姿态解算——Mahony互补滤波

陀螺仪一般为六轴或者九轴构成,六轴就是三轴角速度计加上三轴加速度计,九轴就是在六轴的情况下再加上一个三轴的磁力计,而应用最广泛的MPU6050就是一个六轴陀螺仪。有一种现象很普遍也包括我自己,就是在没有用过陀螺仪之前,总以为陀螺仪可以直接得到角度数据,实际上并不然,陀螺仪(在下文中就代表MPU6050等六轴陀螺仪)只能得到角速度数据和角速度数据,从而间接得到角度。可能数理基础不错的小伙伴会想到,对角速度积分不就成了角度吗?

2024-04-17 19:46:09 38

转载 点的旋转(4):四元数的乘法

同样的,跟前面一眼四元数的乘法也代表了旋转,四元数的积有多种定义,这里我们只讲被用在旋转操作的上积 —— 矢量积。

2024-04-17 19:29:00 8

转载 STM32平台下官方DMP库6.12超详细移植教程

我们总结一下在库文件中都做了那些修改:把#include "stm32f4xx.h"修改为 #include "stm32f10x.h"1删除 #include "main.h" 和 #include "board-st_discovery.h" 头文件声明1修改 #include "uart.h" 为自己写的 #include "USART1.h"1修改 #include "i2c.h" 为 自己写的I2C头文件 #include "SI2C1.h"1。

2024-04-17 19:06:04 21

转载 点的旋转(2):四元数的推导

还记得上一节中我们怎么旋转一个二维向量的吗?我们将其放入一个复平面中,通过乘子来旋转其所在的坐标系来得到结果是的,跟2*3的例子一样,将该系下(1+0i)的位置变换至乘子r的位置,同时为了确保不会变形,我们限定乘子的模长为1(或者叫范数?随你啦),整个旋转看起来就像在圆的边上滑动。四元数,是如何推导的。

2024-04-17 19:04:52 10

转载 【51单片机快速入门指南】4.3.2: MPU6050:一阶互补滤波、二阶互补滤波和卡尔曼滤波获取欧拉角

由于每种滤波器的参数都会极大地影响该滤波器的性能(一阶滤波、二阶滤波各一个参数,卡尔曼滤波三个参数),因此难以互相比较,我建议根据单片机的资源、性能选择要用的滤波器,R参数:观测噪声协方差 R参数调整滤波后的曲线与实测曲线的相近程度,R越小越接近(收敛越快)我参考的大佬有取0.01,0.0003,0.01的,也有取0.001,0.005,0.5的。生成的程序较大,对于89C52,需要注释掉没用到的函数。(我参考的大佬有取0.8的,有取10的,我这里取5)。上位机:Vofa+ 1.3.10。

2024-04-17 18:30:32 53

转载 负数取模运算

可以看到,这个定义导致了有负数的求余并不是我们想象的那么简单,比如,-1 和 2 都是 (-7) mod 3 正确的结果,因为这两个数都符合定义。我们发现,假如我们按照正数求余的规则求 (-7) mod 3 的结果,就可以表示 -7 为 (-3)* 3 +2。看完了 (-7) mod 3,下面我们来看一看 7 mod (-3) 的情况(看清楚,前面是 7 带负号,现在是 3 带负号)。,7 = (-3) * (-2) + 1 或7 = (-3) * (-3) -2,所以余数为 1 或 -2。

2024-04-17 18:27:01 7

转载 MPU6050的原理讲解

这是由于每个芯片在制作时都不一样,数据手册上的都是理论的 值,真正的芯片在水平时Z轴可能并不是16384.我们需要找到当各个轴在0g重力时的计数, 1g时的读数,以及-1g时的读数,得到一个补偿值,在每次读取ADC结果后都进行补偿。接收时,Ry,R Z与上的X,Y,Z轴的R矢量投影。目前市面上的加速度计从输出上区分为两种,一种是数字的,另一种是模拟 的.miniAHRS 使用的是MPU6050三轴加速度计,是I2C接口的数字传感器.通过特定的命令 可以配置加速度的量程,并将内部ADC的转换结果读出来.

2024-04-17 11:19:34 20

转载 四维空间(十一):几何代数、四元数与空间旋转

四维空间(十一):几何代数、四元数与空间旋转 | Blog de Hqak (WXYHLY)

2024-04-16 20:05:35 9

转载 三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换

早些年在鹅厂实习了一段时间,因为没有什么特别紧急的需求(hahahahaha),所以主要花在了学习和捣鼓一些小工具上。有一个小需求是要实现鼠标拖动球体的转动,然后发现我不再能只用欧拉角来糊弄过去了。然后又发现,网上大部分资料的采用的欧拉角顺规都是xyz,然后我基于D3D11的辣鸡框架用了zxy,公式不太能直接套用,于是摸了两三天鱼,整理了一下几种三维旋转表示(欧拉角,四元数,旋转矩阵,轴角)与他们之间的相互转换的资料,并且加入了自己的一些推导,

2024-04-16 20:02:17 24

空空如也

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

TA关注的人

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