ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

工业控制器存储方案:EEPROM、NOR Flash与SD卡三级分工

工业控制器存储方案:EEPROM、NOR Flash与SD卡三级分工 1. 工业控制器为什么需要三级存储1.1 一类数据一种脾气这个系列写到第十二篇终于轮到说说“数据落地”这件事。工业控制器的存储方案我自己在一套 STM32FPGA 双核架构的控制器上的设计是三级分工EEPROM 管参数NOR Flash 管固件和关键配置SD 卡管日志和历史数据。很多做硬件的朋友一开始都想得很简单——控制器嘛上电读写、掉电不丢不就行了吗真做进去就会发现完全不是那么回事。工业控制器里的数据至少分三类它们的脾气完全不一样。一类是运行参数比如 PID 系数、温度校准值、累计运行时间、通讯地址、报警阈值。这些数据的特点是量很小几百字节到头了但是会经常改而且必须经得起反复写。第二类是固件和工厂配置bootloader、App 镜像、出厂序列号、网络参数。这些数据的特点是容量中等可能几百 KB 到几 MB平时几乎不写但要求断电后必须稳定存在启动的时候读取要快最好还能直接从上边执行代码。第三类是运行日志和历史数据比如电机电流曲线、温度趋势、报警记录、事件序列。这些数据的体量是滚雪球式的每天能攒出几十 MB必须持续追加写入而且最好能让现场工程师导出分析。把这三类数据压到同一种介质里就是灾难。用一片大容量 NOR Flash 全搞定擦写寿命先不说按扇区擦除这种粒度去频繁改一个 PID 参数本来就是杀鸡用牛刀。用 SD 卡全搞定文件系统一折腾启动时间直接多出两秒而且参数区每天被日志写覆盖寿命损耗根本扛不住。所以分级存储不是炫技而是顺着数据本身的需求去做匹配。那为什么偏偏是 STM32FPGA 这套组合因为在这个控制器里FPGA 负责高速采集和实时信号处理比如编码器正交解码、高速 ADC 采样、多路串口报文解析这些活儿如果全让 CPU 中断扛响应时间根本没法保证。STM32 负责上层逻辑、通讯和存储调度。数据从 FPGA 出来到 STM32 手里最终分流到三种存储介质里。这个架构下存储方案的设计核心就变成了三条路各走各的、互不拖累。1.2 三级分工参数、镜像、日志各得其位先给出一个总览方便后面每一节展开时你脑子里有个地图。数据类别典型内容容量需求更新频率可靠性目标首选介质运行参数PID、校准系数、地址、计数值几百字节按天/按操作/按停机触发掉电不丢、可频繁改写EEPROM固件与配置bootloader、App 镜像、工厂参数数百 KB 到数 MB升级或出厂时写一次随机读取快、长期稳定NOR Flash历史数据温度/电流曲线、报警、事件记录数十 MB 到数 GB秒级追加写入循环覆盖、掉电尽量少损坏SD 卡这个表格看着简单但每条选择背后都是权衡出来的。EEPROM 按字节擦写寿命动辄百万次适合做频繁更新的小参数存储。NOR Flash 随机读快、可 XIP 直读执行适合放固件镜像但擦写寿命只有大概十万次量级不能拿它当日志跑。SD 卡容量大、成本低、方便插拔,但掉电容易丢文件需要靠软件层做保护。三者刚好把“频繁改的小数据”、“稳定存的大镜像”、“持续长的海量记录”瓜分干净。1.3 掉电不丢只是底线寿命和性能才是门槛工业控制器和消费电子最大的区别就是“掉电”这件事会非常密集地发生。现场有电动设备启停有大功率接触器吸合还有雷击浪涌电源波动的频率远超你想象。所以存储方案首先要回答的不是“能不能存”而是“在这种恶劣供电环境下数据能不能活下来”。另一个容易被低估的指标是写入寿命。EEPROM 标称百万次擦写听着很多但如果程序里有一个 bug 导致某个参数被每秒写一次一百万次也就是十几天的事。NOR Flash 更夸张扇区擦除寿命十万次如果固件升级逻辑有缺陷同一块反复擦除产品没出厂就先报废了。SD 卡也一样日志系统如果做不到循环覆盖和磨损均衡一个区块会先被写穿。所以我把这个方案的设计原则定成一句话能用 EEPROM 的绝不用 NOR Flash能用 NOR Flash 的绝不上 SD 卡让每种介质只干自己最擅长的事。后面各节我就按这个原则把选型、电路、代码和坑都拆开讲。2. 存储选型与关键参数拆解2.1 EEPROM按字节折腾的小本本EEPROM 在工业控制器里的地位就像随手放在工具柜里那个经常掏出来用的笔记本。不用的时候嫌它占地方真正要找参数的时候必须立刻翻到正确那页。选型上我见得最多的就是 AT24C 系列比如 AT24C02、AT24C04、AT24C64都是 I2C 接口硬件设计非常成熟驱动代码满天飞但要用好它下面几个细节必须抠清楚。第一是器件地址的确定。AT24C 系列器件地址的高四位固定低三位由硬件引脚 A0/A1/A2 决定最后一位是读写位。我常用的是 4Kbit 到 64Kbit 的型号地址引脚多一个总线上可以挂多个器件但如果你只挂一片最好把 A0/A1/A2 全接地避免以后扩容时改硬件。地址搞错I2C 通信时 ACK 都等不到这是新手最容易卡的第一个点。第二是“页写”的使用。AT24C02 的页大小是 8 字节AT24C64 是 32 字节。一次连续写多个字节只要不超过页边界内部写周期只有一次5 毫秒左右就完成了如果跨页写控制器必须拆分而且跨页那部分容易踩进页边界 bug。我自己的习惯是写参数结构体时先算好长度确保不会跨页能一个结构体拼一个页写完绝不拆两次。第三是写周期的等待方式。很多例程写完之后HAL_Delay(5)就完事这写法在出厂测试时看着没问题可一旦系统这时候被中断打断延时超时后接着去操作 EEPROM内部可能还没写完数据就丢了。正确做法是写完以后持续轮询 ACK直到 EEPROM 内部写周期结束它才会对地址再次作出响应。这段逻辑我后面放在代码示例里。第四写操作前关闭中断。EEPROM 的 I2C 写过程不能被打断否则时序会乱。凡是写参数的操作我都会加一个临界区保护把中断优先级设到最低、关中断执行写完了再恢复。代价是几微秒到几毫秒对工业控制器的正常运行节奏来说完全没关系。2.2 NOR Flash能当内存用的镜像仓库NOR Flash 在工业控制器里的地位更像是书架上的装订档案。它按扇区擦除擦完以后整片是 0xFF写只能是 1 变 0。这个“先擦后写”的机制决定了每次更新数据都是一个重写流程。选型上最经典的还是 W25Q64/ W25Q128 这一族SPI/QSPI 接口工作模式 0四线 QSPI 能把读速度做到很高。W25Q 系列有几个固定指令码务必要熟悉0x9F 读 JEDEC ID0x06 写使能0x02 页编程0x20 扇区擦除4KB0xD8 块擦除64KB。这些指令我每次调试都会先跑一遍确认芯片能正确响应再去做上层逻辑。芯片的忙状态通过读状态寄存器 1 的 bit0 判断BUSY1 时必须等待。这个等待比 EEPROM 长得多擦一个 4KB 扇区可能要几百毫秒写的时候心里要有这个概念。NOR Flash 最大的优势是随机读快可以做 XIP也就是把 Flash 映射到微控制器的地址空间里CPU 直接在 Flash 上取指执行。但在 STM32 上做 XIP 一般要 MCU 本身支持外部存储器映射总线比如 FMC/FSMC 接口或者带 QSPI 内存映射模式的型号。如果 MCU 不支持 XIP那就老老实实把镜像拷到 SDRAM 或者内部 RAM 里运行不要硬撑着追求“直接在 Flash 里跑”反正中断响应和 Flash 操作已经足够复杂不值得为了省一点拷贝时间增加时序风险。另一个关键点是坏块管理。W25Q 系列在多次擦写后可能出现坏扇区工业场景下必须要做坏块记录。最简单的办法是在每个扇区头写一个“有效标志”上电扫描时发现擦写失败就标记坏块把数据挪到备用区。这个逻辑虽然老套但是可靠比依赖厂商隐藏的坏块表踏实。2.3 SD 卡容量大但没那么省心SD 卡是这三类介质里“人性”最重的一个。它内部是 NAND Flash 加上一个控制器FAT 文件系统又是在上位机体系里长出来的用在嵌入式环境里从一开始就是门妥协的艺术。工业现场我建议直接上工业级 SD 卡宽温、SLC 颗粒、带掉电保护固件和普通消费卡价格差不少但是现场丢数据的代价更大。通信方式上SPI 模式接线少、调试方便但速度上限不算高适合日志量不太大的场景。SDIO 模式速度快能到几十 MB/s但需要占用更多引脚对布线和驱动要求也更高。我的习惯是控制器日志量如果预估每天小于 200MBSPI 模式足够再往上老老实实上 SDIO。文件系统层面嵌入式环境最常用的是 FatFS。这个库简单、稳定、资源占用可控但有几个坑必须知道。第一写文件后要主动f_sync()否则数据可能还停留在文件系统的写入缓存里掉电就丢。第二频繁创建小文件会很快消耗目录项而且容易造成碎片日志这种连续追加型数据尽量设计成大文件、按块写、按天切分。第三异常掉电后 FAT 表会损坏程序启动时要主动检查挂载状态一旦发现故障要能自动重新格式化并重建日志文件这也是实际产品能不能在现场活下来的重要分界线。2.4 三种介质的寿命-容量-速度对照表把这三兄弟放一起看它们各自的边界会更直观。参数EEPROMAT24C64NOR FlashW25Q128SD 卡工业级接口I2CSPI / QSPISPI / SDIO最小操作单位1 字节4KB 扇区1 扇区512B典型容量64Kbit8KB128Mbit16MB8GB~32GB擦写寿命约 100 万次约 10 万次/扇区约 1~10 万次/块写一个扇区耗时约 5ms页约 300ms~2s擦写约 50ms~几百ms随机读性能字节随机读I2C 限制高支持 XIP慢FAT 表查找拖累明显掉电可靠性中等需字节级保证较高需防擦写中断低文件系统风险大这张表的结论很明确EEPROM 负责“小而频”NOR Flash 负责“稳而快”SD 卡负责“大而全”。后面整个存储架构的设计本质上就是让数据按照自己的特性准确掉到对应的介质里。3. STM32 和 FPGA 各管哪一段3.1 FPGA 负责“生产数据”STM32 负责“归档数据”在工业控制器里FPGA 一般承担的是那些 CPU 干不了或者干起来太吃力的活。比如同步采集多路编码器信号、高速 ADC 连续采样、对串行总线报文做实时过滤和校验。这些任务的特点是数据不断产生速率高实时性要求强而且哪怕 CPU 中断再快也扛不住每次都进中断去处理一帧高速数据流。所以这套架构的职责划分逻辑就一句话FPGA 负责把原始信号变成有结构的数据包STM32 负责把数据包变成存储介质上真正落盘的内容。FPGA 侧处理完的每一帧数据加上时间戳、通道号、序号放进内部 FIFO 或双口 RAM然后通知 STM32 来搬运。STM32 拿到数据后先做协议解析再决定这批数据是进 EEPROM、NOR Flash 还是 SD 卡。比如一个校准命令校验通过后写 EEPROM固件升级包的一小块数据攒够一扇区后写 NOR Flash温度曲线这种连续数据攒够一批后写 SD 卡。这种分工带来一个额外好处存储操作再慢也不会打断 FPGA 的实时采集。FPGA 只管往 FIFO 里塞数据STM32 的存储任务按自己的节奏往后排。反过来SD 卡写卡导致 STM32 卡顿几十毫秒也不会影响 FPGA 侧已经完成的采集工作。两个芯各管各的天然形成了解耦。3.2 数据从 FPGA 到 STM32 的搬运通道怎么搭搬运数据的方式有很多种最简单的是 GPIO 中断通知 并行总线读取。FPGA 把 16 位数据总线挂到 STM32 的 FSMC 接口上写满一个 FIFO 就拉高一个“数据就绪”信号STM32 检测到后开 DMA把整块 FIFO 数据搬进内存。这种方案的好处是带宽高、CPU 占用低缺点是两边的时序必须严格对齐。更常见的做法是 FPGA 提供一个串行接口用 UART 或者 SPI 把打包好的数据发出来。SPI 可以做从机STM32 做主机定时轮询读取。UART 适合低速率但逻辑简单的场景。不管用哪种接口通信协议必须固定成帧格式我的习惯是这样帧头(0xAA 0x55) | 长度(2字节) | 类型(1字节) | 数据(N字节) | CRC16(2字节)帧头的作用是同步CRC16 的作用是校验。STM32 接收端维护一个环形缓冲区逐字节做状态机解析一旦收到完整帧就校验、提交给上层任务。帧头占两个字节能有效降低误同步概率但是也不要太依赖帧头因为总线上的随机干扰也可能伪造帧头所以帧类型字段必须设计成天然带非法值收到不认识的类型直接丢弃整个帧并重新同步。如果让 FPGA 自己实现 UART 接收仿真几个要点可以记一下检测起始位下降沿以后用 16 倍波特率时钟不断采样数据位的中点每个位取多次采样的中间值滤掉毛刺。发送侧则用波特率时钟逐位移位输出。这套逻辑在 testbench 里验证时记得用带毛刺的输入信号做测试只看理想波形是测不出问题的。3.3 通信帧协议与校验设计工业控制器里的通信帧我坚持一个原则任何一帧进入 STM32 的数据都默认是不可信的。所以不只是 FPGA 和 STM32 之间的链路要做校验从存储介质读出来的数据也要做校验。EEPROM 里的参数结构体带 CRCNOR Flash 里的镜像和配置带 CRCSD 卡里的日志文件每条记录带 CRC这一条贯穿整个存储方案。CRC 算法用什么多项式其实不重要16 位 CRC 在工业控制器场景下已经够用重要的是“读出来必须验不能直接信”。另外帧协议里最好带上序号。FPGA 每发一帧就把序号加一STM32 收到后记录连续帧数。如果序号出现跳变说明丢帧了这时候日志文件里要打一条事件记录方便事后分析是采集链路问题还是存储链路问题。我踩过一次很深的坑FPGA 侧 FIFO 溢出时静默丢了几十帧数据上位机曲线图出现一个看不懂的“跳崖”排查了三天才用序号才发现是丢帧而不是传感器真的突变。4. 分区规划、双备份与掉电保护实操4.1 存储布局像规划城市功能区分区每次拿到一个存储介质第一步不是写驱动而是画分区图。分区设计的好坏直接决定后面代码维护的舒服程度。我的习惯是把 NOR Flash 当成整个系统的“固定存储盘”用地址把用途划分明确。一个参考布局可以做成这样0x000000 - 0x07FFFF App 主镜像512KB 0x080000 - 0x0FFFFF App 备份镜像512KB 0x100000 - 0x1007FF 工厂配置区2KB 0x100800 - 0x100FFF 运行参数区 A2KB 0x101000 - 0x1017FF 运行参数区 B2KB 0x200000 - 0x1FFFFF 运行日志/临时存储区剩余空间主镜像和备份镜像分开是为了给固件升级失败留一条后路。运行参数区 A/B 两份并列是双备份的基础。工厂配置区单独划出来防止运行参数写穿时把出厂数据冲掉。整个分区规划完代码里每个区的起始地址和长度都是宏定义不许任何裸地址出现在业务代码里这是存储代码可维护性的最低要求。EEPROM 的空间小不需要像 NOR Flash 那样划分复杂区域但也要定义结构体和校验。我的典型做法是EEPROM 开头放一个版本号字段每次结构体布局有变化就递增版本号后面按固定偏移放参数结构体末尾放 CRC32。读取时先校验版本号和 CRC不匹配就用默认参数重新初始化。SD 卡的目录我也建议设计成固定结构比如/sys/放配置备份/log/放按日期命名的日志文件/data/放历史曲线避免日志文件散落在根目录里。4.2 写 EEPROM 的完整流程页写ACK 等待回读校验EEPROM 写入函数看起来简单但正确写法有一个标准模板。以 AT24C64 为例我提供一个可直接参考的版本// 返回 0 表示成功非 0 表示失败 uint8_t EEPROM_WriteBytes(uint16_t addr, uint8_t *buf, uint16_t len) { uint8_t tmp[64]; uint16_t offset 0; uint16_t page_size EEPROM_PAGE_SIZE; // 32 字节 uint16_t remain; HAL_StatusTypeDef status; while (offset len) { // 计算当前页可写的最大字节数 remain page_size - (addr offset) % page_size; if (remain len - offset) remain len - offset; status HAL_I2C_Mem_Write(hi2c1, EEPROM_ADDR, addr offset, I2C_MEMSIZE_16BIT, buf offset, remain, 50); if (status ! HAL_OK) return 1; // 等待内部写周期结束轮询 ACK而不是盲等固定延时 while (HAL_I2C_IsDeviceReady(hi2c1, EEPROM_ADDR, 100, 50) ! HAL_OK); offset remain; } // 回读校验读出来必须和写入内容完全一致 status HAL_I2C_Mem_Read(hi2c1, EEPROM_ADDR, addr, I2C_MEMSIZE_16BIT, tmp, len, 100); if (status ! HAL_OK) return 2; if (memcmp(tmp, buf, len) ! 0) return 3; return 0; }这段代码的连接细节我都踩过第一页写必须处理“地址正好落在页边界”的情况否则会多写出一个页后面的数据全乱。第二等 ACK 而不是等延时这一个改动让我现场参数丢失的概率直接降了一个数量级。第三回读校验不写等于把可靠性寄托在“芯片永远不会写错”上。4.3 Flash 和 SD 卡的掉电保护设计NOR Flash 和 SD 卡在掉电防护上的思路不太一样但核心都是“把写操作做成可恢复的”。NOR Flash 侧关键是避免擦写过程中掉电导致扇区数据半生不熟。我的做法是写镜像前先把新镜像整体搬到一个临时区域全部写完并校验通过再把目标扇区擦掉临时区数据搬过去。虽然耗时更长但任何时刻系统掉电都存在一个完整的旧版本或新版本不会出现“半个文件”状态。SD 卡侧的掉电保护主要靠 FatFS 的f_sync和文件设计的原子性。写日志时我的节奏是每次往文件里追加一批数据后不立刻f_close但立刻f_sync把缓存刷到卡上。正常情况下每次日志批次间隔几秒到几十秒掉电时最多丢一个批次不会整个文件破坏。还需要配合上电自检开机挂载 SD 卡后检查日志文件头尾如果发现文件长度异常或者 CRC 校验失败就把当前文件加上.bad后缀改名新建一个文件继续记录。这套逻辑虽然粗暴但在无人值守的现场非常实用。4.4 开机自检与数据完整性恢复每次上电存储系统都要做一次“体检”。顺序是固定的先读 EEPROM 参数区校验版本号和 CRC失败则使用默认参数并打一条“参数恢复为默认”的日志再读 NOR Flash 里的 App 镜像头校验整个镜像 CRC判断主镜像是否合法不合法就切换到备份镜像启动最后挂载 SD 卡检查文件系统状态并把“上电时间”“上次关机标志”写入日志。“上次关机标志”是一个特别有价值的小设计。正常关机流程里系统会先写一个“正常关机”标志到 EEPROM 或 NOR Flash。如果上电时发现上次不是正常关机说明发生过掉电或者死机日志里就多一条异常事件。很多诡异的现场问题靠这个标志能从“找不到原因”变成“知道大概发生时间点”再用时间点去对日志曲线马上就有线索。5. 常见问题与排查技巧实录5.1 EEPROM 参数凭空丢现象产品出厂测试一切正常到现场跑几天部分设备上电后参数变成出厂默认值。原因排下来最常见的不是芯片坏而是写周期被干扰。I2C 是慢速总线如果写 EEPROM 时 CPU 正处理高优先级中断或者电源电压在临界值附近抖动ACK 可能永远等不到甚至写进错误地址。排查和解决建议先用逻辑分析仪抓 I2C 时序确认器件地址、寄存器地址、数据有没有错位。然后用示波器看 VDD 波形重点观察写操作瞬间有没有塌陷。软件侧把“写前关中断、写后轮询 ACK、回读校验”这三步全部补上缺一步都不行。电源侧给 EEPROM 的 VDD 加一个 100nF 10uF 的电容再检查 I2C 上拉电阻阻值取 4.7k 还是需要根据 I2C 速率计算速率越高电阻要越小。5.2 NOR Flash 写入失败和坏块判断现象固件升级时卡在擦除阶段或者写完后拿起一片读回来全是 0xFF。原因可能是 SPI 时序不稳定、电源瞬态跌落、擦写次数到寿命边界也可能是芯片型号不对导致指令里地址字节数配置错误。W25Q 系列在 16MB 以上容量时地址是 4 字节模式代码里如果用 3 字节地址写高地址区必然会出错。排查思路先读 JEDEC ID9F 指令确认芯片型号和容量返回 0xEF 开头表示 Winbond 系列。再看写使能指令有没有发写完一个扇区后读状态寄存器确认 BUSY 位已经清零。最后把一个已知的测试数据模式写入整个扇区再读回来定位坏块。坏块一旦确认就把它加进坏块表不再使用。这里有一个建议不要把 0xFF 当成“没数据”很多新扇区擦完就是 0xFF读回来是 0xFF 不代表写入成功要用回读比对来判断。5.3 SD 卡文件损坏、速度变慢、卡“锁死”现象日志文件打不开或者写入速度越来越慢极端情况 FAT 表彻底损坏重新插到电脑上提示格式化。嵌入式 SD 卡最容易出的问题就是异常掉电导致 FAT 表更新不完整。另一个不常见但更恶心的现象是“SD 卡内部寄存器锁死”特别是某些山寨扩容卡或劣质工业卡供电纹波大的时候内部控制器状态机卡死任何命令都无响应。应对手段软件上坚持f_sync批次落盘启动时主动检查文件系统状态损坏后能自动重建日志文件硬件上给 SD 卡供电加独立 LDO 和大电容避免电机启停瞬间电压塌陷如果遇到卡死可以在复位时尝试 SD 卡自身的软件复位命令但在我的经验里用处有限劣质卡只能换卡。做工业产品时SD 卡这种“可信任”的外设其实是最不省心的卡的质量直接决定现场故障率这个成本不能省。5.4 FPGA 与 STM32 之间的数据错位现象STM32 解析出来的数据帧偶尔出现整帧偏移CRC 校验失败的概率上升。原因基本上是 UART 接收端起始位判断不严或者 SPI 收发时序没有对齐。做 FPGA 接收时哪怕只是从 UART 的 RX 引脚到 STM32 之间多了一段长走线信号边沿变缓16 倍采样也可能在边界抖动时判定错误。解决技巧是 FPGA 侧把位采样点放在每个位的中点附近并且用多个周期做毛刺滤除STM32 侧不要只信帧头要加入帧长度上限超过最大长度就丢帧重新同步。最重要的一步FPGA 到 STM32 的链路必须自带序号和 CRC任何一帧校验失败都不要尝试“修复”直接丢弃并等待下一帧让上层靠连续两帧序号判断是否丢帧。5.5 一张排查方法速查表故障现象最可能原因优先排查手段参数变默认值EEPROM 写周期被中断检查 I2C ACK 时序、写前关中断Flash 写后读全 0xFF擦除失败或地址边界错误读 JEDEC ID、确认 3/4 字节地址日志文件打不开FAT 表异常掉电损坏启动时检查文件系统损坏自动重建SD 卡写入越来越慢碎片或劣质卡发热后降速检查卡质量日志按块大文件设计数据帧错位UART 起始位误判或时序偏差FPGA 中值采样STM32 加帧长度上限系统上电偶尔死在初始化上电时序不满足芯片要求检查存储芯片 VDD 爬坡时间和复位时序6. 下一步还能怎么改这套三级存储方案目前在我项目里的状态已经稳定运行了不短时间但每次画版本规划我脑子里其实还有几个明确想改造的方向。一个是把 NOR Flash 的镜像区做成完整的双备份 OTA 升级体系现在的备份镜像属于“能启动就行”以后想做到“AB 区动态切换、差分升级、升级过程可回滚”代码层面需要把升级状态机再拉细一层。另一个改造方向是日志文件系统从 FatFS 换到更适配 Flash 的方案比如 LittleFS它在掉电恢复和磨损均衡上都比传统 FAT 文件系统更适合嵌入式场景代价是上位机读数据时不再能直接插电脑看文件需要额外做导出工具。这两个方向我个人其实还没有完全下决心因为 FatFS 的“简单直接可读”对现场工程师太友好了。最后再分享一个我反复验证过的体会存储方案设计这件事最忌讳“以后再说”。分区、校验、掉电流程这些机制必须在硬件设计阶段就定下来。等固件写了几万行再回头补改动成本不是翻倍是翻几倍。如果你也在设计类似的工业控制器建议先把 EEPROM、NOR Flash、SD 卡这三块的空间布局画出来哪怕初期只实现最简版也要让协议和校验框架从一开始就长对地方。后面每一版硬件的改动都会轻松很多。
返回列表