你今天volatile了吗?--兑现允诺

IEC 61851-24:2023 电动汽车导电充电系统 - 第24部分:直流电动汽车供电设备与电动汽车之间的数字通信,用于控制直流充电 - 完整英文电子版(110页) IEC 61851-24:2023 与 IEC 61851-23 共同适用于直流电动车供电设备与电动道路车辆(EV)之间的数字通信,用于控制导电直流电力传输,额定电源电压最高可达1000伏交流电或最高1500伏直流电,额定输出电压最高可达1500伏直流电。 立即下载
  上一篇文章《你今天volatile了吗?--准确定位》(后面简称《准确定位》)主要探讨关于volatile在定义设备寄存器时应该放到什么位置最合适的问题。另外,在文章中也提到下面两个观点:
*对任意数据类型T,C提供一种标准内置的转换。这个转化可以完成从T指针到volatile T指针的转换,并规定其逆过程即volatile T指针向T指针转换为非法。
*const指针和volatile指针在转换规则方面具有相似性。
本篇文章就后一个观点继续深入探讨。
本人认为const指针的转换规则与const指针的基本一致,因此只要我们懂得其中的一种规则,那么另外的一种就可以不攻自破。关键就是要懂得其中的共同规律,而不是去死记硬背一些具体应用。

1.自相矛盾
T *p;
...
void f(T const *qc);

如果调用f(p)将p传入函数,T指针将会转换成const T指针。整个转换过程是自动完成的,不必人为地强制转换T指针。这是一条潜规则。相反,在下面情况下,如果调用g(pc),就会产生编译错误:
T const *pc;
...
void g(T *q);

因为编译器拒绝将const T指针转换成T指针。这也是一条潜规则。
让记住下面的推断:如果你许诺你使用const是不让其它程序改变const对象的内容,那么你自己在后面编写const相关代码时必须要遵守这个许诺。就象一些做官的,表面是一套,背后又是另一套,最后对自己的所做所为不能自圆其说!
下面举个简单的例子来说明诺言是怎么许下,又是怎么被打破的。
假设有人写了下面的代码:
int const *p;
显然,他希望通过const阻止任何有意图去修改const对象的内容的行为,可他又继续写下了"挨扁"的代码:
*p += 3; /*改变p指向的内容*/
++(*p);

因为,他自己又去修改p指针指向的内容,自相矛盾啊!!!
那让我们回头看原先的代码:
T const *pc;
...
void g(T *q);

当你定义const类型的指针pc,等价于你对编译器许诺说我决不允许有代码直接地或间接地甚至潜在地去修改pc指向的内容。当然,我们的编译器是“大好人”,肯定会爽快地答应。接着,你又对编译器许诺说g函数可以修改通过q传入的任何指针的内容。最后你试着调用g(pc)将p通过pc传入g。这时编译器肯定看不过去了,一定会这样地质问你:
你为何将const指针pc传入可能会改变pc指向内容的g函数呢,你不是决不允许其它代码直接地或间接地甚至潜在地去修改pc指向的内容吗,你现在将pc传入g函数不是自己打自己嘴巴吗?嘿嘿,哑口无言了吧!所以,既然做出了许诺,就要坚持到底
继续下面的代码:
T *p;
...
void f(T const *qc);

显然,你许诺编译器说任何代码都可以改变p指向的内容并且你编写的f函数不会改变通过qc传入的其它指针指向的内容。编译器又一次爽快地答应了你。最后你调用了f(p)。这次,编译器只是对你笑笑,心理暗自道:小样你可别让我逮到在f函数中调用诸如g之类可能会改变p指向的代码哦!

2.Const vs Volatile
前面提过,const指针的转换规则与const指针的基本一致。不同的是const是你答应编译器不会编写可能改变const对象指向的内容的代码,而volatile则是编译器答应你不会对相关代码进行优化。
看下面的代码:
T volatile *pv;
...
void g(T *q);

对比const可以知道,调用g(pv)肯定会出现编译错误。因为你跟编译器说不要间接或直接地甚至潜在地优化pv相关的代码,同时你又有跟编译器说它可以优化通过q传入的指针的相关代码。如果你调用g(pv),将不能优化的pv传入可能会优化pv的g函数,显然也是危险并且自相矛盾的做法。
再看:
T *p;
...
void h(T volatile *qv);

对比const可以知道,调用h(p)不会有事,因为编译履行了它的诺言,不在h函数中优化通过qv传入的任何指针相关的代码。

结论:const指针的转换规则与const指针的基本一致,主要的不同在于谁许下了诺言。对于const,诺言的主体是我们自己,而对于volatile则是编译器。不论谁许了诺,都必须遵守并兑现它。

 
Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典) 立即下载

相关推荐

北京大学数字普惠金融指数2011年-2023年(PKU-DFIIC)

该数据集可能涵盖以下几个方面:一是金融服务的可达性,涉及金融服务在不同人群和不同地区的普及程度,尤其是对中小企业、农村地区和低收入群体的覆盖;二是数字金融服务的使用情况,包括电子支付、网络贷款、互联网保险、数字资产管理等,反映人们在日常生活中对数字金融服务的依赖与使用;三是普惠金融的普及程度,可能包含金融服务覆盖的人群比例、地理范围以及服务种类和使用频率;四是创新技术的应用情况,涵盖大数据、区块链、云计算、人工智能等新技术在金融服务中的应用程度及其影响;五是监管环境与政策导向,反映国家和地方政策对数字普惠金融发展的支持与监管;六是金融服务的满意度与问题,收集用户对数字金融服务的满意度评价以及服务过程中遇到的问题和挑战。 该数据集对研究机构、政策制定者和金融科技公司均具有重要价值。研究机构可借助这些数据了解数字普惠金融的发展趋势和模式,识别影响普惠金融发展的关键因素;政策制定者可依据数据内容制定针对性政策,推动金融服务均衡发展;金融科技公司则可通过分析数据优化产品设计,满足不同用户群体的需求。 此外,感兴趣的读者可通过文中提供的链接查阅详细介绍和样例数据,进一步了解数据集的构成与应用方式。该链接指向一篇博客文章,文章详细介绍了数据集的结构和内容,并可能提供样例数据供参考,帮助读者更好地理解和使用这些数据。数据集标签为“数据集”,说明它是一个经过整理和加工的原始数据集合,便于学者和研究人员在不涉及原始数据收集过程的情况下直接使用这些数据开展研究和分析,有助于缩短研究时间、提升研究效率并促进知识共享。

国外嵌入式面试题

Embedded System Interview Questions: Can structures be passed to the functions by value? Why cannot arrays be passed by values to functions? Advantages and disadvantages of using ma

嵌入式软件 4759

【带状电容器计算用于电容式触摸传感器应用】半数值模型的电容式触摸传感器集成于金属基材涂层中研究(Matlab代码实现)

内容概要:本文针对电容式触摸传感器在金属基材上应用时易受干扰的问题,提出一种基于半数值模型的仿真分析方法,用于精确计算带状电容器在金属背景下的电容变化。研究通过构建合理的物理模型,结合电磁场理论与数值计算技术,在Matlab平台上实现代码仿真,有效克服金属环境对传感器性能的负面影响,提升其在复杂材料表面工作的稳定性和灵敏度,具有良好的工程应用前景。该方法不仅适用于基础研究,也可为实际产品中抗干扰触摸传感器的设计提供理论依据和技术支撑。; 适合人群:具备电磁场与微波技术基础知识及Matlab编程能力,从事传感器设计、人机交互设备开发、嵌入式系统研发等相关领域的高校研究生、科研人员和工程技术人员。; 使用场景及目标:①开展电容式触摸传感器在金属基材上的集成与优化设计;②掌握半数值建模与仿真方法在电磁传感系统中的应用;③为工业环境下高抗扰触摸器件的研发提供仿真验证手段与设计指导。; 阅读建议:此资源强调物理建模与数值仿真的紧密结合,建议读者结合电磁学原理深入理解边界条件设置、介质分布建模与电场求解过程,并动手运行Matlab代码,调试参数以观察电容响应特性,从而全面提升对传感器工作机制与仿真分析能力的掌握。

offsetof,搞嵌入式必须会的杀手锏

在嵌入式应用中,或许你对offsetof接触不多甚至根本没见过。如果是这样,那么从这一刻起就好好地掌握它,让它成为你的又一杀手锏吧。1. offsetof与EEPROM  我们许多人可能都使用过一些非挥发性的存储器,如常见的EEPROM。我们经常使用它们在存储一些系统的配置参数和设备信息。在所有的EEPROM中,通过串口访问的占了大多数。一般来说,对串口的访问都是按字节进行的,这使得我们不可避

嵌入式软件 2107

【顶级EI复现】基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法(Simulink仿真实现)

内容概要:本文提出了一种基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法,旨在实现高效、高可靠性的电力转换。该方法通过建立精确的电路数学模型,结合KKT最优性条件进行分段解析优化,有效协调零电压/零电流软开关实现条件与功率器件电压电流应力之间的矛盾,在确保宽范围软开关的前提下显著降低器件的电气应力,从而提升系统效率与寿命。文中详细阐述了控制策略的理论推导过程,并在Simulink平台上构建了完整的闭环仿真模型,验证了该方法在动态响应速度、转换效率优化及器件应力抑制等方面的优异性能,是对高水平EI期刊研究成果的高质量复现; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员,以及从事DC-DC变换器控制算法开发的工程师;适用于具备扎实电路拓扑分析能力与现代控制理论基础的专业技术人员; 使用场景及目标:①深入理解双有源桥(DAB)变换器的工作机理与关键控制挑战;②掌握将非线性优化问题转化为KKT条件求解的方法及其在电力电子系统中的实际应用;③学习如何通过分段解析策略实现多目标(软开关与低应力)协同优化控制;④复现并拓展EI级论文中的先进控制算法,支撑科研创新与工程实践; 阅读建议:建议读者结合提供的Simulink仿真模型,逐步跟进理论推导与控制逻辑实现过程,重点关注KKT条件的引入方式、边界约束处理及闭环控制器设计细节,同时可尝试将该优化思想迁移至其他隔离型DC-DC变换器拓扑中进行对比验证,以深化对先进优化控制策略的理解与应用能力。

无刷直流电机(BLDCM)转速电流双闭环控制、三相桥式星型全控电机研究(Simulink仿真实现)

内容概要:本文围绕无刷直流电机(BLDCM)的转速电流双闭环控制系统展开深入研究,重点基于Matlab/Simulink平台构建三相桥式星型全控电路的高精度仿真模型,实现对电机运行状态的精确控制。研究系统性地对比了传统PID控制与模糊PID控制策略在动态响应速度、抗干扰能力、稳态精度及鲁棒性等方面的性能差异,深入剖析电流环与转速环的协同作用机制。同时,文章进一步引入无位置传感器控制技术与滑模观测器(SMO),有效解决了机械传感器带来的成本与可靠性问题,提升了系统的集成度与工程实用性。所提供的多个仿真模型(含模糊神经网络PID等高级控制策略)为控制算法的验证与优化提供了可复现的技术路径,仿真结果可为电机驱动系统的工业设计与科研创新提供坚实的理论依据和技术支撑。; 适合人群:自动化、电气工程、电力电子与电机控制等相关专业的本科生、研究生,以及从事电机驱动系统研发、新能源汽车、工业自动化等领域工作的工程师和技术人员。; 使用场景及目标:①掌握无刷直流电机双闭环控制系统的建模、仿真与调试全流程;②深入理解并实践传统PID与模糊PID控制器的设计原理与参数整定方法;③探究无位置传感器控制与滑模观测器等先进估测技术的实现机理;④为毕业设计、科研课题、课程项目或工业级电机控制器开发提供可直接借鉴的仿真基础与解决方案。; 阅读建议:建议读者结合Matlab/Simulink环境进行动手实践,按照文档指引逐步搭建模型,重点观察不同控制策略下的系统响应曲线,深入分析控制参数变化对性能的影响,并鼓励在此基础上拓展研究如负载突变、参数摄动等复杂工况下的控制策略优化。

你今天volatile了吗?--慎重使用

  根据c/c++语法,const可以出现的地方,volatile几乎也都可以出现。但是,const修饰的对象其值不能改变,而volatile修饰的对象其值可以随意地改变,也就是说,volatile对象值可能会改变,即使没有任何代码去改变它。在这一点上,最典型的例子就是内存映射的设备寄存器和多线程中的共享对象。懂得使用volatile也是一门小小的艺术。使用volatile约束符可以阻止编译器对代

嵌入式软件 2053

【顶级EI复现】新扩展移相角下的双有源桥DC-DC 变换器优化控制策略(Simulink仿真实现)

内容概要:本文聚焦于“新扩展移相角下的双有源桥DC-DC变换器优化控制策略”的高水平EI论文复现与深化研究,系统性地实现了基于扩展移相调制(EPS)的DAB变换器控制方案,重点涵盖软开关技术的实现、器件最小应力优化及双闭环控制系统的设计。通过Simulink平台构建完整的仿真模型,验证了该控制策略在提升能量转换效率、降低功率器件电压电流应力、改善动态响应性能等方面的优越性,体现了先进控制理论与电力电子系统深度融合的技术特征。; 适合人群:电力电子、电气工程及其自动化、新能源系统控制等方向的研究生、科研人员及从事DC-DC变换器研发的工程技术人员,尤其适合具备电路拓扑分析能力与控制系统仿真基础的专业人士。; 使用场景及目标:①深入掌握双有源桥变换器的工作机理及其在电动汽车、微电网、可再生能源并网等场景中的关键技术应用;②理解并实现扩展移相调制(EPS)与软开关、最小应力优化之间的协同控制机制;③学习高水平EI期刊论文的建模规范、算法设计逻辑与仿真验证方法,提升科研实践能力;④为后续开展多模块并联、数字化控制或新型调制策略创新提供技术储备。; 阅读建议:此资源以Simulink仿真实现为核心载体,建议读者结合文档逐步搭建模型,重点关注调制信号生成、闭环控制器参数整定、软开关边界条件分析及系统性能对比,鼓励在复现基础上进行拓展性研究,如引入数字延迟补偿、优化启动策略或多模式切换逻辑,以深化对DAB系统动态特性的理解。

你今天volatile了吗?--准确定位

  在前一篇关于volatile文章《你今天volatile了吗?--慎重使用》(在后面,简称《慎重使用》)中提到,volatile定义的对象其内容可能会忽然的变化。换句话讲,如果你定义了一个volatile对象,就等于你告诉编译器该对象的内容可能会改变,即使代码中没有任何语句去改变该对象。编译器访问非volatile对象和volatile对象的方式很不一样。对于前者(经优化后),它先将非vola

嵌入式软件 1937

三相PWM整流器双闭环控制仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink仿真实现的三相PWM整流器双闭环控制仿真模型,重点阐述了电流内环与电压外环协同控制的原理与实现方法。通过构建完整的控制系统模型,深入解析PWM整流器的工作机制、动态响应特性及系统稳定性控制策略,帮助读者掌握电力电子系统中典型控制结构的设计思路。文章不仅提供可操作的仿真建模流程,还结合科研实际需求,配套丰富的学习资源链接,涵盖智能优化、机器学习、图像处理、路径规划、通信与信号处理、电力系统管理等多个技术领域的仿真案例,具有较强的实践指导意义。; 适合人群:适用于电气工程、自动化、电力电子及相关专业的本科生、研究生、科研人员,以及具备一定MATLAB/Simulink基础并从事电力电子系统仿真与控制研究的专业技术人员。; 使用场景及目标:①深入理解三相PWM整流器的工作原理及双闭环控制策略的设计与调试;②独立搭建并优化电力电子系统的Simulink仿真模型,服务于课程设计、毕业设计或科研项目;③借助配套资源拓展至多学科交叉领域的仿真研究与算法应用。; 阅读建议:建议按照文档结构结合网盘提供的仿真文件逐步实践,重点关注控制器参数整定、系统动态性能分析与仿真模块搭建,并配合相关理论学习以提升对电力电子系统控制本质的理解。

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 518

一道微软亚洲工程院C语言笔试题的解答

 题目:struct S{  int i;  int * p;};void main(){  struct S s;  int * p = &s.i;   p[0] = 4;  p[1] = 3;   s.p = p;   s.p[1] = 1;  s.p[0] = 2;}问程序会在哪一行死掉。分析:这道题有点难度。如果你对指针掌握的不错的话,仔细分析,相信最终还是可以迎刃而解的。下面

嵌入式软件 1904

Moveit +Gazebo:搭建单臂机械臂仿真平台

Moveit +Gazebo:搭建单臂机械臂仿真平台

magic_invaid的博客 5288

关于C的0x8本“经书”[嵌入式必读]

  在当今嵌入式“武林”中,流传着几本人人都想偷学几招的C语言的武功秘籍。这些秘籍都是旷世武学奇才耗尽毕生精力所著,部分秘籍流经数十载仍经久不衰,让它的无数实习者受益匪浅。  今天,承蒙武林大会所拖,在这公布这几本关于C的“经书”,让更多人实习之,练就一身绝世的嵌入式C语言好功夫。 武功秘籍排行榜:1. The C programming language  《C程序设计语言》

嵌入式软件 1554

RS-485调试踩坑实录:MAX13487数据回环问题排查与修复(附电路图)

本文深入解析了RS-485通信中MAX13487芯片的数据回环问题,提供了详细的排查过程和解决方案。通过分析芯片特性和自动换向机制,揭示了RO引脚配置不当是导致问题的关键原因,并给出硬件(添加上拉电阻)和软件(调整MCU配置)两种修复方案,附有优化设计建议和实际调试技巧。

play7的博客 1296

STK之Commu模块之三仿真卫星通信链路参数计算

考虑上述衰减的影响,可以得到卫星接收机输入端的载波功 [C] = [PT] +[GT] +[GR] -[L] -[L1] -[L2] (

juanhuokang2681的博客 8267

嵌入式软件测试的十大秘诀

  在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了对嵌入式有更深层次的理解,向Oracle询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢? Oracle面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人员

嵌入式软件 1517

别再硬编码了!WinCC子画面动态加载的5种C脚本写法对比

本文深入解析WinCC子画面动态加载的5种C脚本实现方案,包括基础加载、路径动态解析、多语言切换、窗口自适应布局和混合架构交互。通过代码示例和场景分析,帮助开发者避免硬编码问题,提升工业自动化系统的交互效率和可维护性。特别推荐路径动态解析方案,有效解决项目路径管理的痛点。

weixin_29008691的博客 475

union的0x3个妙用(II)

2.union巧妙地实现多字节数据类型之间的转化在涉及音视频编解码算法中,经常会涉及一些数据压缩、声音解码、图象的缩放等问题。这里通过一个例子来推荐一种union绝妙用法(这种方法由Equator公司提供,在我们公司的图象处理算法中用得很多)。在该例子中,利用union结构n64u实现占8个字节n64类型与单字节的c0~c7的相互转换,从而达到数据压缩和分解的目的。 #include

嵌入式软件 1293

OpenHarmony系统参数权限配置避坑指南:从param get/set失败到SELinux标签实战

本文深入解析OpenHarmony系统参数权限配置的常见问题与解决方案,涵盖DAC和SELinux双重权限控制机制。通过实战案例演示如何配置`param get/set`权限,解决'Permission denied'错误,并提供三方应用访问参数的安全方案,帮助开发者高效完成系统调试与优化。

weixin_27013291的博客 448

STM32N6570-DK ISP调试

将下载线接入STLINK V3EC接口,将BOOT1拨码拨至右边,即将其置为H,上电或已经上电的按复位,打开STM32CubeProgrammer,设置start address:0x70000000。板子消耗电流较大,即使缩短数据线接了USB供电依然不能正常点亮显示屏,最终通过板上CN2端子加了外部5V供电,仍然需要560mA的外部电流。3.烧录bin文件:STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。

liu的博客 1063

union的0x3个妙用(I)

在嵌入式系统中,一般不建议使用union结构,因为union结构中的各个成员之间存在相互影响,容易滋生问题。可见,union也是把双刃剑。懂得使用它的人可以做到“削铁如泥”,而不懂得使用它的人很可能会被其所伤。下面介绍的几种方法都是嵌入式系统常用的几种技巧。如果熟练掌握,将来定有所用。 1.all的使用 使用all的数据结构模型: typedef _my_union{

嵌入式软件 1292

MATLAB船舶开尔文尾迹三维仿真建模

开尔文尾迹介绍 Kelvin最早研究舰船在水面运动在水面上形成波纹的原理,主要针对静水中点源运动的尾迹问题,并给出尾迹的张角和波高分布情况。由 Kelvin 的理论,一般情况下假设由一个理想点源来代替舰船,开尔文尾迹由分歧波和横断波组成,分歧波向船的两侧扩散,而横断波主要向船的后方传播,在相遇的地方两波相干形成尖头波,且尖头波位于尾迹角16°到19.5°之间,又因为尖头波波长过短,以至于无法单独的区分出每个尖头波的波前,所有的波前在视觉效果上就连成一条直线表现为亮线,称为开尔文臂,开尔文臂以船身对称,且角度

qq_19512613的博客 3844

别踩static的地雷

  只要做过项目的朋友对关键字static应该都有一些了解,但未见了解很全面的。在C语言中,关键字static有以下明显的作用:1.static变量分配到静态内存中,这一点和全局非静态变量相同。2.在函数体,static变量只要不进行修改操作,在被调用过程中其值将保持不变。3.在模块内,全局static变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量,具有私有特

嵌入式软件 1258

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入浅出sizeof

 [int占4字节,short占2字节]1.0 回答下列问题:[答案在文章末尾]1. sizeof(char) =                           2. sizeof a   =                           3. sizeof "a"   =                        4. strlen("a")) =  

嵌入式软件 1246

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

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

上一篇: 视频会议是这样的
下一篇: 你今天volatile了吗?--准确定位
embeddedsoft
博客等级 码龄20年 51粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值