关于函数调用中形参的分析

JS 函数调用时的参数(形参、实参)浅析 开门见山,先考虑下面这个问题 1 var color = 'red'; 2 var style = {width: 200, height: 300}; 3 var colorList = ['black', 'red']; 4 function change (color, style, colorList) { 5 color = 'black' 6 style ... 阅读详情
关于函数调用中形参的分析

总结:SkyJacker
贡献者:LiuXiao,小冬,Bahamut, 考拉,
http://www.cnpack.org
CnPack IV  QQ Group: 130970

2007-02-02
(转贴请注明作者、出处且保持完整)

一、形参的3种基本形式
function a(b: Integer): Integer;
function a(var b: Integer): Integer;
function a(const b: Integer): Integer;

b: 函数体内给b赋值后不会传出函数外
var b: 函数体内给b赋值后会传出函数外
const b: 函数体内不可以给b赋值  

二、解释

一种是用值传递的方式,
也就是说,在参数传递的时候只把参数的值传入函数内部
另一种是地址传递的方式,在参数传递时传入参数的地址 function a(var b: Integer): Integer;
在调用A函数的时候 a(i); 其实参数是@i。  

要清楚下面的解释过程,需要看一下 《如何理解Move参数中的const Source和var Dest》
地址:

http://www.cnpack.org/showdetail.php?id=476

(一种典型的上下文 context ?)

在函数内部的Pascal实现中,Source是传入的地址再指了一次而得到的结果,
因此仍然代表传进来之前的Source。欲取得汇编中实现时传入来的地址,则需要用@Source。
也就是说,这个var封装并且隐藏了函数被调用时传入的取地址操作和函数体内部使用时指了一次的操作。

举个浅显的例子:  

procedure(I: Integer);
var
  J: Integer;
begin  
  J := I;
end;  

调用的时候,I的值被传进来,赋值给了J,这样理解没问题。  
但如果是:

procedure(var I: Integer);
var
  J: Integer;
begin  
  J := I;
end;  

那么,在底层实现中,也就是在汇编中,I的地址被传进来了,
然后函数内部指了一次,取到了它的值,赋值给了J。  
但对外来讲,J := I;这句本身所完成的功能还是没有变化。
但如果在函数体里头写 I := 0,那么这俩函数的实现功能就有区别了。  

不带var的,传入的是一个I的值,这个值存在一个临时的地方,可能是寄存器,也可能是堆栈区。
I := 0;就是把这个临时地方的值塞成0.  

带var的,传入的是I的地址,这个地址值也存在一个临时地方。
但赋值的时候,这个地址指了一次,于是就指向传入前的I了,那么I:= 0就把传入前的变量的值给改变了。  

三、测试实例
根据以上的介绍,上机测试了一下。学习乃学而时习之嘛。
//调试环境:XP sp2 + Delphi6 + Update2
//调试设置:关闭优化选项.
//主要是看看效率如何
//实际编程中应该如何应用,如何避免出现形参声明混乱的情况呢。
//暂且将过程名A,B,C 叫为A模式,B模式,C模式
//注:下面仅是对Integer形参的分析.

procedure A(I: Integer);
var
  J: Integer;
begin
  J := I;
  I := 11;
end;

procedure B(var I: Integer);
var
  J: Integer;
begin
  J := I;
  I := 12; // 由于对 Var 类型的I 复制,因此无需关闭优化选项
end;

procedure C(const I: Integer);
var
  J: Integer;
begin
  J := I;
  //I := 12; // Could not compile
end;

procedure TForm1.btnTestVarClick(Sender: TObject);
var
  Ka: Integer;
  Kb: Integer;
  Kc: Integer;
begin
  Ka := 11;
  Kb := 12;
  Kc := 13;
  A(Ka);
  B(Kb);
  C(Kc);
  Log('Ka' + IntToStr(Ka));
  Log('Kb' + IntToStr(Kb));
  Log('Kc' + IntToStr(Kc));
end;

//Delphi局部变量的生成特点:
//存入堆栈,Ka,Kb,Kc在堆栈中的地址方向为从高地址到低地址
0047D084 C745F80B000000   mov [ebp-$08],$0000000b  
0047D08B C745F40C000000   mov [ebp-$0c],$0000000c
0047D092 C745F00D000000   mov [ebp-$10],$0000000d
0047D099 8B45F8           mov eax,[ebp-$08]
0047D09C E86FFFFFFF       call A
0047D0A1 8D45F4           lea eax,[ebp-$0c]  //B Var取得是地址
0047D0A4 E883FFFFFF       call B
0047D0A9 8B45F0           mov eax,[ebp-$10]
0047D0AC E89BFFFFFF       call C
0047D0B1 8D55E4           lea edx,[ebp-$1c]

procedure A(I: Integer);
0047CD28 55               push ebp
0047CD29 8BEC             mov ebp,esp
0047CD2B 83C4F8           add esp,-$08
0047CD2E 8945FC           mov [ebp-$04],eax  //在堆栈中开辟一空间存放形参I值
0047CD31 8B45FC           mov eax,[ebp-$04]
0047CD34 8945F8           mov [ebp-$08],eax
0047CD37 C745FC0B000000   mov [ebp-$04],$0000000b
0047CD3E 59               pop ecx
0047CD3F 59               pop ecx
0047CD40 5D               pop ebp
0047CD41 C3               ret

procedure B(var I: Integer);
0047CD44 55               push ebp
0047CD45 8BEC             mov ebp,esp
0047CD47 83C4F8           add esp,-$08
0047CD4A 8945FC           mov [ebp-$04],eax  //在堆栈中开辟一空间存放传入的地址
0047CD4D 8B45FC           mov eax,[ebp-$04]
0047CD50 8B00             mov eax,[eax]     //多了一次寻址
0047CD52 8945F8           mov [ebp-$08],eax
0047CD55 8B45FC           mov eax,[ebp-$04] //多了一次寻址
0047CD58 C7000C000000     mov [eax],$0000000c
0047CD5E 59               pop ecx
0047CD5F 59               pop ecx
0047CD60 5D               pop ebp
0047CD61 C3               ret

procedure C(const I: Integer);
0047CD64 55               push ebp
0047CD65 8BEC             mov ebp,esp
0047CD67 83C4F8           add esp,-$08
0047CD6A 8945FC           mov [ebp-$04],eax //在堆栈中开辟一空间存放形参I值
0047CD6D 8B45FC           mov eax,[ebp-$04]
0047CD70 8945F8           mov [ebp-$08],eax
0047CD73 59               pop ecx
0047CD74 59               pop ecx
0047CD75 5D               pop ebp
0047CD76 C3               ret

说明如下
//对整型形参而言,
A, C的执行代码效率是比较高的,
A比较简洁,C会增加编译器处理Const的时间
A与C除了const外,内部执行过程没有任何不同。
B 用于在函数内部修改外部变量的情况.

具体如何使用呢,我想看看SysUtils.pas,StrUtils如何处理的.
我对SysUtils,StrUtils走马观花看了一下,
在SysUtils中,
大部分函数的形参,如果是基本类型,比如Integer,Byte 基本上是按照A模式.
如果形参是String,全部是B模式常量声明(没有看到没有用const的)。

比如:
function StrToInt(const S: string): Integer;
function StrToIntDef(const S: string; Default: Integer): Integer;
function TryStrToInt(const S: string; out Value: Integer): Boolean;
function IntToStr(Value: Integer): string; overload;
function IntToStr(Value: Int64): string; overload;
function TrimLeft(const S: string): string; overload;
function TrimLeft(const S: WideString): WideString; overload;

一些特例:
procedure ScanToNumber(const S: string; var Pos: Integer);
function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boolean;
function StrLCat(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
function StrComp(const Str1, Str2: PChar): Integer;

在StrUtils中,
function ReverseString(const AText: string): string;
function LeftStr(const AText: string; const ACount: Integer): string;
function RightStr(const AText: string; const ACount: Integer): string;
function MidStr(const AText: string; const AStart, ACount: Integer): string;


System.pas中
procedure _WStrDelete(var S: WideString; Index, Count: Integer);
function StrPos(const Str1, Str2: PChar): PChar; assembler;
function StrUpper(Str: PChar): PChar; assembler;
function StrLower(Str: PChar): PChar; assembler;
function StrPas(const Str: PChar): string;


关于形参声明形式的个人小总结
  相信 Delphi 中的 System,SysUtils,StrUtils 中函数形参的使用,都有其用意.
  站在巨人的肩膀上,在实际开发中,声明大部分普通函数的形参的原则为:
  如果是string格式的一定要加上const,使用C模式.
  如果是基本类型如Integer,则使用A模式,什么也不加.
  如果考虑到一些特殊的需求,比如传输内存,含有字符串删除等操作, 则考虑使用var声明.

  还有许多没有解决或没有被证明的问题:
  1、为什么string最好声明为const
  2、const 的作用 等等。
  
  
后记:
  之后,看了下 《Pascal精要》 第六章 过程与函数,觉得有些地方还是需要列出来以供参考:

1、
Pascal 例程的传递参数可以是值参也可以是引用参数。
值参传递是缺省的参数传递方式:即将值参的拷贝压入栈中,例程使用、操纵的是栈中的拷贝值,不是原始值。
当通过引用传递参数时,没有按正常方式把参数值的拷贝压栈(避免拷贝值压栈一般能加快程序执行速度),
而是直接引用参数原始值,例程中的代码也同样访问原始值,这样就能在过程或函数中改变参数的值。

2、
参数引用技术在大多数编程语言中都有,C语言中虽没有,但C++中引入了该技术。
在C++中,用符号 &表示引用;在VB中,没有ByVal 标示的参数都为引用。

3、
通过引用传递参数对有序类型、传统字符串类型及大型记录类型才有意义。
实际上Delphi总是通过值来传递对象,因为Delphi对象本身就是引用。
因此通过引用传递对象就没什么意义(除了极特殊的情况),因为这样相当于传递一个引用到另一个引用。
Delphi 长字符串的情况略有不同,长字符串看起来象引用,但是如果你改变了该字符串的串变量,
那么这个串在更新前将被拷贝下来。
作为值参被传递的长字符串只在内存使用和操作速度方面才象引用,
但是如果你改变了字符串的值,初始值将不受影响。
相反,如果通过引用传递长字符串,那么串的初始值就可以改变。

 

相关推荐

KEGG数据库与KAAS工具:基因功能注释的实用指南

本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。

weixin_29292535的博客 390

函数形参

<script> //洗衣机:生产洗衣机的时候不知道用户洗衣服的时候是放洗衣液还是酱油,我们生产的时候,只需要给用户把入口预留出来,当用户运行的时候,想放什么就从入口放入进来即可 //制定一个功能方法的时候,需要的原材料并不知道,我们只需要暴露对于的入口,执行的时候把原材料传递给我即可->暴露的那个入口就是关于函数中的形参 //扩展...

qq_41770012的博客 455

STA 静态时序分析 第三章——标准单元库中的高级功耗建模与优化策略

本文深入探讨了STA静态时序分析中标准单元库的高级功耗建模与优化策略。详细解析了动态功耗和漏电功耗的精细建模技术,包括基于波形敏感的CCS模型和温度敏感的漏电模型,并介绍了多工艺角功耗建模及低功耗设计优化策略,为纳米级芯片设计提供关键能效解决方案。

weixin_29290863的博客 224

为什么变量经过一个函数之后没有变化呢?函数的形参和实参那点事

一. 实参、形参和值传递 首先我们要知道什么是形参,什么是实参? 形参,顾名思义,形式上的参数,在定义函数时函数名后面括号里面的变量名称就是形参;而实参就是平常定义的变量;如void swap(int x,int y)和int a=10,b=50中x、y是形参,a、b是实参,实参在主函数调用时会放在括号中,如swap(a,b),此时实参的值就传给了形参,这叫值传递 二. 为什么调用了函数之后变量...

u011895157的博客 6260

从报错到优化:一次Gauss JDBC参数限制排查实录(32767参数上限避坑指南)

本文详细记录了排查GaussDB JDBC驱动因绑定参数数量超过32767上限而抛出`PSQLException`(报错信息为`Tried to send an out-of-range integer as a 2-byte value`)的全过程。文章深入分析了该限制的底层协议原理,并提供了应用层分批查询、使用临时表以及优化业务逻辑等多种解决方案,旨在帮助开发者规避此参数上限陷阱,构建更稳健的数据访问层。

rgv23456789的博客 218

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 179

C语言函数调用问题汇总

1. 形参问题 形参——形式化的参数,这种解释很抽象。 在任何编程语言中,任何变量都是某个特定的存储空间的一段而已,这一段具体有多大,由变量的类型决定,如 int 型,则为4 Byte。 在进行函数/方法的调用时,函数的实参是存在于存储空间某个具体位置的一段指定空间的,而任何函数或方法都会被程序控制器开辟一个栈空间(stack),这个空间也是一段存储位置,有时候为了效率起见,它存在于

biubiuibiu的菜园子 1万+

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 275

keil MDK编译器警告和错误详解(不定期更新)

工作后从单片机转成ARM,刚开始用ADS1.2编译器,用了一段时间,因为我接手的项目的老程序正是用ADS编译的,部门也大都在用.在学单片机的时候用的是keil c51编译器,ads和这个编译器在易用性上真是无法比较.后来渐渐知道keil已经被arm公司收购,现在keil MDK成为了arm官方编译器,所以决定重新投奔keil,利用平时的时间,将原程序重新用mdk编译.mdk的优点就没必要说了,在这

朱工的专栏 11万+

MaixCAM2 4K AI相机硬件解析与开发实战

嵌入式AI视觉开发中,边缘计算设备的选择直接影响项目落地效果。以NPU为核心的AI加速技术通过专用指令集优化,可在低功耗下实现10+TOPS算力,典型应用包括工业质检、智能门禁等实时场景。MaixCAM2作为新一代4K AI相机,搭载AX630 SoC芯片,其双核Cortex-A53与NPU的异构架构,在运行YOLOv11n模型时可达113FPS,显著优于传统方案。开发时需注意模型量化部署技巧,如INT8量化需500+张校准图片覆盖多光照条件,避免准确率下降。设备扩展性方面,PMOD接口支持热成像、ToF传

weixin_30819085的博客 691

网络可视化工具netron详细安装流程

netron安装目录1.netron 简介2.不同操作系统下的安装使用方式2.1 在线版本:只要有浏览器就可以2.2 不同操作系统安装使用3.netron支持的网络框架4.netron测试演示 1.netron 简介 在实际的项目中,经过会遇到各种网络模型,需要我们快速去了解网络结构。如果单纯的去看模型文件,脑海中很难直观的浮现网络的架构。 这时,就可以使用netron可视化工具,可以清晰的看到每一层的输入输出,网络总体的架构,而且支持各种不同网络框架,简单好用。 2.不同操作系统下的安装使用方式 2.1

江南研习社 12万+

python形参、实参

形参---函数完成其工作所需的一项信息,在定义函数时出现的参数 实参---调用函数时传递给函数的信息 提供的实参多余或者少于函数完成其工作所需的信息时,将出现实参不匹配错误。 形参实参: 定义一个函数之后,我们后面可以进行多次调用。 调用函数时,必须使得实参和形参一一对应,最简单的关联方式就是基于实参的顺序,即形参的顺序是power(x,y),实参的power(a,b)就要依次将a,...

xiachong27的博客 7847

手把手教你完成基于YOLOv8的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

手把手教你完成基于YOLOv8的商店的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理员系统,可进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2456

c语言中函数调用的原理及形参传递实质原理分析

一、 函数参数传递机制的基本理论   函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。   值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实.

u011555996的博客 2502

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【时时三省】(C语言基础)函数调用的过程和函数的返回值

山不在高,有仙则名。水不在深,有龙则灵。----优快云 时时三省。

时时三省的博客 1057

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

函数形参赋值与后置++的特殊问题

我们都知道,函数调用时,先将函数实参按照从右往左的顺序压栈,然后在函数体内,出栈并按照从左往右的顺序给形参赋值。 我们也知道,i++是先参与运算再自增,所以x = i++ 就相当于 x = i,  i += 1。 有如下代码: 从右往左,i自加1变成1,然后赋值给a,b这时候都为1 由于i++的特殊机制,使得a位置的栈弹出获取的是i在自加之前保存的值,然后再自加。 这也就方便理解...

sinat_27593959的博客 1354

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ 引用形参和指针形参

从引用形参和非引用形参的区别来看,似乎任何时候使用引用形参都指针好, 既少了实参到形参拷贝的开消,也同样可以操作(非const )实参。 那指针形参有没有什么优点呢? 1. 指针形参比引用形参更能清晰的向函数调用者表明函数可能会修改实参数 void f1(int * a); void f2(int &a); int main() { int b=1

所有内容都已迁移到 https://huqijun.org 1623

深入理解函数的参数——实际参数(实参)和形式参数(形参)

目录 初步了解函数的参数 实际参数 形式参数 深入学习 初步了解函数的参数 函数是我们编写程序必定会用到的,但是我们真的有那么了解它吗?今天就让我们从形参和实参的角度深入学习函数。 接下来让我们上一个简单的代码,是判断是否为闰年的代码,初步了解函数的参数。 #include<stdio.h> int isLeapYear(int year)//判断年份是否为闰年,是闰年返回1,否则返回0 { if ((0 == year % 4 && 0 != .

JDSZGLLL的博客 2万+

函数返回值作为形参存在的问题以及形参和实参的区别

一、问题描述 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) (A)函数调用可以作为独立的语句存在。 (B)函数调用可以作为一个函数的实参。 (C)函数调用可以出现在表达式中。 (D)函数调用可以作为一个函数的形参。 解析:函数返回值存在寄存器中(寄存器在CPU里面,不在内存里面), 没有地址, 因此不能作为形参,但可以作为实参。 二、形参与实参区别   形参出现在函数定义...

青萍之末的博客 3652

形参和实参

函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当。主要用于存储实际参数,并且当函数返回时,系统会自动。实参与形参在内存中占据不同的内存空间,(建议实参和形参名称是一样的)类型,此时程序不报错,因为符合自动类型转换的规。类型,此时将满足强制类型转换的条件,需要手动转。语句返回的数据类型一致,如果不一致,以函数定时。,实参只是将自身的值传递给形参,而不是实参本。定义一个函数,求两个数中的最大数。定义一个函数,求两个数中的最大数。,只不过当我们的函数返回类型是。

2501_90124553的博客 623

C语言:形参<=>实参

本文系统地介绍了C语言中形参和实参的核心概念。主要内容包括:1)基本定义:形参是函数定义中的占位符,实参是调用时传递的实际值;2)关键区别:形参具有独立内存空间,实参代表原始数据;3)传递方式:值传递(不影响实参)、地址传递(可修改原始数据);4)常见应用场景:包括数组、结构体作为参数的情况;5)使用技巧与常见错误:如const保护、类型匹配等。文章通过代码示例演示了不同参数传递方式的效果,并提供了对比表格帮助理解二者的本质差异。

m0_72301878的博客 630

函数调用堆栈_C底层18/2/25

前情提要 函数是C语言的基本组成单位,相信平常使用函数也是觉得很easy的,但是有没有深入了解一下其具体实现过程呢? 这里将对函数调用堆栈的具体过程做一个疏通,虽然不能保证很深入,很有知识,但能保证对函数调用堆栈的过程有一个大概的了解。因为这本身就是对初学者适用的。 我们要了解函数堆栈,就必须得先知道栈是个什么东西。先给出理论: 栈 栈在经典计算机中被定义为一个特殊的容器,用户可以...

darkfaker的博客 500

函数参数传递之引用形参和非引用形参的比较

预备知识:1.每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参;2.形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值;如果形参为引用类型,则它是实参的别名。3.非引用形参表示对应形参的局部副本,对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局部变量的值也就没有了。通过下面的程序(交换两个实参的值)来学习上面所提到的知识点。程序清单1(非引用类型——复制实参):#include using namespace std; void s

829

c语言实参形参函数调用指针引用 符号实例,c语言实参、形参、函数调用、指针、引用、&符号实例...

c语言实参、形参、函数调用、指针、引用、&符号实例 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分C C 语言实参、形参、函数调用、指针、引用、语言实参、形参、函数调用、指针、引用、*%d\n“,a); a--;a--; printf(“printf(“ 形参形参 a a 变为:变为:%d\n“,a);%d\n“,a); ...

weixin_31480911的博客 539

指针变量作为被调函数形参时让人易混淆的地方

它让p不再等于数组b. name首地址,而是指向由malloc函数分配的一块内存区域,所以后续对p的操作不会引起b.name的任何变化。,,所以执行完这条语句之后,s就不等于r了,即s和r不再指向同一个变量(p),所以后续对s的任何操作都不会引起r和p的变化。上面两段代码函数的形参都是指向指针变量的指针(指针的指针),下面再看一个简单点的例子:指向普通变量的指针作为函数形参。看上去似乎没什么区别,但就是这两句的不同导致了运行结果的不同。上述代码段1和2的main函数部分都相同,但运行结果却不同,表现在。

太阳当空照,花儿对我笑,微风轻轻拂,心情无限好。 279

STM32调试器ST-Link连接失败全链路排查指南

嵌入式开发中,调试器(如ST-Link)与目标芯片之间的通信链路是排查问题的关键。ST-Link通过SWD协议与STM32芯片通信,当出现“No ST-Link detected”错误时,通常并不意味着USB驱动问题,而是调试器无法扫描到目标芯片。理解这一原理后,排查路径变得清晰:从驱动安装、固件升级、SWD接线、供电复位,到IDE配置与降速测试,逐步定位故障环节。本文结合工程实践经验,梳理了从USB枚举到SWD信号完整性的全链路排查方法,并针对山寨调试器、代码占用调试口、低功耗模式等深坑给出解决方案。掌握

weixin_33933118的博客 231
上一篇: 如何理解Move参数中的const Source和var Dest
下一篇: 壳学习一:PECompact 2.x 加壳脱壳
skyjacker
博客等级 码龄23年 11粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值