news 2026/7/19 10:57:57

TMS320F28003x外设访问控制:构建可靠嵌入式系统的硬件隔离机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TMS320F28003x外设访问控制:构建可靠嵌入式系统的硬件隔离机制

1. 外设访问控制:从“能用”到“可靠”的系统设计基石

在嵌入式系统开发,尤其是像TMS320F28003x这类高性能实时控制器的应用中,我们常常把大量精力花在算法实现、时序优化和外设驱动上。然而,一个经常被新手甚至部分有经验的工程师忽视的环节,恰恰是系统稳定性和安全性的基石——外设访问控制。想象一下这样的场景:你精心调试的电机FOC算法运行良好,但某天因为DMA或CLA(控制律加速器)的一个意外写操作,导致ADC的配置寄存器被篡改,采样值瞬间出错,整个控制系统可能因此失控。这种“软件层面的硬件故障”隐蔽且危险。

TMS320F28003x的PERIPH_AC_REGS(外设访问控制寄存器组)就是为了解决这类问题而生的。它不是一个简单的“开关”,而是一套精细的权限管理系统。这套机制允许你为芯片内部不同的“主控单元”(Master)——比如主CPU(CPU1)、CLA、DMA、甚至高速互联控制器(HIC)——针对每一个外设模块,设置不同的访问权限等级。这就像给公司里不同部门的员工配置不同级别的门禁卡:核心研发实验室只有特定工程师能进(完全访问),财务室可以查看但不能改动文件(受保护读),而总裁办公室则禁止无关人员进入(无访问权限)。在复杂的多任务、多核协作的实时系统中,这种隔离是保证功能模块间互不干扰、提升系统整体鲁棒性的关键。

对于从事电机驱动、数字电源、可再生能源逆变器等领域的工程师来说,理解并正确配置这些寄存器,是从“让代码跑起来”迈向“让系统稳定可靠运行”的必经之路。它让你能主动防御因软件缺陷、指针跑飞、多核竞争访问导致的硬件状态异常,是构建工业级可靠嵌入式产品的必备技能。接下来,我将结合手册内容和实际项目经验,为你彻底拆解PERIPH_AC_REGS的配置逻辑、实战步骤和避坑指南。

2. PERIPH_AC_REGS 寄存器组架构与核心思想解析

2.1 寄存器组全景与设计逻辑

PERIPH_AC_REGS并非一个单一的寄存器,而是一个覆盖了芯片几乎所有关键外设的寄存器集合。根据你提供的资料,其地址范围从0hADCA_AC一直延伸到1FEhPERIPH_AC_LOCK。每一个外设(如ADC、EPWM、SPI等)都对应一个独立的访问控制寄存器(AC Register)。

这种分布式的设计逻辑非常清晰:将控制权分散到各个外设门口。相比于一个中央化的、复杂的权限管理单元,这种方式更简单、更高效,也更容易验证。每个AC寄存器就像守在外设“家门口”的保安,只根据当前访客(Master)的ID和预设规则决定是否放行,以及允许进行何种操作。

从你提供的列表可以看出,受控的外设非常全面:

  • 模拟子系统:ADCx (A, B, C), CMPSSx, DACx, SDFMx。
  • 数字控制与通信:EPWMx (1-8), EQEPx, ECAPx, CLBx。
  • 通信接口:SCIx, SPIx, I2Cx, LINx, PMBUS, FSI, CAN, MCAN。
  • 高级功能:HRPWM, HIC, AES加速器。

这种全覆盖意味着系统设计者可以对每一个可能影响系统稳定性的硬件模块实施访问管制。

2.2 核心位域:三位主控与三种权限

尽管不同外设的AC寄存器在细节上略有差异(主要体现在支持的Master类型上),但其核心位域结构高度统一。理解一个,就能触类旁通。我们以功能最全的EPWM1_AC寄存器为例进行深度解析:

该寄存器有效位集中在低8位,被划分为4个2比特的字段,分别控制四个主控单元的访问权限:

  • Bit [7:6]:HICA_ACC- 高速互联控制器访问控制。
  • Bit [5:4]:DMA1_ACC- DMA控制器访问控制。
  • Bit [3:2]:CLA1_ACC- 控制律加速器1访问控制。
  • Bit [1:0]:CPU1_ACC- 主CPU(C28x内核)访问控制。

每个2比特字段的编码含义完全一致,定义了三种关键的访问级别:

  1. 11- 完全访问 (Full Access)

    • 含义:对应的主控单元对该外设拥有完整的读写权限。
    • 使用场景:这是最常见的配置。例如,配置CPU1_ACC=11,让主CPU能够自由配置和读取EPWM模块的所有寄存器,以产生PWM波形。又或者,配置DMA1_ACC=11,让DMA能够将ADC结果寄存器中的数据自动搬运到内存,而无需CPU干预。
  2. 10- 受保护的读访问,无写访问 (Protected Read, No Write)

    • 含义:允许读操作,但对一种特殊的寄存器——“读清零”(Clear-on-read)寄存器——进行保护。这种寄存器的特性是,读取其值的操作本身会将其内容清零(常用于中断标志位)。Protected Read模式能读取此类寄存器的值,但不会触发清零操作。同时,完全禁止任何写操作。
    • 技术价值与场景:这是实现数据安全与状态监控的关键。
      • 对DMA/CLA的保护:例如,在由CPU负责ADC采样触发和数据处理的应用中,可以将ADCA_AC寄存器的DMA1_ACCCLA1_ACC位设置为10。这样,DMA或CLA可以安全地读取ADC结果寄存器(用于监控或辅助计算),但绝对无法意外修改ADC的配置(如采样窗口、触发源),也无法通过读取操作意外清除ADC的序列完成中断标志,从而破坏CPU的中断逻辑。
      • 防止竞争:在多主控系统中,防止非管理主控通过读操作改变硬件状态。
  3. 00- 无访问权限 (No Access)

    • 含义:对应的主控单元既不能读也不能写该外设的任何寄存器。任何访问尝试通常会导致总线错误或直接被忽略。
    • 使用场景实现严格的硬件隔离。例如,在一个安全至上的系统中,可以将加密加速器(AESA)的CPU1_ACC设为00,而只允许一个通过严格验证的安全协处理器(或特定的DMA通道)来访问,从而将密钥操作与主应用程序完全隔离,极大增强系统安全性。

重要提示:编码01在文档中被标记为“Reserved”(保留)。在实践中最稳妥的做法就是不要使用这个值。虽然某些芯片版本可能将其定义为某种特定行为,但依赖保留位会导致代码在不同芯片批次或型号间缺乏可移植性,甚至引发未定义行为。

2.3 复位值与“EALLOW”保护

几乎所有外设AC寄存器的复位值都是0x000000FF(或0x000000CF,对于某些缺少部分主控字段的外设)。将低8位转换为二进制1111 1111,即每个2比特字段都是11。这意味着芯片上电后,所有主控单元默认对所有外设拥有完全访问权限

这是一个非常合理且安全的设计。芯片复位后,首先运行的是主CPU(CPU1)的初始化代码。如果默认就是无访问或受保护访问,CPU连配置外设都做不到,系统根本无法启动。因此,默认全开放保证了启动的可行性,而将安全配置的责任交给了系统软件设计者。

另一个关键细节是,所有这些AC寄存器都受“EALLOW”(受保护寄存器写使能)机制保护。这意味着在修改它们之前,必须执行EALLOW汇编指令(在C-Code中通常由EALLOW宏实现),修改完成后再用EDIS指令关闭写使能。这是C2000系列芯片的一道重要硬件安全锁,防止程序指针跑飞时随意修改关键系统配置。

// 示例:配置EPWM1的访问权限,禁止DMA写入,仅允许CPU和CLA完全访问 EALLOW; // 设置 CPU1: Full(11), CLA1: Full(11), DMA1: No Access(00), HICA: No Access(00) // 即 二进制 00 00 11 11 = 0x0F EPwm1Regs.ACCESSCTRL.bit.CPU1_ACC = 3; // 11b EPwm1Regs.ACCESSCTRL.bit.CLA1_ACC = 3; // 11b EPwm1Regs.ACCESSCTRL.bit.DMA1_ACC = 0; // 00b EPwm1Regs.ACCESSCTRL.bit.HICA_ACC = 0; // 00b // 更常见的写法是直接赋值,前提是你清楚寄存器结构 // EPwm1Regs.ACCESSCTRL.all = 0x0000000F; EDIS;

3. 关键外设访问控制配置实战与策略

了解了基本原理后,我们来看如何在实际项目中应用。配置AC寄存器不是孤立的行为,它必须与你的系统架构和软件设计紧密结合。

3.1 配置流程与最佳实践

一个稳健的配置流程应遵循以下步骤:

  1. 系统架构规划:在写第一行驱动代码前,先画一张简单的“主控-外设”访问矩阵图。明确每个外设由哪个主控管理(配置/启动),哪个主控可能使用其数据,哪个主控必须被隔离。
  2. 初始化阶段配置:在系统初始化早期,紧随在外设基本时钟使能之后、在外设详细配置之前,完成所有AC寄存器的配置。顺序很重要,要确保在配置某个外设的AC权限时,配置者(通常是CPU1)自身拥有写权限。
  3. 使用锁寄存器(PERIPH_AC_LOCK):在所有AC寄存器配置完毕后,最后一步是向PERIPH_AC_LOCK寄存器的LOCK_AC_WR位写入1。这是一个“一次性”操作(WSonce类型),一旦上锁,所有AC寄存器将变为只读,直到下一次系统复位。这能有效防止后续运行的应用程序(甚至是有缺陷的代码)或某些攻击手段篡改访问权限,固化安全状态。
  4. 模块化封装:将AC配置代码封装成函数或宏,与对应外设的驱动代码放在一起,并添加清晰的注释,说明配置意图。

3.2 典型应用场景配置示例

让我们通过几个具体场景,看看如何制定配置策略。

场景一:高可靠性电机控制中的ADC与PWM隔离

在电机控制中,ADC采样和PWM输出是核心关键路径,必须保证其绝对稳定。

  • ADC模块 (ADCA)

    • CPU1_ACC = 11 (Full):CPU负责配置ADC采样序列、触发源,并处理中断。
    • CLA1_ACC = 10 (Protected Read):CLA(控制律加速器)执行高速PID运算,需要读取ADC结果寄存器。设为“受保护读”可以确保CLA能拿到采样值进行计算,但绝对无法修改ADC的任何配置,也避免了CLA读操作意外清除ADC中断标志,干扰CPU的中断服务程序。
    • DMA1_ACC = 00 (No Access):在本场景中,ADC数据由CPU或CLA直接读取处理,不需要DMA搬运。禁止DMA访问,消除一切DMA误操作导致ADC配置紊乱的风险。
    • 配置代码思路
      // 假设使用CLA进行电流环计算,需要读ADC结果 EALLOW; AdcaRegs.ACCESSCTRL.bit.CPU1_ACC = 3; // 11b AdcaRegs.ACCESSCTRL.bit.CLA1_ACC = 2; // 10b - Protected Read AdcaRegs.ACCESSCTRL.bit.DMA1_ACC = 0; // 00b - No Access // ADCA_AC没有HICA_ACC位,但手册显示有RESERVED位,需按手册处理 AdcaRegs.ACCESSCTRL.bit.rsvd1 = 3; // 保留位通常写回默认值 EDIS;
  • PWM模块 (EPWM1)

    • CPU1_ACC = 11 (Full):CPU配置死区、周期、比较值等。
    • CLA1_ACC = 01 (需查证) / 或 10/11:如果CLA需要实时更新PWM比较值以实现电流环,则需要写权限(11)。如果CLA只做监控,则可用10特别注意:根据手册,01是保留值,切勿使用。如果CLA不需要访问PWM,则设为00
    • DMA1_ACC = 00 (No Access):通常PWM寄存器无需DMA操作。
    • HICA_ACC = 00 (No Access):除非有其他芯片通过高速互联来同步PWM,否则一般关闭。

场景二:通信外设的安全域划分

对于SCI、SPI、I2C等通信接口,访问控制可以防止数据流被非法截获或篡改。

  • SPI-A 作为主设备连接外部安全芯片
    • CPU1_ACC = 11 (Full):CPU负责初始化SPI、组织发送数据帧。
    • DMA1_ACC = 11 (Full):为了提高效率,使用DMA在SPI发送/接收缓冲区和内存之间自动搬运数据。
    • CLA1_ACC = 00 (No Access):CLA与此安全通信任务无关,禁止访问。
    • HICA_ACC = 00 (No Access):隔离其他主控。
    • 策略考量:这样配置后,只有CPU和它授权的DMA通道能操作SPI-A。即使CLA或HIC的代码出现问题,也无法干扰与安全芯片的通信。

场景三:利用CLB实现自定义逻辑保护

可配置逻辑块(CLB)允许用户创建自定义数字逻辑。其访问控制 (CLBx_AC) 通常只包含HICA、CLA1和CPU1的控制位(无DMA1)。

  • 配置策略:如果你用CLB实现了一个关键的硬件看门狗或保护电路,你可以将CLA1_ACCHICA_ACC设为00,只保留CPU1_ACC = 11。这意味着只有主CPU能配置和修改这个保护逻辑,其他任何协处理器都无法绕过或禁用它,从硬件层面确保了保护机制的唯一控制权。

3.3 关于PERIPH_AC_LOCK寄存器的关键操作

PERIPH_AC_LOCK是整个访问控制机制的“总开关”。它的LOCK_AC_WR位是“一次性置位”类型(WSonce)。

  • 作用:当该位被写入1后,所有PERIPH_AC_REGS 寄存器组中的寄存器(包括它自己)都将变为只读状态。
  • 时机:必须在所有AC寄存器都按系统设计配置无误后,最后一步进行锁定。锁定后,任何软件都无法再修改访问权限,除非芯片发生复位。
  • 代码示例
    // 假设所有外设的ACCESSCTRL都已配置完成 EALLOW; // 写入1锁定所有访问控制寄存器。写入0无效。 PeriphAcRegs.LOCK.bit.LOCK_AC_WR = 1; EDIS; // 锁定后,尝试再次修改将会失败(无效果或可能产生总线错误) // EALLOW; // EPwm1Regs.ACCESSCTRL.bit.CPU1_ACC = 0; // 此操作无效! // EDIS;
  • 注意事项:锁定操作是不可逆的(在当前运行周期内)。因此,在调试阶段,你可能会选择暂时不锁定,以便动态调整权限进行测试。但在产品发布的最终软件版本中,强烈建议使能锁定功能,这是将安全策略从“配置”提升到“固化”的关键一步。

4. 常见问题、调试技巧与深度避坑指南

即使理解了原理,在实际操作中仍会遇到各种问题。下面是我在项目中总结的一些典型陷阱和解决思路。

4.1 配置后外设“失灵”的排查流程

这是最常见的问题:配置了某个外设的AC寄存器后,发现该外设不工作了,或者CPU无法访问了。

  1. 检查配置时序绝对不要在配置AC寄存器之前,就尝试去初始化或读写那个外设。正确的顺序是:使能外设时钟 -> 配置该外设的AC权限 -> 进行该外设的详细配置(如设置PWM周期、ADC采样模式等)。如果顺序颠倒,可能在配置AC权限时,CPU自己就已经失去了访问权。
  2. 确认当前操作的主控:你正在运行的代码是由哪个核心执行的?如果你在CPU1上运行的代码里,将CPU1_ACC设为了0010(且后续需要写操作),那么紧接着的下一条配置该外设的指令就会失败。对于CLA任务,同样要确保CLA自身对目标外设有足够的权限(至少是Protected Read,如果需要读数据的话)。
  3. 检查EALLOW保护:忘记用EALLOW/EDIS包裹对AC寄存器的写���作,是另一个低级但常见的错误。编译器不会报错,但写入根本不会生效。始终记住,AC寄存器是受保护的。
  4. 验证保留位:像ADCA_AC等寄存器,高24位和部分低8位是保留位(RESERVED)。手册显示它们的复位值是03h,但���些是R-0(只读且为0),有些是R/W-3h(可读写,复位为3)。对于R/W类型的保留位,最安全的做法是写入它们的复位值(通常是3h,即二进制11)。随意写入其他值可能导致未定义行为。例如,配置ADC时:
    EALLOW; // 正确:保留位写回复位值 AdcaRegs.ACCESSCTRL.all = (AdcaRegs.ACCESSCTRL.all & 0xFFFF00FF) | 0x0000FF00; // 清除低8位外的保留位,并设置复位值? // 更清晰的写法:直接构造已知值 AdcaRegs.ACCESSCTRL.all = 0x00000000; // 先清零 AdcaRegs.ACCESSCTRL.bit.CPU1_ACC = 3; AdcaRegs.ACCESSCTRL.bit.CLA1_ACC = 2; // 明确设置保留位为复位值(根据手册表,ADCA的[7:4]是R/W-3h) AdcaRegs.ACCESSCTRL.bit.rsvd1 = 3; // 假设bit7-6是rsvd1 AdcaRegs.ACCESSCTRL.bit.rsvd2 = 3; // 假设bit5-4是rsvd2 EDIS;

4.2 多主控数据共享与竞争风险

当多个主控(如CPU和CLA)都需要访问同一个外设的数据寄存器(如ADC结果)时,即使配置了正确的读权限,也要注意软件层面的数据一致性问题。

  • 问题:CLA配置为Protected Read访问ADC。CPU在中断中读取ADC结果并清零标志位。如果CLA在CPU读取标志位之后、清零之前,也去读取了ADC数据寄存器(Protected Read不会清零标志),这本身没问题。但如果CLA的计算依赖于“最新”的样本,而它读取时,ADC可能已经开始了下一次转换,覆盖了结果寄存器,那么CLA读到的就是“旧”数据。
  • 解决方案:这超出了硬件访问控制的范畴,需要通过软件同步机制解决。例如,采用“生产者-消费者”模型:
    1. CPU在ADC中断中,将ADC结果数据从外设寄存器拷贝到一个专供CLA读取的共享内存区域。
    2. 设置一个软件标志(如共享变量中的“数据就绪”位)。
    3. CLA轮询或通过中断获知该标志,然后从共享内存中读取数据,并在处理完后清除标志。
    4. 这样,硬件访问控制(Protected Read)防止了CLA意外清除中断标志,而软件同步机制保证了CLA获取到的是CPU处理过的、确定版本的数据。

4.3 调试与验证方法

  1. 静态代码审查:在代码中,将所有的AC寄存器配置集中到一个或几个初始化函数中,并附上详细的注释说明每个配置的意图。进行代码审查时,重点检查这些配置是否符合系统架构图。
  2. 运行时读回验证:在配置完成后(锁定前),可以添加调试代码,读回AC寄存器的值,与预期值进行比较,确保配置已正确写入。
    uint32_t readback_val = EPwm1Regs.ACCESSCTRL.all; if (readback_val != expected_val) { // 配置错误处理,如点亮错误LED,记录日志等 error_handler(); }
  3. 利用仿真器:在CCS等IDE的调试模式下,可以直接查看内存映射窗口中PERIPH_AC_REGS区域的值,直观验证配置。也可以设置数据断点,监控非授权主控是否尝试访问被禁止的外设地址(这可能会触发总线错误异常)。
  4. 压力测试:在系统集成测试阶段,可以故意在CLA或DMA的任务中,编写尝试写入被配置为“No Access”或“Protected Read”外设的测试代码。一个健壮的系统应该能安全地处理这种非法访问(例如触发错误中断或保持不变),而不是崩溃。

4.4 高级主题:与MPU/MMU的协同

在一些更复杂的C2000器件(或其它ARM Cortex-M系列芯片)中,除了外设级的访问控制,还可能存在内存保护单元(MPU)或内存管理单元(MMU)。它们的关系可以这样理解:

  • PERIPH_AC_REGS:是外设硬件层级的“门卫”,控制的是“谁能碰这个外设的寄存器”。粒度是外设模块,控制的是CPU、DMA、CLA等硬件主控实体。
  • MPU/MMU:是内存系统层级的“区域警卫”,控制的是“在某个内存地址范围内,允许什么类型的操作(读、写、执行)”。粒度是内存区域,控制的是运行在CPU上的软件任务或特权模式。

两者可以协同工作,构建纵深防御。例如,你可以:

  1. 用PERIPH_AC_REGS禁止DMA访问某个ADC。
  2. 同时用MPU将ADC寄存器所在的内存地址区域,配置为仅特权模式(如操作系统内核)可访问,而用户态任务不可访问。 这样,即使应用程序(用户态)出现严重错误,它既无法直接通过CPU访问该外设(被MPU阻止),也无法通过DMA间接操作(被AC寄存器阻止),安全性大大增强。

5. 实战配置清单与系统化集成建议

为了帮助你快速上手,这里提供一个针对典型双核(CPU+CLA)电机控制系统的AC寄存器配置检查清单。请根据你的实际硬件连接和软件架构进行调整。

初始化阶段配置清单:

  1. 系统规划:绘制主控(CPU1, CLA1, DMA1)与外设(ADC, EPWM, SPI等)的访问关系矩阵。
  2. 配置顺序: a. 初始化系统时钟、PLL。 b. 使能各外设模块的时钟。 c.配置所有外设的访问控制寄存器(PERIPH_AC_REGS)。 d. 详细配置各个外设的工作模式、中断等。 e. 初始化CLA和DMA,并加载相关任务/描述符。 f.(可选但推荐)锁定访问控制寄存器(PERIPH_AC_LOCK)。 g. 启动外设、CLA和DMA,开始主循环。
  3. 关键外设配置示例值(供参考)
    外设CPU1_ACCCLA1_ACCDMA1_ACCHICA_ACC配置说明
    ADCA11 (Full)10 (Prot.Rd)00 (None)N/ACPU配置,CLA读数据计算
    EPWM111 (Full)11 (Full)00 (None)00 (None)CPU配置,CLA更新占空比
    SPI-A11 (Full)00 (None)11 (Full)00 (None)CPU控制,DMA搬运数据
    CLB111 (Full)00 (None)N/A00 (None)CPU专用逻辑保护
    AESA00 (None)00 (None)11 (Full)N/A仅DMA可访问,用于安全数据流

集成到现有项目的建议:

如果你是在一个已有的、没有使用访问控制功能的项目上增加此功能,建议按以下步骤,谨慎迭代:

  1. 备份与测试:备份原有工程,在仿真器环境下进行。
  2. 增量添加:不要一次性配置所有外设。先从一两个不关键的外设开始(例如一个暂时不用的ECAP模块)。
  3. 默认权限开局:初始将所有AC寄存器设置为默认的完全访问(0xFF0xCF),这应与复位状态一致,确保系统原有功能正常。
  4. 逐个收紧:按照你的设计,每次只修改一个外设的权限,然后运行完整的系统功能测试,确保没有引入异常。
  5. 添加锁:所有权限测试无误后,最后一步使能PERIPH_AC_LOCK
  6. 文档化:在代码和设计文档中,清晰记录下最终的访问控制配置表及其设计理由。

外设访问控制是一个“静默的守护者”。在系统正常工作时,你几乎感觉不到它的存在;但一旦出现意外的非法访问企图,它就成了防止系统崩溃的最后一道硬件防线。花时间精心设计和配置它,对于打造高可靠、高安全的嵌入式产品来说,是一项投入产出比极高的投资。尤其是在功能安全(Functional Safety)要求日益严格的今天,合理使用这些硬件安全特性,是达到相应安全等级(如IEC 61508 SIL, ISO 26262 ASIL)的必要技术手段之一。希望这篇详解能帮助你真正掌握TMS320F28003x的这一强大功能,并将其应用到你的下一个可靠设计中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 10:57:10

机器学习模型可观测性:从数据漂移到业务影响的闭环监控

1. 项目概述:这不是一次“部署”,而是一场从实验室到产线的系统性迁移 “From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着太多被轻描淡写却重若千钧的词。“Notebook”不是指纸质本子,而是Jupyter里…

作者头像 李华
网站建设 2026/7/19 10:55:18

深入解析TMS320F28003x ePIE中断系统:从原理到高实时性应用实践

1. 项目概述在电机驱动、数字电源或者任何对时序有苛刻要求的嵌入式实时控制系统中,中断处理能力往往是决定系统性能上限和稳定性的关键。想象一下,你正在调试一个三相逆变器,PWM开关频率高达100kHz,这意味着每10微秒就必须完成一…

作者头像 李华
网站建设 2026/7/19 10:54:39

公称直径DN65与DN70的区别

公称直径DN65与DN70的区别 我们工作中很多做法、名称都是按照惯例沿袭来的,很少有人深入去探究。有时间的时候去研究一下,也是很有趣的事情。比如水管道有没有DN70的说法?与DN65到底有什么区别?其实我们一般都是统一标注DN65,避免误解,实际上DN65和DN70是表示的同一种管…

作者头像 李华