- 博客(208)
- 收藏
- 关注
原创 GDB: coredump
or#-c指定转储的core文件# 进入后输入bt查看调用栈bt #显示所有帧栈bt 10 #显示前面10个帧栈(感觉没啥用)bt -10 #显示后面10个帧栈(感觉没啥用)bt full #显示帧栈以及局部变量效果如下:这篇文章主要讲GDB和coredump两个方面。
2025-03-29 17:40:09
951
原创 BSCAN2-4:Process DFT Specification and Extract ICL
下一步是处理在上一步中创建、编辑和验证的DFT(Design for Test)规范。此步骤将创建并插入DFT规范中所有组件的硬件。使用命令生成并。对于Tessent BoundaryScan,TAP控制器和 boundary scan cells 将被插入。由于 bundary scan 连接到TAP,而TAP是一个IJTAG节点,因此使用IJTAG。以下示例生成并插入设计中由DFT规范请求的硬件。以下示例生成由DFT规范请求的硬件,但不将硬件插入设计中。
2025-03-19 10:29:01
339
原创 BSCAN2-3:Create DFT Specification
在设计流程的下一步是。使用命令可以根据之前在步骤中定义的 DFT 需求,创建一个默认的 DFT 规范。你可以使用命令来报告这个默认的 DFT 规范。有多种方法可用于编辑或配置 DFT 规范,以满足你的特定需求。
2025-03-18 18:34:05
411
原创 BSCAN2-2:Specify and Verify DFT Requirements
测试访问端口(TAP)需要四个必需的引脚(TDI、TCK、TMS 和 TDO),这些引脚必须连接到芯片级的pad IO macro。:如果需要为 TDI、TMS、TCK 和 TDO 指定内部引脚,并且这些引脚连接到芯片级的焊盘 IO macro,则需要两次插入过程。以下示例展示了在嵌入式边界扫描中,如何提供一个需要插入边界扫描单元的pad I/O 端口的 Tcl 列表,并将设计级别设置为子模块级别。TAP 引脚可以在约束文件(dofile)中指定,也可以在引脚顺序文件中定义。
2025-03-18 18:16:54
1027
原创 BSCAN2-1:load design
扫描链从引脚顺序文件第一行中列出的端口所创建的单元开始,接着是第二行中列出的端口所创建的单元,依此类推。
2025-03-18 11:22:22
966
原创 BSCAN1:Intruoduction to Tessent Boundary Scan
由于表面贴装器件(SMD)的普及,印刷电路板(PCB)的在线测试(In-circuit test)已经变得不那么有效。边界扫描(Boundary Scan)技术提供了在线测试的优势,而无需物理访问电路板上的电气网络。通过添加边界扫描逻辑,您可以检测到大多数电路板制造过程中的故障:错误的元件缺失的元件方向错误的元件引脚卡住、短路或开路的元件焊接失败(Failed wire bonds)
2025-03-18 10:39:49
805
原创 第7章 站在对象模型的尖端3: RTTI
运行时类型识别(RTTI)允许程序员查询对象的实际类型,以及将基类的指针或引用转换为派生类的指针或引用。这里的type是所有类型的基类,fct代表单一函数类型,而gen代表可以被重载的函数类型。当尝试将 type* 指针转换为 fct* 时,如果该指针实际上指向的是 gen 对象,那么使用 static_cast 将导致未定义行为,因为 gen 和 fct 的内存布局可能不同。
2025-03-16 20:13:51
764
原创 第7章 站在对象模型的尖端2: 异常处理
如果在 catch 块内部再次抛出异常(例如 throw或者 throw e),那么原始的异常对象会被复制,并且新的副本会被传递给下一个匹配的 catch 子句。当一个异常被抛出时,异常处理机制需要确定异常对象的实际类型,这样才能找到匹配的catch子句。如果catch子句中有throw语句来重新抛出异常,那么原来的异常对象会被复制,新的副本将被传递给下一个catch子句。在这种情况下,p是原始异常对象的引用,任何虚函数调用都会基于exVertex的实际类型,对p的修改会传递到下一个catch子句。
2025-03-16 19:48:15
1013
原创 第7章 站在对象模型的尖端1: Template
template functions的实例化:目前有两个策略,一个是编译时期策略,另一个是链接时期策略。但这两个策略都有一个共同的缺点:当template实例被产生出来时,有时候会大量增加编译时间。总结因为模板类型不确定,所以对一个模板类型的变量赋初值可能会是错误的。因为模板类型不确定,所以并不是所有运算符都会支持。模板最后应该以分号结束。因为,在模板类中,所有关于类型的检查会延迟到实例化之后才会发生。
2025-03-16 19:15:00
626
原创 第6章 执行期语义学3:临时对象
s+t 产生的临时对象如果在调用 printf 之前就被摧毁,那么经由 conversion 运算符交给他的地址就是不合法的,真正的结果视底部的delete运算符在释放内存时的进取性而定。临时对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。4. 两个临时对象,为了放置上述第一个和第二个临时对象,为的是完成第三个临时对象。完整表达式中,每一个式子产生的临时对象都应该在这个完整表达式被求值之后才能销毁。3. 一个临时对象,放置上述两个临时对象的相减的结果;
2025-03-16 12:10:24
902
原创 第6章 执行期语义学2:new 和 delete 运算符
但是事实上它是由两个步骤完成的通过适当的 new运算符函数实例,配置所需要的内存。*pi = 5;delete运算符的情况类似delete pi;当写下上面这句代码时,如果pi的值是0,C++语言会要求delete运算符不要有操作。我们在看看一个class object 吧而 destructor 的应用也极为类似如果在考虑异常捕获的情况下,我们需要将destructor放在一个try区段中。异常处理会调用delete运算符,然后再一次抛出异常。
2025-03-15 22:21:42
583
原创 第6章 执行期语义学1:对象的构造和析构
我们通过几个例子来看看一般的构造函数和析构函数是怎么安插的吧如上所示,每当一个对象被定义的时候,编译器就会显式插入一个该对象的构造函数,当该对象所在的作用为即将结束的时候,编译器就会自动为它安插一个析构函数。
2025-03-15 21:13:03
666
原创 第5章 构造、析构、拷贝语义学4:析构函数语义学
一个object的声明结束于 destructor 开始执行时,由于每个base class destructor都被调用,所以derived object实际上变成了一个完成的object。与构造函数相比,即使拥有虚函数或者虚拟继承,不满足上述两个条件,编译器是不会合成析构函数的。如果有任何 virtual base classes 拥有 destructor,而目前讨论这个class是最尾端(most-derived)的class,那么它们会以原来构造顺序相反的顺序依次被调用。
2025-03-15 17:32:57
220
原创 第5章 构造、析构、拷贝语义学3:对象复制语意学
如果不对class point提供copy assignment operator,光是依赖默认的memberwise copy,编译器不会产生出一个实例,因为此class已经有了bitwise copy语意,所以implicit copy assignment operator被视为毫无用处,根本不会合成出来。当一个class声明了任何virtual function(一定不要拷贝右端class object的vptr地址,因为他可能是一个derived class object)时。
2025-03-15 17:10:11
333
原创 第5章 构造、析构、拷贝语义学2: 继承情况下的对象构造
只有当一个完整的class object被定义出来(例如 Point3d origin)时,它才会被调用,如果object只是某个完整的object的subobject,他就不会被调用还可以把constructor一分为2,一个针对一个完整的object,一个针对subobject,完整的object无条件调用virtual base constructor,设定vptrs,subobject不调用virtual base constructor,也可能不设定vptrs。
2025-03-15 16:50:11
1012
原创 第5章 构造、析构、拷贝语义学1: “无继承”情况下的对象构造
🍉重点:const与virtualpublic:private:一般而言,类的data members应该被初始化,并且只在constructor中或者类的其他member functions中指定初值。其他任何操作都将破坏封装性,使class的维护和修改更加困难。不将一个函数声明为const,意味着此函数不能够获得一个const reference或const pointer。将一个函数声明为const,意味着不能对data members进行更改。
2025-03-15 14:27:21
651
原创 第4章 Function 语意学3: 函数效能、Member Functions、inline
取一个 nonstatic member function 的地址,如果该函数是 nonvirtual,则得到的结果是它在内存中真正的地址。然而这个值需要被绑定于某个 class object 的地址上,才能够通过它调用该函数。所有的 nonstatic memberfunctions都需要对象的地址 (以参数 this 指出).回顾一下,一个指向 member function 的指针,其声明语法如下。
2025-03-11 20:58:20
687
原创 第4章 Function 语意学2: Virtual Member Functions
每一个 class 有一个virtual table,内含该 class 之中有作用的 virtual function 的地址;然后每个 object有一个 vptr,指向 virtual table 的所在。
2025-03-06 22:21:52
588
原创 第4章 Function 语意学1: Member的各种调用方式
C++ 的设计准则之一就是:nonstatic member function 至少必须和一般的nonmember function 有相同的效率。那么选择 member function 不应该带来什么额外负担。这是因为编译器内部已将member 函数实体”转换为对等的“nonmember 函数实体。现在这个函数已经被转换好了,而其每一个调用操作也都必须转换。
2025-03-06 21:47:37
699
原创 第3章Data语义学4:成员的效率
但这里如果直接操作,因为int Base2::*bmp 只是一个offset,而derived地址下依次是Base1和Base2,根据offset,正好找到 Basel::val1 , 而非程序员所以为的 Base2::val2。例如,假设我们有以下代码:其功能是希望通过成员指针 int Base2::*bmp 访问派生类 Derived 的某基类成员Base2::val2。由于被继承的 data members 是直接存放在 class object 之中,所以继承的引入不会影响这些代码的效率。
2025-03-05 20:14:19
296
原创 第3章Data语义学3:继承 与 Data Member
在 C++ 继承模型中,一个 derived class object 所表现出来的东西,是其自己的 members 上其 base class(es) meinbers 的总和。至于 derived class members和 base classies) members 的排列次序并未在 C++ Standard 中强制指定:理论上编译器可以自由安排之。
2025-03-04 21:52:01
922
原创 第3章Data语义学2:Data Member的布局与存取
最终空间结构为,x y z 被顺序存储freeList 和 chunksize被存放另外的静态空间(static segment)中。因为,Nonstatic data members 在 class obect 中的排列顺序将和其被声明的顺序一样,任何中间静态变量都不会被放进对象布局之中。当出现继承关系时(access sections,即private、protect、public等),
2025-03-04 21:15:45
808
原创 第3章Data语义学1:Data Member的绑定
X Y Z A 中没有任何数据,但这样 X 的大小也不为0,具体sizeof()如下:sizeof x 的结果为 1sizeof Y 的结果为 8sizeof z 的结果为 8sizeof A 的结果为 12事实上并不是空的,它有一个隐晦的 1byte,那是被编译器安插进去的一个char。X a,b;" << endl;🍎 那为什么Y Z 是8捏?语言本身所造成的额外开销 (overhead)。
2025-03-04 20:47:00
931
原创 第2章 构造函数语义学3 : 程序转化语义学
如果 Point3dclass 声明一个或一个以上 virtual functions,或内含一个 virtual base class,那么使用上述函数将会导致那些“被编译器产生的内部 members”的初值被改写。return 指令传回相同类型的局部变量(named value),因此编译器有可能自己做优化,也就是大名鼎鼎的NRVO。但这样不好,会导致出现大量的 constructor ,大大增加了代码维护难度。针对这些程序改写的情况,我们做出一些优化,来避免临时对象的构造拷贝与析构。
2025-03-02 17:56:26
838
原创 第2章 构造函数语义学2 : Copy Constructor的构造操作
默认行为,递归调用成员拷贝构造函数或复制值。必须显式定义拷贝构造函数来管理深拷贝资源(如指针)。
2025-03-02 14:02:06
720
原创 【无标题】
指得那些 generated clock 的电路;时钟经过组合逻辑会直接连接到PO上;这种电路存在的问题:如上图所示位置存在 stuck@1 的fault是可以测到的但是stuck@0的fault;由于其本身为clk,现又为PI ,双重身份,使它不能随便赋1;无法检测stuck@0 的fault;为了解决这个问题: 一个附加的timeplate被安排上了;这个timeplate 会自动生成,在basic pattern capture或者 load/unload 的时候 它表现为一个规则的时钟;
2025-01-24 18:00:23
1062
原创 perf性能分析
让我们从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
2025-01-02 21:43:08
1127
原创 Ubuntu忘记root密码解决方案
3、执行该命令后,需要验证当前 sudo 用户账户的密码,并两次输入新的 root 密码,即可完成重置。系统会要求你输入两次新密码进行确认。出于安全考虑,输入的密码不会显示出来。1、启动 Ubuntu 系统并登录一个具有 sudo 权限的用户账户。启动 Ubuntu 系统,在出现 GRUB 启动界面时,选择「
2025-01-01 13:24:19
4294
1
原创 3. 指针、数组
当数组作为函数参数时,当传入 数组名[] (A [] ) 并不会将整个数组拷贝一遍,编译器将形参的int A[ ]理解为指针,而非数组。//字符串存放在只读数据区,不可修改。//字符串存放在栈空间,可修改。上图的指针为4 bytes。
2024-12-29 19:12:33
422
原创 1.指针的基本介绍
计算机的内存(RAM 随机存储器)段或区,在内存中都代表一个字节,作为一个典型的内存系统,每个字节都有一个地址。系统内部会有一张表,通过查表就可以知道不同变量所占用的内存大小。
2024-12-28 21:09:02
253
原创 条款22 当使用 Pimpl 惯用法,请在实现文件中定义特殊成员函数
unique_ptr存在的问题,shared_ptr都不回存在,因为两者支持自定义删除器的方式不同。
2024-12-28 20:02:56
332
原创 条款21 优先考虑使用 std::make_unique 和 std::make_shared 而非 new
①与②都会被分配到堆上,如果使用new,会向堆上申请两次内存。而make_shared会一次性的将所需内存都申请下来。
2024-12-28 19:28:38
434
原创 条款20 当std::shared_ptr 可能悬空的时候使用std::weak_ptr
虽然 weak_ptr 不能掌握 Widget 的生死。但是 weak_ptr 知道 Widget 死没死。
2024-12-28 19:02:31
189
原创 条款19 对共享资源使用std::shared_ptr
查看 三、control block的生成时机, 调用拷贝构造就不会创建blcok。上面的代码会创建两次 control_blcok ,那有什么解决方法?std::shared_ptr没有这种写法。但是下面这两种写法也会存在问题。
2024-12-28 15:01:11
407
原创 条款18:对独占资源使用std::unique_ptr
/ 方式1// 方式2// 调用// 16字节// 8字节尽可能的传入lambda表达式,而不是指针具有很多状态的自定义删除器会产生大尺寸的std::unique_ptr对象。如果你发现自定义删除器使得你的std::unique_ptr 变得过大,则你需要审视修改你的设计。
2024-12-28 14:22:20
280
原创 基础16 Array new、Array delete与std::allocator的引入
对于上面的代码 delete 后面的 [] 可有可无,因为 new 进行分配内存的时候,分配了多少就已经被记录。否者, delete 后也不可能只跟 [] 而没有具体的个数。所以当我们执行 new 的时候,操作系统在堆上申请内存要比想象的多(cookie)。
2024-12-28 13:46:49
224
原创 基础15 重写operator new/operator delete的意义是什么
【代码】基础15 重写operator new/operator delete的意义是什么。
2024-12-28 11:56:21
81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人