自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(223)
  • 收藏
  • 关注

原创 软考系统架构师 — 5 软件工程

瀑布模型结构化方法。开发阶段性、需求明确、文档齐全、风险控制弱。原型模型迭代方法。分为原先开发与目标软件开发。需求不明确。螺旋模型迭代方法。瀑布与原型(演化)模型结合体。适用于大型、复杂、风险项目。喷泉模型面向对象方法。复用好、开发过程无间隙、节省时间。V模型开发与测试结合。变换模型适用于形式化开发。智能模型适用于基于规则的专家系统。快速应用开发RAD基于构件的开发方法。用户参与、开发或复用构件、模块化要求高,不适用新技术。RUP/UP用例驱动、架构为中心、迭代、增量。可重用构建模型基于构件的开发方法。

2025-10-19 18:04:05 769

原创 软考系统架构师 — 21 知识产权和标准化

知识产权是指公民、法人、非法人单位对自己的创造性智力成果和其他科技成果依法享有的民事权,是智力成果的创造人依法享有的权利和在生产经营活动中标记所有人依法所享有的权利的总称。包含著作权、专利权、商标权、商业秘密权、植物新品种权、集成电路布图设计权和地理标志权等。无体性:知识产权的对象是没有具体形体,是智力创造成果,是一种抽象的财富。专有性:指除权利人同意或法律规定外,权利人以外的任何人不得享有或使用该项权利。

2025-10-12 15:25:37 830

原创 软考系统架构师 — 10 软件架构的演化和维护

软件架构的演化和维护就是对架构进行修改和完善的过程,目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等,是一个不断迭代的过程,直至满足用户需求。本质上讲,软件架构的演化就是软件整体结构的演化,演化过程涵盖软件架构的全生命周期,包括软件架构需求的获取、软件架构建模、软件架构文档、软件架构实现以及软件架构维护等阶段。一是架构是整个系统的骨架,是软件系统具备诸多好的特性的保障;二是软件架构作为软件蓝图为人们宏观管控软件系统的整体复杂性和变化性提供了一条有效途径。

2025-10-09 21:37:39 1015

原创 FreeRTOS实战指南 — 6 临界段保护

通过这种方式,函数不仅关闭了中断,还保留了关闭中断之前的BASEPRI值,以便之后可以通过taskEXIT_CRITICAL_FROM_ISR宏来恢复中断状态。区别在于带保护的方法可以在ISR中安全使用,它允许在修改BASEPRI值之前保存当前的中断状态,并在之后恢复,从而避免对高优先级中断的干扰。直接将BASEPRI寄存器设置为0,从而允许所有中断被响应,这种方式简单直接,但没有考虑当前的中断状态,因此不适用于中断服务程序(ISR)中,因为它可能会打断高优先级的中断处理。

2025-09-21 22:44:16 835

原创 FreeRTOS实战指南 — 5 多任务系统实现流程

任务栈(Task Stack) 是每个任务必不可少的内存区域,其核心作用类似于通用计算机系统中的栈,主要负责存储函数调用信息、局部变量、上下文数据等。在裸机系统中,通常使用一个单一的、全局的栈来存储中断服务例程和主程序的局部变量与返回地址。在这种模式下,系统资源和执行流程通常是线性管理的,没有复杂的任务调度和多任务并发的需求,因此不需要为每个任务维护独立的栈空间,但同时也限制了系统处理多任务的能力。在多任务系统中,任务栈的定义是为了实现任务的独立性,每个任务都拥有自己的专属栈空间。

2025-09-20 21:46:01 1172

原创 嵌入式软件课程设计:1 基于 STM32F103 的电子密码锁系统

在智能家居与安防技术快速发展的背景下,传统机械锁 “依赖实体钥匙、易丢失复制、管理不便” 的弊端日益凸显。本项目以 STM32F103 系列微控制器为核心,设计并实现了一款集多模态身份验证、安全防护、人性化管理于一体的智能电子密码锁系统,旨在通过嵌入式技术与传感技术的结合,为锁具的智能化升级提供低成本、高可靠性的解决方案,同时为电子信息、自动化等相关专业学生提供完整的课程设计与工程实践参考案例。

2025-09-14 18:38:51 882

原创 FreeRTOS实战指南 — 4 任务管理

删除任务后,FreeRTOS 会回收任务所占用的内存(包括堆栈),并将其从任何任务列表中移除,一旦任务被删除,就不能再被恢复或访问。在 FreeRTOS 中,任务的挂起后通常需要恢复,vTaskResume() 和 xTaskResumeFromISR() 用于恢复被挂起的任务,前者在任务中使用,后者适用于中断服务例程,xTaskResumeAll() 用于重启整个任务调度器,恢复所有被挂起的任务。任务状态迁移指的是任务在不同状态之间的转换,这通常由任务的行为、系统事件或调度器的决策触发。

2025-09-09 19:56:43 849

原创 LwIP入门实战 — 6 LwIP 网络数据包

当数据发送的时候,就要将属于一个数据包的数据全部发送出去,此处需要注意的是,属于同一个数据包中的所有数据都必须放在同一个以太网帧中发送。PBUF_POOL 类型其pbuf 结构体与数据缓冲区也是存在于连续的内存块中,但它的空间是通过内存池分配的,这种类型的pbuf 可以在极短的时间内分配得到,因为这是内存池分配策略的优势,在网卡接收数据的时候,LwIP 一般就使用这种类型的 pbuf 来存储接收到的数据,申请 PBUF_POOL 类型时,协议栈会在内存池中分配适当的内存池个数以满足需要的数据区域大小。

2025-09-08 20:47:01 1201

原创 LwIP入门实战 — 5 LwIP 的内存管理

内存释放的过程是相反的过程,但分配器会查看该节点前后相邻的内存块是否空闲,如果空闲则合并成一个大的内存空闲块。使用固定大小的内存块分配策略,用户只能申请大小固定的内存块,在内存初始化的时候,系统会将所有可用的内存区域划分为 N 块固定大小的内存,然后将这些内存块通过单链表的方式连接起来,用户在申请内存块的时候就直接从链表的头部取出一个内存块进行分配,同理释放内存块的时候也是很简单,直接将内存块释放到链表的头部即可,这样子分配内存的时间就是固定的,非常高效。为每个内存池建立空闲块链表,完成内存池的初始化;

2025-09-07 23:15:21 1054

原创 LwIP入门实战 — 4 LwIP的网络接口管理

因为链路层不提供任何的差错处理机制,如果在网卡中接收的数据包不满足网卡自身的属性,那么网卡可能就会直接丢弃该数据包,也可能在底层进行分包发送,但是这种分包在 IP 层看来是不可接受的,因为它打乱了数据的结构,所以只能由 IP层进行分片处理。

2025-09-06 16:46:39 1274

原创 LwIP入门实战 — 3 以太网外设 (ETH)

STM32F42x 系列控制器内部集成了一个以太网外设,包括一个介质访问控制器和专用的 DMA 控制器,它的功能就是实现 MAC 层的任务。借助以太网外设,STM32F42x 可以通过 ETH 外设按照 IEEE 802.3-2002 标准发送和接收 MAC 数据包。ETH 支持介质独立接口 (MII) 和简化介质独立接口 (RMII) 用于与外部 PHY 芯片连接。

2025-09-06 16:01:53 1161

原创 LwIP入门实战 — 2 LwIP概述

2.1 LwIP简介LWIP(Light Weight Internet Protocol,轻型网络协议栈)最初是由瑞典计算机科学研究所开发的。在嵌入式系统不断发展的背景下,传统的完整 TCP/IP 协议栈对于资源受限的嵌入式设备(比如一些内存小、处理能力有限的微控制器应用场景)来说过于庞大和复杂,难以有效应用。LWIP 为了满足嵌入式设备接入网络、实现简单网络通信功能的需求,旨在提供一个占用资源少、易于在嵌入式系统中实现和使用的轻量化网络协议栈。

2025-09-03 21:32:10 1016

原创 软考系统架构师 — 4 嵌入式软件

在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试调试器仍然运行在宿主机的通用操作系统之上,但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。板级支持包(BSP):是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支特,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。

2025-04-04 18:23:31 1197

原创 软考系统架构师 — 3 操作系统

解析:根据局部性原理,应该优先淘汰最近未被访问过的,而后淘汰最近未被修改过的,由页表可知,023最近都被访问过,而只有3最近未被修改过,应该淘汰3.然而其实这种题目,就算不知道上述原理,也能做出,答案只有一个,肯定是与其他不同的,具有唯一性的一个,在023中,02的访问位和修改位一样,只有3不同,答案就是3。快表就是用来缓存最近经常访问的页表项,当进行地址转换时,首先在快表中查找,如果找到对应的页表项,就可以直接获取物理地址,而无需访问内存中的页表,从而大大提高了地址转换的速度。

2025-03-16 18:08:50 1145

原创 软考系统架构师 — 2 计算机硬件

加速比定义为顺序执行时间与流水线执行时间的比值,根据题干假设,假设一共有条指令,则顺序执行时间为(6+7+8+9+6)*n=36n,该流水线周期为最长的9s,则在流水线中的执行时间为36+9*(n-1)=9n+27,因此加速比为36n/(9n+27),题目问的是最大加速比,由这个公式可以知道,当越大时,该公式值越大,因此最大的时候就是趋向于无穷大的时候,此时可忽略分母的27,也就是36n/9n=4。访问数据时所使用的指令也完全不同,用于接口的指令只用于接口的读/写,其余的指令全都是用于内存的。

2025-03-16 00:43:02 1112

原创 软考系统架构师 — 1 考点分析

章节内容真题考察绪论1. 绪论不考计算机相关知识2. 计算机系统基础知识,新增计算机硬件、嵌入式、计算机语言、系统工程对应计算机组成结构、操作系统、数据库、计算机网络、多媒体等知识点,整体分值在 10 - 15 分信息系统基础知识3. 信息系统基础知识,更注重信息系统,单独列出不少信息系统特点考察信息化和信息系统,ERP、TPS、DSS 等,约占 2 - 3 分信息安全技术基础知识4. 信息安全技术基础知识,新增了抗攻击技术考察安全知识,约占 3 - 4 分软件工程基础知识。

2025-03-16 00:21:37 790

原创 BMS应用软件开发 — 17 上下电控制与诊断开发 (Simulink)

在紧急情况下,会有高压下电动作,然而电机控制器中存在电容等储能元件,当 BMS 下电之后,其内部可能仍然存在高压,会给车辆上的人员带来触电风险,电机控制器的电压需要在短时间内下降到 60V 以下。在预充电过程中,电流通过预充电阻流入高压回路,逐渐升高高压电容两端的电压,直到接近动力电池的输出电压。通过Stateflow 绘制图状态机,判断预充继电器的状态转换,注意电压判断不能使用等于,因为电压测量的误差不可能为一个确定的数值。预充继电器状态闭合,无故障:V1电压>=电池电压&&电池电压正常。

2025-02-25 22:46:31 1243

原创 BMS应用软件开发 — 13 Modbus协议详解

(2) Slave 地址变成了单元标识符,当网络中的设备都使用 TCP/IP 协议,该地址是没有意义的,因为使用 IP 地址就能进行路由寻址,如果网络里还有串行通讯的设备,则需要使用网关来实现 Modbus-TCP/IP 到 Modbus-RTU/ASCII 之间的协议转换,这时用 Unit Identifier 来标识网关后面的每个串行通讯设备。Modbus TCP 传输的 1-4 层和我们日常使用的以太网,因特网一样,分别为物理层,数据链路层,网络层,传输层。

2025-02-25 21:46:43 1629

原创 BMS应用软件开发 — 14 电池电特性模型 (Simulink)

通过偏微分方程来描述电池内部的电化学反应,电化学模型可以通过微观尺度描述宏观量,如电池的电流、电压以及电池浓度、电势、和温度的局部分布。该模型简单、易实现,但未考虑电池的极化现象,其适用范围小。该模型考虑了负载电流的时间累计对 OCV 的影响,即 SOC 变化对 OCV 的影响,因此既可表示电池电压在某一 SOC 值下的暂态响应,又可表示电池电压的稳态变化。与 Rint 模型相比, Thevenin 模型考虑了电池的动态特性,因此其准确性更高,并且它的结构也相对简单,计算量不大,具有比较高的应用价值。

2025-02-23 11:34:41 1848

原创 Simulink Ststeflow教程 — 2 创建和编辑状态

又能作为汇合点,当多个转移路径需合并时发挥作用,像交通信号灯控制模型中,不同方向车道车辆通行状态转移可能汇合到连接节点,再由此节点转移至下一状态。默认转移的意义就在于,明确规定了在状态机被激活,或者层次模型中的父层次状态被激活的情况下,具体是哪个子状态会被激活。需要强调的是,连接节点不是记忆元件,因此,在状态图中任何转移的执行都不能停留在节点上,转移必须到达某个状态时才能停止。创建状态之后,也可以在状态上单击鼠标右键选择 Properties 命令,通过状态的属性对话框进一步定义状态,如图所示。

2025-02-18 21:20:10 940

原创 Simulink Ststeflow教程 — 1 Stateflow概述

其中,最高层级的对象是 Stateflow 状态机,它囊括了所有的 Stateflow 对象,进而涵盖了 Simulink 中所有的 Stateflow 状态图以及数据、事件、目标对象。同样,状态图包含状态、盒函数、函数、数据、事件、迁移、节点与注释事件,可利用这一系列对象构建 Stateflow 状态图。点击进入到Chart模型,左侧状态栏从上到下分别代表:状态、节点、转移、框、simulink状态、simulink函数、图形函数、matlab函数、真值表、历史、退出、进入、注释、图像。

2025-02-16 11:12:36 1554

原创 BMS应用软件开发 — 12 菊花链通讯

目前BMS行业的菊花链技术是各AFE芯片厂家来推动的。CAN通信在汽车电子上的应用时间长且通信稳定性很好,所以早期主板与从板之间采用CAN通信方式,出于方面的考虑,业内逐渐发展了一种新的通信方式——菊花链通信,由于使用元器件更少更具成本优势,虽然稳定性没有CAN通信这么好,但是考虑到BMS多数场景下放置在一个相对封闭应用场景,并且主板与从板之间的线束较短,符合应用要求,所以目前市场上使用更多的是菊花链通信方式。可以设计成对特定频率的信号进行隔离,同时允许其他频率的信号通过,但设计复杂,需要精确的参数匹配。

2025-02-09 22:57:24 3150 1

原创 BMS应用软件开发 — 11 CAN通讯

而表示逻辑 0 时 (显性电平), CAN_High 的电平为 3.5V, CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-VL=2V。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。CAN总线采用差分信号方式传输数据,通过两根信号线CAN_H(CAN High)和CAN_L(CAN Low)的电压差值来表示数据的逻辑状态(逻辑0和逻辑1)。CAN总线的遥控帧,实际上是一种请求数据的帧。

2025-02-09 22:27:13 1527

原创 BMS应用软件开发 — 10 高压互锁采集

也可以将高压器件进行分类,独立成2条回路,各自独立控制,如整车器件(VCU、IPU、DCDC、CCS、ACP、PTC等)一条回路,BMS回路作为一条回路,BMS单独检测内部的高压互锁回路。检测高压互锁回路完整性,可以通过在BMS一端输出直流电流,在另一端输入形成回路,检测输出和输入点的电压,判断是否在一个阈值内,从而判断高压互锁回路是否开路或松动。在维修整车高压电路时,可通过MSD(手动维修开关)手动断开高压,高压互锁先断开,然后再断开高压互锁回路,防止误操作导致高压上电,威胁维修人员安全。

2025-01-19 21:25:46 2446

原创 BMS应用软件开发 — 9 继电器原理与应用

首先闭合主负接触器以确保电源负极与电路连接,接着闭合预充接触器,通过预充电阻对高压回路预先充电,此过程可避免瞬间大电流损坏电路,预充电时长由预充电阻阻值和回路电容大小决定,预充电完成后再次闭合主负接触器,然后闭合主正接触器完成电源正极连接,此时整个电路完全接通,设备正常工作。:当继电器未通电时,电磁铁没有磁场,衔铁在弹簧的拉力作用下,保持在一个位置,使得常开触点处于断开状态,常闭触点处于闭合状态。这个电压与继电器所控制的电路有关,它的大小和变化取决于继电器的通断状态以及负载电路的特性。

2025-01-19 20:10:24 1349

原创 BMS应用软件开发 — 8 电池系统电流、电压、温度采集

当原边导体流过电流时,在导体周围产生磁场强度与电流大小成正比的磁场,磁芯将磁力线集聚至气隙处,霍尔元件输出与气隙处磁感应强度成正比的电压信号,放大电路将该信号放大输出,该类传感器通常输出±10V左右的电压信号,也有部分传感器为了增强电磁兼容性,变换为电流信号输出。分流器是一个低阻值的精密电阻,当电流通过时,根据欧姆定律U=IR(其中U为分流器两端的电压,I为通过的电流,R为分流器电阻),在分流器两端会产生与电流大小成正比的电压降。原则上,为真实反映电芯的温度变化,需把热敏电阻NTC布置在模组电芯的表面。

2025-01-19 17:34:10 2781

原创 Git代码管理工具 — 5 GitHub远程仓库

GitHub他就是一个远程仓库,远程仓库通俗的理解就是一个可以保存自己代码的地方,在实际开发当中一个项目往往是有多个人来共同协作开发完成的,那么就需要一个统一代码保存的地方,而GitHub就是起到一个共享和汇总代码的作用。包含了常见的功能选项,如“Code”(代码)、“Issues”(问题)、“Pullrequests”(拉取请求)、“Actions”(操作)、“Projects”(项目)、“Security”(安全)、“Insights”(洞察)、“Settings”(设置)。

2025-01-18 20:41:06 2298

原创 BMS应用软件开发 — 7 BMS硬件系统概述

继电器供电处增加PMOS开关控制是比较常见的,但是KL30线也增加PMOS开关控制而不是保持常电,这种不太常见,后面仔细看了下,这两个PMOS开关是由唤醒信号来控制,就是说控制板休眠时,SBC是断电的,可能是为了降低静态功耗。AFE选取的是TI的BQ79616,这个与之前看到的MODEL3采样板是不同的,之前分析的AFE是特斯拉定制的Robin与Batman,而这个版本选用的是现有的成熟型号,整个单板的通信拓扑架构如下(来自TI官网)。采样输入采用RC滤波,电容为差模形式,布置在相邻的电压采样引脚;

2025-01-18 12:32:04 3736

原创 BMS应用软件开发 — 6 BMS软件系统概述

BMS 系统通过控制继电器的通断,实现对电池电路的管理。与整车接口(Discrete I/O、CAN 等)进行交互,接收整车的相关信息(如车辆运行状态等),同时向整车提供电池系统的状态信息和控制指令,实现电池系统与整车其他系统的协同工作,例如根据车辆的动力需求和电池状态调整电池输出功率等。系统应该具备多种安全保护功能,如高压互锁 HVIL、过压保护、欠压保护、过温保护、过流保护、继电器故障保护、绝缘保护等,当电池出现异常情况时,能够及时采取措施,防止电池发生危险,保障电池系统及车辆的安全。

2025-01-16 21:35:28 2807

原创 BMS应用软件开发 — 5 电池关键参数及其含义

例如,在快速充电过程中,锂离子在电极材料中的嵌入速度过快,会导致电极材料的结构发生不可逆的变化,加速电池容量的衰减。锂离子电池的充放电倍率,决定了我们可以以多快的速度,将一定的能量存储到电池里面,或者以多快的速度,将电池里面的能量释放出来一般而言,过放电会使锂电池内压升高,正负极活性物质可逆性受到破坏,即使充电也只能部分恢复,容量也会有明显衰减。电池的一种状态,在该状态下,电池内部产生剧烈的物理、化学变化,导致电池自身释放大量的热,使得电池单体温度急剧上升,最终可引起电池起火甚至爆炸。

2025-01-12 16:45:01 1546

原创 BMS应用软件开发 — 4 电池系统的开发

电极厚度会影响锂离子的扩散路径和电池的内阻,孔隙率则影响电解液的浸润和锂离子的传输,活性物质的负载量直接关系到电池的能量密度和容量。通过合理的设计,可以在电池性能、成本和生产工艺等方面达到较好的平衡。完成上面的电池包时候,电池包还需要与车辆的底盘系统、车身系统等进行匹配,考虑电池系统的重量、重心位置等因素对车辆操控性、稳定性等方面的影响。锂离子电池在车用领域的安全和使用寿命受到多种因素的影响,而电池管理系统通过对这些因素的监测、管理和控制,在保障电池安全、延长电池寿命方面发挥着至关重要的作用。

2025-01-11 19:56:23 1338

原创 BMS应用软件开发 — 3 电池系统的组成

C”是英文“Cell”的缩写,也就是俗称的“电芯”;但可惜的是,迄今为止在电芯端依然没有太多质的飞跃,也就是在能量密度上没有太多突破,所以,如何优化电池整包内部空间,尽可能塞下更多的电芯以提高电量,进而增加续航里程,就成为了目前电动车提高续航的主要手段,于是,就有了我们今天要聊的话题。看到这里大家不难发现,为了提升电动车的电池容量和空间利用率,各家的工程师真的是绞尽了脑汁,从早期的CTM到如今最为普及的CTP,后来又诞生出了更高集成度的CTC和CTB,只有专心钻研技术的车企,才能真正引领行业的发展。

2025-01-09 00:09:04 2013

原创 BMS应用软件开发 — 2 单体电池的基本结构和工作原理

负极由锂插层石墨构成,此时,负极中的锂离子会从石墨中脱离出来,成为自由的锂离子。失去的锂离子通过电解液向负极移动,就像归家的游子,最终嵌入到负极的锂插层石墨中。随着充电的进行,越来越多的锂离子回到负极,直到电池充满电,为下一次的放电过程做好准备。:正极材料通常由锂的金属氧化物构成,如锂钴氧化物(LiCoO2)、锂锰氧化物(LiMn2O4)、锂铁磷酸盐(LiFePO4)或锂镍锰钴氧化物(NMC)。:一种多孔的绝缘材料,如聚乙烯(PE)或聚丙烯(PP),它允许锂离子通过,但阻止电子通过,从而防止电池内部短路。

2025-01-06 23:26:46 1167

原创 C缺陷与陷阱 — 8 编译与链接

静态链接在生成可执行文件时,会把程序所用到的函数库(比如标准 C 库、数学库等)中相关目标文件的代码和数据全部复制到可执行文件里面,即便它可能只调用了库中的少数几个函数,而动态链接则不同,动态链接的可执行文件中只是包含了对相应动态库中函数和变量等的引用信息,真正的函数库代码并不嵌入到可执行文件里。在这个过程中,像 printf 这类库符号所在的动态库(例如 libc.so 等)会在运行时被加载到程序的虚拟地址空间,使得程序可以找到并执行相应的函数,并且多个链接在一起的文件都可以访问到这些动态库中的符号。

2024-12-15 21:31:04 1221

原创 代码整洁之道 — 6 注释规范

在编写代码时,注释的质量至关重要。:可警告其他程序员可能出现的后果,虽现在有其他替代做法(如 JUnit4 里的@Ignore属性),但以前常用注释方式,且在合适场景下注释还是有用的,能避免一些不当做法。TODO只是暂时性的提醒注释,因此,定期检查这些注释,并删除那些已经不再需要的,是一个很好的习惯。这种注释风格在没有源代码控制系统(如git)的年代可能有一定的价值,但在现代开发实践中,它被认为是不必要的,甚至有害的。带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码像样得多。

2024-12-15 12:13:55 3414

原创 代码整洁之道 — 4 变量与常量规范

首先,定义指针常量时会有点不同。这里期望 DOUBLE(num) 能将 num 的值翻倍,但由于宏替换后变成了 (3 + 4 * 2),按照 C 语言运算优先级,先计算乘法再计算加法,得到的结果是 11,而不是预期的 14。说明:系统启动阶段,使用全局变量前,要考虑到该全局变量在什么时候初始化,使用全局变量和初 始化全局变量,两者之间的时序关系,谁先谁后,一定要分析清楚,不然后果往往是低级而又灾难性 的。例如,对于16位的整数0x1234,在大端序存储中,0x12存储在低地址处,0x34存储在高地址处。

2024-12-15 11:55:36 770

原创 代码整洁之道 — 3 头文件规范

就我们的产品来说,依赖的方向应该是:产品依赖于平台,平台依赖于标准库。头文件循环依赖,指a.h包含b.h,b.h包含c.h,c.h包含a.h之类导致任何一个头文件修改,都 导致所有包含了a.h/b.h/c.h的代码全部重新编译一遍。很多系统中头文件包含关系复杂,开发人员为了省事起见,可能不会去一一钻研,直接包含一切想到的头文件,甚至有些产品干脆发布了一个god.h,其中包含了所有头文件,然后发布给各个项目组使用,这种只图一时省事的做法,导致整个系统的编译时间进一步恶化,并对后来人的维护造成了巨大的麻烦。

2024-12-15 11:48:19 1723

原创 代码整洁之道 — 1 代码总体原则

例如,一个简单的学生信息管理系统,将学生结构体和相关操作函数分开,模块之间接口要清晰,比如上述inputStudentInfo函数明确接收一个Student结构体指针作为输入,用来填充学生信息,displayStudentInfo函数接收一个Student结构体来展示其信息。写的代码越 多,意味着出错的地方越多,也就意味着代码的可靠性越低。例如,在进行位操作时,要确保代码在不同的字节序(大端序和小端序)的机器上都能正确运行。并遵循统一的命名风格,常见的是驼峰命名法或者下划线命名法,整个项目保持一致。

2024-12-15 10:41:10 625

原创 C缺陷与陷阱 — 3 深入理解表达式

成员函数 task_start_fn 的地址和 p++ 的值都是在调用之前计算的,但是它们的计算顺序是不确定的。这意味着 p++ 可能会在 task_start_fn 的地址被计算之前或之后执行,导致 task_start_fn 可能被调用时使用的是 p 的原始值或增加后的值,这是不可预测的。因此,b[i] 的运算会使用 i 的当前值,然后 i 的值会增加 1。编译器可能先计算fun1(),也可能先计算fun2(),由于x的结果依赖于函数fun1()、fun2()的计算次序,则上面的代码存在问题。

2024-12-10 22:14:53 904

原创 C缺陷与陷阱 — 9 可移植性缺陷

这是会失败的,因为在将字符c转换为无符号整数时,c将首先被转换为int型整数,而此时可能得到非预期的结果。如果要满足第2条性质,答案应该是-1,但如果是这样,余数就必定是-1,这样第3条性质就无法满足。这样,性质1和性质2就可以得到满足。然而,C语言的定义只保证了性质1,以及当a>=0且b>0时,保证 |r|=0.后面部分的保证与性质2或者性质3比较起来,限制性要弱得多。例如,对于32位的整数,n

2024-11-17 12:05:03 1297 1

论文复现-计及碳捕集电厂低碳特性的含风电电力系统源-荷多时间尺度调度方法

摘要: 逐步提升风电等可再生能源发电占比,并对火电机组进行低碳化改造,辅之以多类需求侧资源,是实现能源电力碳达峰、碳中和目标的重要手段。首先,挖掘源荷两侧低碳资源并分析其低碳特性,源侧在碳捕集电厂中装设烟气旁路系统与溶液存储器,形成碳捕集电厂综合灵活运行方式进而与风电协调配合;荷侧调用不同响应速度的价格型、激励型需求响应资源克服多时间尺度下碳捕集电厂综合灵活运行方式的局限,通过源荷资源协调优化,从而提高系统的低碳性能。其次,构建源荷协调的日前-日内-实时三阶段低碳经济调度模型,优化系统的负荷及旋转备用分配计划,并改善失负荷与弃风问题。最后,在改进的IEEE-39 节点系统中进行算例分析,结果表明本文调度方法能够利用源荷可调节资源的调度优势,实现电力系统低碳经济调度的目标。

2024-03-05

论文复现-碳交易机制下考虑需求响应的综合能源系统优化运行

摘要:首先, 根据负荷响应特性将需求响应分为价格型和替代型 2 类, 分别建立了基于价格弹性矩阵的价格型需求响应模型, 及考虑用能侧电能和热能相互转换的替代型需求响应模型; 其次, 采用基准线法为系统无偿分配碳排放配额, 并考虑燃气轮机和燃气锅炉的实际碳排放量, 构建一种面向综合能源系统的碳交易机制; 最后, 以购能成本、碳交易成本及运维成本之和最小为目标函数, 建立综合能源系统低碳优化运行模型, 并通过 4 类典型场景对所提模型的有效性进行了验证。通过对需求响应灵敏度、燃气轮机热分配比例和不同碳交易价格下系统的运行状态分析发现, 合理分配价格型和替代型需求响应及燃气轮机产热比例有利于提高系统运行经济性, 制定合理的碳交易价格可以实现系统经济性和低碳性协同。

2024-03-03

论文复现-含电动汽车的区域综合能源系统优化调度研究-杨铮

论文复现《含电动汽车的区域综合能源系统优化调度研究_杨铮》

2024-03-01

toolbox-calib相机标定工具箱

toolbox-calib相机标定工具箱

2023-03-12

toolbox-calib工具箱calib-example.zip相机标定案例

toolbox-calib工具箱calib-example.zip相机标定案例

2023-03-12

空空如也

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

TA关注的人

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