车规微控制器的ECC机制及EMU外设

news2024/11/24 2:30:07

车规微控制器的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。

在这里插入图片描述

图x 4-bit ECC计算方法

这里,人为设定一个规则:每个圆内的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所示。

表x 常用的ECC数据长度
有效数据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 MCU总线读写带有ECC的SRAM

在图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_START
    ldr r2, =__RAM_END

    subs    r2, r1
    subs    r2, #1
    ble .LC5

    movs    r0, 0
    movs    r3, #4
.LC4:
    str r0, [r1]
    add	r1, r1, r3
    subs r2, 4
    bge .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所示。

在这里插入图片描述

图x EMC在ECC过程中的位置

EMU实际上是在SRAM的读过程中增加的一个模块,将从SRAM的读取的数据同EMU设置的一个mask进行异或运算,从而对读取数据的某个位进行翻转(以产生错误数据),然后送入ECC解码器,从而模拟SRAM出现ECC错误。

另外,EMU还会监测ECC解码器的结果,当产生ECC错误的时候,EMU会捕获这个异常,并记录出现ECC错误的地址和异常类型(单比特错误还是多比特错误)。应用中,可通过读取EMU的错误信息,进而决定如何处理ECC错误。

对于ECC错误的处理方式,可以分为如下几种情况:

  1. 如果系统允许复位的话,可以直接记录诊断信息后复位运行,这样SRAM整体都会重新初始化成正常内容
  2. 针对单比特错误,因为ECC可以直接纠正结果,可以直接读取产生ECC错误地址上的内容,然后将内容重新写回到该地址,即可恢复正常。注意,如果ECC错误是通过EMU模拟实现的,此时就需要关闭EMU注入通道,否则再次读取的时候依然会有ECC错误,另外因为ECC是纠1检2的算法,如果出现多于2比特的错误,这种情况SRAM的读取结果可能会有正常、单比特错误和多比特错误几种结果。
  3. 针对多比特错误,因为无法恢复正确信息,应用只能向错误地址写入一个默认值,或者通过复位操作恢复正常值。

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错误处理可以分为如下几种形式:

  1. 当出现单比特数据错误,由于总线可以自动恢复正确的原始数据,应用程序可以先记录相应的诊断数据,然后备份Flash出错数据所在的扇区,再将扇区擦除后,从备份地址将原有数据重新写入到擦除后到扇区。
  2. 当出现多比特数据错误,如果错误出现在程序区域,那么只能记录诊断数据,然后尝试运行备份APP程序,尝试系统复位,或者重新下载程序。
  3. 当出现多比特错误错误,如果错误出现在数据区域,那么应用程序需要尝试使用默认值填充错误区域,相当于重新下载程序。

总之,当检测到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gRPC远程进程调用

gRPC远程进程调用 rpc简介golang实现rpc方法一net/rpc库golang实现rpc方法二jsonrpc库grpc和protobuf在一起第一个grpc应用grpc服务的定义和服务的种类grpc stream实例1-服务端单向流grpc stream实例2-客户端单向流grpc stream实例3-双向流grpc整合gin

转型的每一步都至关重要!大运新能源远勤山谈品牌发展之道

“我们转型新能源乘用车,一开始选择研发生产悦虎和远志M1两款中低价位车型是为了“练练手”。我们用这两款车型探路,去熟悉和了解新能源市场,通过一步一步踏踏实实把产品做好,逐渐获得消费者认可,同时也为今后研发其他…

一周AIGC丨中国境内 151 个算法完成备案,腾讯、百度等 11 家 AI 大模型产品陆续上线...

近日,网信办官网公开发布第二批境内深度合成服务算法备案信息。至此,国内已有 151 个算法通过深度合成服务算法名单的备案。腾讯、百度等 11 家 AI 大模型产品完成备案陆续上线,标志着大模型行业在我国正式进入产品化落地阶段,大模…

链动2+1模式,让你的美妆消费变成收入来源

美妆,是一个与女性息息相关的话题,也是一个巨大的市场。据统计,2022年,中国美妆市场规模达到了1.3万亿元,占全球美妆市场的20%。美妆消费者的需求日益多样化和个性化,对产品的品质、效果、安全性等方面有着…

Nougat 深度剖析

Nougat 深度剖析 项目地址:https://github.com/facebookresearch/nougat 论文地址:Nougat: Neural Optical Understanding for Academic Documents 0 背景 近日,MetaAI又放了大招,他们提出了一种全新的端到端的OCR模型&#x…

spring boot项目上传头像

应用还是验证码使用的原理;但是代码逻辑却有所不同。 逻辑前端传给后端,然后写入本机磁盘去,文件名用uuid避免重复。写完就可以顺带把文件名保存到数据库里。上传就这样子。 怎么取用的;还是通过配置映射的方式;通过sr…

电商企业固定资产怎么管理

电商固定资产管理需要建立标准的固定资产管理制度,从规则上进行约束。同时,引入固定资产管理系统,从流程上起到直接提升效果的方式。电商标准的固定资产管理制度因公司而异,但通常包括以下内容:  固定资产的定义和分…

B2B企业常用的邮件营销推广策略

互联网在经历了十多年的高速增长后,近年来互联网流量逐渐饱和,企业获客成本越发高涨以及拓客增长渐渐缓慢,尤其对于专业门槛高、行业较为垂直的B2B企业而言,网络营销一直是企业获客中非常重要的一环。如何获得更多的客户、降低获客…

【Python爬虫笔记】爬虫代理IP与访问控制

一、前言 在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方…

VUE for循环 默认选中第一条数据

for循环渲染列表默认选中第一条数据 点击其他选项切换数据 <div><div class"Subtitle" style"padding: 5px 40px;">项目清单</div><div class"project-manifest"><div v-for"(item, index) in project" :…

三年前端还不会配置Nginx?刷完这篇就够了

什么是Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。它可以用于处理静态资源、负载均衡、反向代理和缓存等任务。Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。它具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受欢迎。 为…

SpringBoot的HandlerInterceptor拦截器使用方法

一、创建拦截器 通过实现HandlerInterceptor接口创建自己要使用的拦截器 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.…

Python Fiddler抓包工具实战案例:获取公众号(pc客户端)数据

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 开发环境: python 3.8 运行代码 pycharm 2021.2 辅助敲代码 requests 第三方模块 Fiddler 汉化版 抓包的工具 配置Fiddler环境 先打开Fiddler&#x…

AFNetworking 实现下载请求的原理过程

实现下载的流程 一 生成一个 NSMutableURLRequest二 创建 NSURLSessionTask创建 URLSessionTask过程解析代理方法调用过程这样设计的原因 一 生成一个 NSMutableURLRequest NSMutableURLRequest *request [[AFHTTPRequestSerializer serializer] requestWithMethod:"GET&…

【三相太阳能光伏系统控制】在线性和非线性负载条件下模拟额定功率为33kW的三相并网光伏系统,提高电能质量研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C#,《小白学程序》第十三课:阶乘(Factorial)的计算方法与代码

1 文本格式 /// <summary> /// 阶乘的非递归算法 /// </summary> /// <param name"a"></param> /// <returns></returns> private int Factorial_Original(int a) { int r 1; for (int i a; i > 1; i--) { …

java八股文面试[数据库]——最左匹配原则

最佳左前缀法则 最佳左前缀法则: 如果创建的是联合索引,就要遵循该法则. 使用索引时&#xff0c;where后面的条件需要从索引的最左前列开始使用,并且不能跳过索引中的列使用。 最左匹配原则是什么&#xff1f; 简单来讲&#xff1a;在联合索引中&#xff0c;只有左边的字段被…

线上展厅可以用在哪些行业,线上展厅如何获取访客

引言&#xff1a; 随着数字化时代的到来&#xff0c;线上展厅成为了一种重要的营销工具&#xff0c;适用于多个行业&#xff0c;帮助他们吸引来自不同领域的潜在用户。 一&#xff0e;线上展厅在哪些行业有应用 1.零售行业 线上展厅为零售商提供了一个虚拟展示产品的平台&am…

ERROR 之 SpringMVC开发注解版之版本问题

如果你也和我一样&#xff0c;完全是按照狂神老师的代码来敲的&#xff0c;不用注解版的情况下是不会出错的&#xff0c;但是一用注解版&#xff0c;就出现了404&#xff0c;500的类型的错误。那我真诚的建议你换个jdk版本,再来试试。我试了3遍&#xff0c;事实证明用jdk1.8&am…

Springboot - 13.spring-boot-starter-security集成

&#x1f440;Spring Boot Starter Security 中文文档 Spring Security中文文档 &#x1f440;Spring Boot Starter Security 运行流程 当然可以。首先&#xff0c;我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Bo…