车规微控制器的ECC机制及EMU外设
车规微控制器的ECC机制及EMU外设
文章目录
- 车规微控制器的ECC机制及EMU外设
- 引言
- ECC的基本原理
- ECC RAM的访问方式
- ECC RAM的初始化
- SRAM ECC错误注入及EMU外设
- Flash ECC校验
- 参考文献
引言
ECC是微控制器系统中,用于保障信息安全的常用机制,主要是避免存储设备中存放的数据因硬件干扰被篡改。国产车规微控制器原厂云途半导体设计和发布的YTM32微控制器芯片,全系配备了存储器的ECC机制,可以有效的增强芯片运行稳定性,避免因为内存位翻转导致芯片产生严重故障。本文将以YTM32微控制器芯片为例,对内存ECC的基本机制、实现原理和使用时的注意事项等进行介绍。
ECC的基本原理
ECC全称 Error Checking and Correcting,属于一种错误检查和纠正算法,典型的ECC算法一般可以做到纠正单比特错误和检查2比特错误。
在介绍ECC算法之前,先看一种简单的校验算法:奇偶校验。奇偶校验是在传输数据流的末尾,增加1个比特的校验信息,以保证完整的数据流中比特位的累加值一定是奇数或者偶数:若采用偶数校验的方式,发送方对偶数数据补充比特0,对于奇数数据补充比特1,这样发送的数据一定是偶数,接收方收到数据之后就对完整的数据帧进行判断, 如果不是偶数则代表数据出错。通过增加1个比特的额外数据,接收方就可以判断数据流是否正确,以实现对数据的校验。
但是,使用奇偶校验机制对数据有效性的判定能力有限:
- 若有2个比特数据发生反转,那么接收方依然会判定接收到的数据是正常数据;
- 如果有1个比特数据异常,接收方只能判断数据是异常的,并不能从接收到的数据恢复出正确的数据(因为无法判断具体是哪一位出现了异常)。
从上面两种情况来看,奇偶校验只能检验单个比特的数据错误。
基于奇偶校验算法,ECC校验算法通过增加更多的额外校验数据,以实现对传输数据的错误检查和错误纠正。
这里简单介绍ECC的实现原理。以4-bit ECC计算为例,如图x所示,假定3个不同颜色的圆相交的4个小格代表着4个bit的数据,与其他圆没有交集的那个格就代表着ECC bit,即a4,a5,a6。
这里,人为设定一个规则:每个圆内的4个bit异或结果为0(类似于奇偶校验的机制)。当4个bit的数据位确定后,例如图中的1001,即可确定唯一ECC bit结果,即:a4=1,a5=0,a6=1。此时,发生任何1个bit的跳变(包括ECC bit),均可被检查出来并纠正,从而达到ECC的目的。此处描述的是,每个数据位都会和一些ECC位建立约束关系,但这些数据位同时还会同另一些ECC位存在约束关系,如此,通过数据冗余,形成“铁索连环”,相互照应。以此为基础,使用更多的ECC位(增加数据冗余),可以让数据更加“稳固”,但也会付出更多存储空间的代价。
最小ECC bit位数n要求:2^n>数据位数+ECC位数n。
数据位每增加1倍,ECC只增加1位检验位。设计ECC时,可以设计数据位是8位对应的ECC需要增加5位来进行ECC错误检查和纠正,当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推。
在实际应用芯片的场景中,存储单元(包含芯片内部SRAM和Flash)通常发生的是位数据的翻转,也就是单比特错误居多。针对这种错误,ECC一般可以实现1个比特的错误纠正和2个比特错误的检查,芯片的ECC组合一般是32+7和64+8的组合方式。如表x所示。
有效数据 | ECC数据 |
---|---|
32位有效数据 | 7位ECC数据 |
64位有效数据 | 8位ECC数据 |
根据处理器特性和SRAM以及Flash的应用特性,通常在MCU中,一般对SRAM采用32+7的ECC校验方式,对Flash采用64+8的校验方式。
ECC RAM的访问方式
微控制器系统中的总线在读写支持ECC的SRAM时,会通过ECC编码器(Encoder)和ECC解码器(Decoder)对写入和读出的数据进行处理,如图x所示。
- 写入SRAM数据时,总线将计算好该数据对应的ECC,一并写入
- 从SRAM读数据时,总线同时读取数据和ECC校验信息,之后根据ECC对数据进行校验,然后才将数据返回系统中使用
在图x中可以看到,总线对于SRAM的读写都是以32位的带宽进行操作的,嵌入在32位总线上的ECC编码器和解码器也是基于32位数操作的,但是,软件中有很多基于字节或者半字的操作方式,对于这种情况,总线并不能直接以字节或者半字节的方式向SRAM存储区中写数,SRAM控制器首先会读出SRAM中原有的32位数,修改这个数,重新计算ECC,然后将新的数据和ECC计算的结果一并写入到SRAM中。
ECC RAM的初始化
SRAM存储器中的内容在上电之后内容是随机的,其中的有效数据和ECC数据并未建立起关联。此时,如果读取SRAM的内容并进行ECC校验,大概率上是会出现ECC错误的。因此,在使用支持ECC的SRAM之前,需要手动对SRAM进行初始化操作。初始化SRAM的操作,就是简单的向SRAM中按照32位的宽度写入一个任意值,通过ECC编码器计算好ECC数据并填充SRAM存储器即可。注意,初始化的时候必须要按照32位的形式写入,否则若按照字节或者半字的方式写入的时候,系统会先读后写,最初读到的数也是错的,会出现ECC错误。
ECC的初始化过程一般会被放在MCU的启动汇编代码中,此时尚未初始化ECC,不能使用建立在ECC内存中的堆栈。以YTM32微控制器芯片为例,其启动程序使用如下代码实现对ECC的初始化:
#ifndef START_NO_ECC_INIT/* Init ECC RAM */ldr r1, =__RAM_STARTldr r2, =__RAM_ENDsubs r2, r1subs r2, #1ble .LC5movs r0, 0movs r3, #4
.LC4:str r0, [r1]add r1, r1, r3subs r2, 4bge .LC4
.LC5:
#endif
上述代码中,可以通过定义START_NO_ECC_INIT
宏配置初始化时绕过ECC初始化,ECC的初始化范围是从__RAM_START
至__RAM_END
,这两个地址是在linker文件中定义的,用户可以根据应用需求修改相应的地址范围。注意,这里设置初始化ECC的地址区域越大,系统启动的时间将会越长。
YTM32芯片在SRAM产生ECC错误时,会产生Bus Error或者Hard Fault。
用户在使用过程中,如果发现芯片在单步调试过程中使用正常(在断点时,调试器会扫描存储空间),但是在芯片重新上电之后就会出现异常,就可以检查一下是否SRAM ECC没有正常初始化,例如上述过程中的START_FROM_FLASH
宏定义是否在汇编调试阶段有定义(针对旧版本SDK)。
还有一种判定ECC未正常初始化的方式,可通过调试器查看系统的SRAM,如果发现有的SRAM可以读,有的SRAM地址无法正确读,那么就是ECC没有正常初始化。
SRAM ECC错误注入及EMU外设
在程序开发过程中,考虑到功能安全的需求,还需要考虑出现ECC错误情况的处理机制。实际上,SRAM上比特位翻转是一个小概率事件,在常规测试过程很难复现。工程师圈子里有一句广为流传的口号,“有困难要上,没有困难制造困难也要上”。为了人为创造ECC错误的情况(以便开发ECC错误处理过程),YTM32的为控制上设计了一个EMU(ECC Management Unit)的外设模块,专门用于主动产生和捕获ECC错误。
EMU模块在ECC过程中的位置,如图x所示。
EMU实际上是在SRAM的读过程中增加的一个模块,将从SRAM的读取的数据同EMU设置的一个mask进行异或运算,从而对读取数据的某个位进行翻转(以产生错误数据),然后送入ECC解码器,从而模拟SRAM出现ECC错误。
另外,EMU还会监测ECC解码器的结果,当产生ECC错误的时候,EMU会捕获这个异常,并记录出现ECC错误的地址和异常类型(单比特错误还是多比特错误)。应用中,可通过读取EMU的错误信息,进而决定如何处理ECC错误。
对于ECC错误的处理方式,可以分为如下几种情况:
- 如果系统允许复位的话,可以直接记录诊断信息后复位运行,这样SRAM整体都会重新初始化成正常内容
- 针对单比特错误,因为ECC可以直接纠正结果,可以直接读取产生ECC错误地址上的内容,然后将内容重新写回到该地址,即可恢复正常。注意,如果ECC错误是通过EMU模拟实现的,此时就需要关闭EMU注入通道,否则再次读取的时候依然会有ECC错误,另外因为ECC是纠1检2的算法,如果出现多于2比特的错误,这种情况SRAM的读取结果可能会有正常、单比特错误和多比特错误几种结果。
- 针对多比特错误,因为无法恢复正确信息,应用只能向错误地址写入一个默认值,或者通过复位操作恢复正常值。
Flash ECC校验
Flash内部也是通过电荷状态来存储信息的,虽然Flash中电荷的状态大部分时间都是稳定的,但是当受到某些干扰之后,Flash中电荷状态也有可能发生反转。所以,车规芯片对Flash的ECC校验也提出了要求。因为Flash不支持随机的写入,所以ECC的操作方面相对SRAM比较简单。
首先,Flash初始时擦除状态,有效数据全是1,而对应的ECC算法可以保证全1的ECC校验值也是全1(巧妙啊),也就是说,Flash擦除状态下,对Flash的读操作并不会产生ECC错误。而对Flash的写入都是通过一系列的命令实现的,在写入的时候,硬件会自动计算好ECC,再将有效数据和ECC校验值一并写入到Flash的存储区中。写入完成之后,用户正常读取数据内容即可。这种情况,即使Flash出现单比特的错误,ECC解码器也可以正常纠正,以保证有效数据的完整性。
对于功能安全要求比较高的程序,应用程序还需要针对Flash的ECC进行处理,和SRAM ECC错误处理的方式类似,Flash ECC错误处理可以分为如下几种形式:
- 当出现单比特数据错误,由于总线可以自动恢复正确的原始数据,应用程序可以先记录相应的诊断数据,然后备份Flash出错数据所在的扇区,再将扇区擦除后,从备份地址将原有数据重新写入到擦除后到扇区。
- 当出现多比特数据错误,如果错误出现在程序区域,那么只能记录诊断数据,然后尝试运行备份APP程序,尝试系统复位,或者重新下载程序。
- 当出现多比特错误错误,如果错误出现在数据区域,那么应用程序需要尝试使用默认值填充错误区域,相当于重新下载程序。
总之,当检测到Flash出现ECC错误时,Flash存储器的内容已经有风险,必须将出现错误的扇区进行擦除和重新编程才能从根本上清除掉ECC错误。当然,同一个地址产生多位的翻转概率还是非常低的,考虑到设计实现这种自恢复的机制也需要消耗相当的成本(更长的开发周期,更复杂的应用程序,更大的物理存储空间),开发者可以酌情采取应对策略。
参考文献
- 《YTM32芯片内部ECC处理机制》,https://www.zhihu.com/tardis/sogou/art/599259860,Major-Lin,2023-01-15
- 《白话flash ECC原理》,https://zhuanlan.zhihu.com/p/61907594,moonliang, 2019-04-10
相关文章:

车规微控制器的ECC机制及EMU外设
车规微控制器的ECC机制及EMU外设 文章目录 车规微控制器的ECC机制及EMU外设引言ECC的基本原理ECC RAM的访问方式ECC RAM的初始化SRAM ECC错误注入及EMU外设Flash ECC校验参考文献 引言 ECC是微控制器系统中,用于保障信息安全的常用机制,主要是避免存储设…...
Less的强大变量用法
less中的变量应用十分强大,可以灵活的应用到各种不同需求的场景。 一,属性值变量 声明:sass声明变量是用$符号,而less声明变量是用符号 作用域:也区分为全局变量和局部变量,如果引用的变量有定义局部变量&…...
【相机标定】opencv python 标定相机内参时不计算 k3 畸变参数
文章目录 1. 背景2. 完整的 opencv python 标定相机内参过程3. 选择是否计算畸变参数 k3 1. 背景 畸变参数 k3 通常用于描述径向畸变的更高阶效应,即在需要高精度的应用中可以用到,一般的应用中 k1, k2 足矣。 常见的应用中, orbslam3 中是否…...

html 标签简介
概述 标签的效果不重要,重要的是标签的语义。 文本标签 文本标签用于包裹:词汇、短语等。排版标签,比如div,p,h1等。排版标签更宏观(大段的文字),文本标签更微观(词汇、短语)。文…...
dos汇编总结
前言: 计组课本需要学习汇编,可惜自己看不太懂。这里发现一个学习方法交给大家。其实新手可能一些抽象表示难理解,这里我把我学习的疑问点以及思路记录一下。 要点: 这里我以题为例给大家分析 输出输入对应大写字母的小写字母 …...

四川玖璨电子商务有限公司:短视频有什么运营
根据短视频有什么运营,短视频的拍摄工具多种多样。无论是在手机上拍摄还是使用专业摄影设备,拍摄短视频的目的都是为了吸引观众的注意力和提升内容的质量。从小花费到高投入,在不断发展的短视频行业中,拍摄方法也得到了不断创新和…...

混合查询多家快递,快速掌握物流信息
在现代社会,快递服务已成为我们日常生活的重要组成部分。无论是购物还是文件传递,我们都需要快递服务的帮助。然而,不同的快递公司需要不同的查询方法,这无疑增加了我们的查询难度。因此,有没有一种方法可以让我们一次…...

独立站新手引流,谷歌SEO工具汇总
俗话说“工欲善其事,必先利其器”,做谷歌SEO也一样,要想做好并提升SEO效果,卖家就需要了解并利用好SEO工具。那我们今天就来盘点一下,常用的SEO工具有哪些吧~ 网站检测工具 1、PageSpeed Insights:这是谷…...
SpringMvc 与 Lombok 碰撞导致 JSON 反序列化失败
SpringMvc 与 Lombok 中 JSON 反序列化失败 错误复现_1 Data public class User{private Long id;private boolean isOk; }RequestMapping public R<User> getUser(RequestBody User user){return R.success(user); }// 前端传参 - {"id": 123456789,"i…...
怎么样显卡叠加,什么是NVIDIA 显卡 非公、公版、涡轮卡
1、显存叠加的问题,因为这个跟是否是深度学习无关: 先说一下显存叠加的问题,因为这个跟是否是深度学习无关:一台机器有多张显卡,显存不会叠加!显卡里面包含了显存、cache、计算单元、通信等,每…...
CentOS安装Elasticsearch集群
前言 之前使用的ES集群是其他公司维护,没有机会安装,后来做其他项目,终于有机会安装ES集群,简单记录一下备用 一、安装jdk 安装jdk1.8就可以,可以参考另一篇文章,这里就不细说了 二、修改系统参数 如果在…...
计算机专业毕业生指南
在大四毕业时,完成计算机毕业设计需要一定的计划和组织。以下是一些建议,帮助你在三个月内快速完成毕业设计: 选择一个合适的主题: 选择一个你感兴趣的主题,这将激发你的热情,使你更有动力完成项目。 确保…...

Springboot集成Docker并将镜像推送linux服务器
案例使用springboot项目,在IDEA 中集成Docker生成镜像,并将镜像发布到linux服务器 具体步骤如下: 1、Centos7安装Docker 更新系统的软件包列表 sudo yum update安装Docker所需的软件包和依赖项: sudo yum install docker完成…...

数字孪生与GIS:智慧城市的未来之路
数字孪生和地理信息系统(GIS)是两个在现代科技中崭露头角的概念,它们的融合为智慧城市项目带来了革命性的机会。本文将解释数字孪生为何需要融合GIS,并以智慧城市项目为例进行说明。 数字孪生是一种虚拟模型,它精确地…...

nas汇编程序的调试排错方法
nas汇编程序的调试排错方法: 1、查找是哪一步错了 2、查看对应的*.lst文件,本例中是"asmhead.lst" 3、根据*.lst文件的[ERROR #002]提示查看源码,改错。 4、重新运行编译,OK 1、查找是哪一步错了: nask.ex…...
【网络安全带你练爬虫-100练】第21练:批量获取文件夹中文件名
目录 一、目标1:使用python爬取指定文件夹中的文件名 二、目标2:在文件夹指定目录打开命令行 一、目标1:使用python爬取指定文件夹中的文件名 方法一:使用os模块 将/path/to/folder替换为实际的文件夹路径。os.listdir()函数用…...

Unittest自动化测试框架vs Pytest自动化测试框架
引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章…...

PHP8的数组-PHP8知识详解
今天开始学习数组, 本文主要讲了三点:什么是数组、php8中数组的改进、数组函数。 一、什么是数组 在PHP8中,数组是非常重要的数据类型。相对于其他的数据类型,数组更像一种结构,而这种结构可以储存一系列数值。 数组…...
数据仓库_维度表的两大分类
最近看一篇文章对维度表进行了分类,记录一下。 维度表主要分为两类高基数维度表和低基数维度表。 高基数维度数据 一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。 低基数维度数据 一般是配置表,比如枚举值对应的中文含…...

4、DVWA——文件包含
文章目录 一、文件包含概述二、low2.1 源码分析2.2 通关分析 三、medium3.1 源码分析3.2 通关思路 四、high4.1 源码分析4.2 通关思路 五、impossible 一、文件包含概述 文件包含是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(i…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...