自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2025-04-04 18:23:31 476

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

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

2025-03-16 18:08:50 837

原创 软考系统架构师 — 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 798

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

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

2025-03-16 00:21:37 406

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

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

2025-02-25 22:46:31 646

原创 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 778

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

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

2025-02-23 11:34:41 875

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

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

2025-02-18 21:20:10 665

原创 Simulink Ststeflow教程 — 1 Stateflow概述

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

2025-02-16 11:12:36 1059

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

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

2025-02-09 22:57:24 1408

原创 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 803

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

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

2025-01-19 21:25:46 846

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

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

2025-01-19 20:10:24 694

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

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

2025-01-19 17:34:10 1439

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

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

2025-01-18 20:41:06 1814

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

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

2025-01-18 12:32:04 1937

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

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

2025-01-16 21:35:28 1657

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

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

2025-01-12 16:45:01 784

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

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

2025-01-11 19:56:23 943

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

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

2025-01-09 00:09:04 1266

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

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

2025-01-06 23:26:46 785

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

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

2024-12-15 21:31:04 1119

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

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

2024-12-15 12:13:55 1949

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

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

2024-12-15 11:55:36 569

原创 代码整洁之道 — 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 1421

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

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

2024-12-15 10:41:10 478

原创 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 798

原创 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 1176 1

原创 C缺陷与陷阱 — 5 深入理解函数与库函数

遗憾的是,事实总难遂人所愿,为了保持与过去不能同时进行读写操作的程序的向下兼容性,一个输入操作不能随后直接紧跟一个输出操作,反之亦然。因为()结合优先级高于*,*pf()也就是*(pf()),pf是一个函数,该函数的返回值类型为指向浮点数的指针。signal 函数允许程序为特定的信号指定一个信号处理函数,当进程接收到该信号时,将调用指定的函数。出错原因在于,在库函数调用没有失败的情况下,并没有强制要求库函数一定要设置errno为0,这样ermo的值就可能是前一个执行失败的库函数设置的值。

2024-11-17 11:53:41 681

原创 C缺陷与陷阱 — 7 内存管理进阶

同时释放一块内存的一部分是不允许的,动态分配的内存必须整块一起释放。这些错误包括对NULL指针进行解引用操作、对分配的内存进行操作时越过边界、释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。是指程序中已分配的内存空间,在不再使用之后没有被正确释放或无法被再次使用,导致随着程序的运行,可用内存空间逐渐减少,最终可能耗尽系统内存,造成程序崩溃或系统性能下降。用于在堆(heap)上动态分配指定数量的字节,malloc 分配的内存是未初始化的,其内容是不确定的。

2024-11-17 11:01:25 734

原创 C缺陷与陷阱 — 6 指针与数组进阶

在堆上malloc或者new出来的地址空间,如果已经free或delete,那么此时堆上的内存已经被释放,但是指向该内存的指针如果没有人为的修改过,那么指针还会继续指向这段堆上已经被释放的内存,这时还通过该指针去访问堆上的内存,就会造成不可预知的结果,给程序带来隐患。这段实现可能存在一些问题,首先我们并不知道为r所指向的位置,此外r并没有分配足够的内存,使用strcy和strcat将会导致缓冲区溢出,r应该指向一个足够大的内存区域,以存储s和t字符串的复制或连接结果。用数组形式的记法经常会起到误导作用。

2024-11-17 10:45:03 950

原创 C缺陷与陷阱 — 4 深入理解声明与定义

typedef用于为已存在的类型定义一个新的名字,它是一个编译时的指令,由编译器处理,typedef定义的类型别名在编译时会进行类型检查。描述对象的类型,用于指代其他地方定义的对象,由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。在C语言中,声明的基本格式遵循一种相对固定的结构,尽管根据声明的具体内容(如变量、数组、函数、指针等),格式会有所变化。2)在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量为为同一种类型,而用#define定义的类型则无法保证。

2024-11-17 10:27:53 653

原创 C缺陷与陷阱 — 2 运算符进阶

和 ,)存在规定的求值顺序。:用于表示单个字符常量,例如 'A' 表示大写字母A,'0' 表示数字0,单引号内的字符可以是任何有效的字符,包括字母、数字、空格、标点符号等,如果单引号内包含多于一个字符,或者没有字符,编译器会报错。在C语言中,按位与运算符&和按位或运算符|是位操作符号,&&和 || 是逻辑运算符号,在实际编程中,位运算符通常用于底层硬件操作或位字段的设置和清除,而逻辑运算符则用于控制程序的流程。可能本意是用x除以z所指向的值,把所得的商再赋给y,将上面的语句重写如下才是所表示的原意。

2024-11-17 10:09:59 666

原创 C缺陷与陷阱 — 1 数据类型与关键字

类似地,当函数在另一个文件中定义时,可以使用extern在需要调用该函数的文件中声明它。不过,对于函数来说,extern是隐含的,即使不显式声明extern,编译器也会假定函数是在其他地方定义的,除非它同时被声明和定义在同一个文件中。:在多个文件中共享全局变量时,通常在一个文件中定义变量(不加extern),而在其他需要使用该变量的文件中声明它(使用extern)。:在文件作用域(即全局作用域)中使用static关键字声明变量,该变量只在定义它的文件内部可见,这有助于避免不同文件之间的命名冲突。

2024-11-17 09:54:52 661

原创 代码整洁之道 — 2 函数规范

因此,在保持函数简短的情况下,偶尔使用return、break或continue语句是可以接受的,它们可以提高代码的表达力。为了提高代码的清晰度,我们应该按照自顶向下的顺序组织函数,每个函数都应该调用下一个抽象层级的函数,形成清晰的阅读路径。函数名和参数应该形成清晰的动词/名词对,这有助于解释函数的意图和参数的顺序,关键字形式的函数名可以减少记忆参数顺序的负担。避免使用布尔值作为标识参数,因为这会增加函数的复杂性,如果必须使用,应该考虑将函数拆分为两个或更多函数。2 switch语句。

2024-10-01 17:32:50 545

原创 代码整洁之道 — 1 命名规范

1.1 不同数据类型命名规范编程中不同数据的命名规范提高了代码的可读性和一致性。例如,常量和宏定义使用全大写字母,变量和函数采用小驼峰式,而结构体和枚举类型名则使用大驼峰式,这样的区分有助于识别代码中的不同元素。类型规范示例常量名全大写,单词间用下划线分隔变量名小驼峰式(首单词小写,后续单词首字母大写)函数名小驼峰式(同变量名)结构体名大驼峰式(所有单词首字母大写)联合体名大驼峰式(同结构体名)枚举类型名大驼峰式(同结构体名)Weekday宏定义。

2024-10-01 12:30:13 1063

原创 FreeRTOS实战指南 — 3.2 FreeRTOS中链表的实现

TickType_t类型的变量,通常用于存储与节点相关的值,比如任务的优先级或者任务的等待时间等,可以帮助在排序链表时确定节点的顺序。xLIST_ITEM结构体定义了一个双向链表节点,它包含一个用于排序的辅助值、指向链表中前一个和后一个节点的指针、一个指向拥有该节点的内核对象的指针(通常是任务控制块TCB),以及一个指向该节点所属链表的指针。在初始化时,由于链表为空,索引指针指向最后一个节点,这样在添加第一个节点时,可以很容易地将其插入到链表的末尾。如果移除的节点是链表的索引节点,还会更新链表的索引。

2024-09-16 19:10:22 1140

原创 FreeRTOS实战指南 — 3.1 C语言链表

如果不是,遍历链表找到要删除的节点,然后根据节点的位置更新前驱和后继节点的指针,并释放要删除节点的内存。是链表的第一个节点,头节点的指针域指向第一个实际的数据节点,或者在空链表中为NULL。在没有头结点的链表中,如果要删除首元结点,需要更新头指针指向下一个节点,增加头结点后,对首元结点的插入和删除操作可以和其他节点的操作一样处理,无需特殊逻辑。头指针是一个特殊的指针,它指向链表的第一个结点的指针,若链表没有投结点,则头指针所指结点为链表的首元结点,如果链表为空,头指针通常被设置为null。

2024-09-16 11:28:41 1031

原创 FreeRTOS实战指南 — 2 移植 FreeRTOS 到 STM32F429

打开FreeRTOS源码,在“.\FreeRTOS\Demo”文件夹下面找到“CORTEX_M4F_STM32F407ZG-SK”这个文件夹(这里我们使用的是STM32F429,可以根据硬件平台选取相应的文件),双击打开,在其根目录下找到这个“FreeRTOSConfig.h”文件,然后拷贝到我们工程的user文件夹下即可。这里的值设置为1,空闲任务在执行完其必要的操作后,会调用taskYIELD()或taskYIELD_FROM_ISR()函数,从而让出CPU的控制权。(5) 重复定义中断服务函数错误。

2024-09-16 00:27:31 1483

原创 FreeRTOS实战指南 — 1 FreeRTOS简介

FreeRTOS源码中包含3个主要的文件夹,FreeRTOS文件夹包含了FreeRTOS内核的源代码和相关的头文件,这是FreeRTOS实时操作系统的核心部分,包括任务管理、时间管理、同步机制等功能的实现。FreeRTOS提供了丰富的任务管理、时间管理、同步和通信机制,同时保持了代码的简洁性和可维护性。FreeRTOS 包含 Demo 例程和内核源码,FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内核的源代码,我们移植 FreeRTOS 的时候就需要这部分源代码;

2024-09-08 19:51:12 1417

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

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

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