欢迎访问www.allbetgaming.com!

首页科技正文

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响

admin2020-04-1127

  人人好,我是痞子衡,是正经搞手艺的痞子。今天痞子衡给人人分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功效

  ECC是“Error Correcting Code”的简写,ECC能够实现错误检查和纠正,含有ECC功效的内存一样平常称为ECC内存,使用了ECC内存的系统在稳定性和可靠性上获得很大提升。相比前几代不带ECC的i.MXRT10xx型号,新一代i.MXRT1170在ECC上做了周全武装,从eFuse到FlexRAM,从OCRAM到外部存储空间全都加上了ECC功效。如下表所示,差别类型的存储由差别的ECC控制器来守护:

  今天痞子衡就先给人人简朴先容一下i.MXRT1170上Cortex-M7内核下的FlexRAM ECC功效:

一、FlexRAM ECC功效简介

1.1 FlexRAM v2特点

  i.MXRT1170上的FlexRAM模块是v2版本,相比i.MXRT10xx上的FlexRAM v1版本,主要就是增添了ECC功效。关于FlexRAM v1基本功效,建议你先阅读痞子衡之前写过的文章 《恩智浦i.MX RT1xxx系列MCU外设那些事(2)- 百变星君FlexRAM》,痞子衡今天主要聊v2新增的功效。
  我们知道i.MXRT1170是Cortex-M7和Cortex-M4双核架构,我们看下它的CM7内核系统框图,FlexRAM本质上是为CM7内核设计的,由于其治理的TCM空间仅能由CM7接见的,不外若是将FlexRAM也分配出一部门给OCRAM,这部门OCRAM(即文章开头memory map内外从0x20360000最先的空间)实在CM4也能正常接见。
  在框图中你还会发现,FlexRAM中物理SRAM总巨细是640KB,不是我们知道的可自由设置的512KB,这是由于需要分外128KB RAM来存放ECC校验值,关于这个细节在下一节里展开聊。

1.2 关于ECC设计细节

  关于ECC,人人最早接触的应该是ONFI Raw NAND上的应用,NAND Flash由于其物理特征的缘故原由(允许坏块的存在),必须要包罗ECC功效,痞子衡写过的一篇文章 《并行NAND接口尺度(ONFI)及SLC Raw NAND简介》, 内里的 2.6 Raw NAND坏块与ECC 简朴先容了ECC在Raw NAND上的应用。
  在Raw NAND上,通常是每写入512bytes数据计算出一个ECC校验值(4bytes),读取时也是读完所有512bytes数据后举行ECC校验,ECC校验能力一样平常用 (n+1) bit检错,n bit纠错 来表达,即这512bytes数据里若是发生n+1 bit及以下的错误时能够检查出来,若是发生n bit及以下的错误时,能够自动纠正。好比典型的Micron MT29F4G08就是5-bit检错,4-bit纠错。
  然则FlexRAM本质上是RAM,跟Flash(尤其是NAND)读写机制不一样,RAM是随机地址按Byte读写,NAND是以Page为单元顺序读写,以是NAND上ECC实现机制不适用于RAM。那么FlexRAM到底接纳的是什么样的ECC设计呢?

1.2.1 ECC检验能力

  好了,不卖关子了,宣布谜底。FlexRAM中每4ytes(针对DTCM)或8bytes(针对ITCM/OCRAM)数据就会计算出一个ECC校验值(7/8bits),ECC校验值都被放在了ECC RAM里。由于校验数据块支解得很小,以是此时不需要提供多bit纠错能力,FlexRAM接纳的是最经典的Single-bit Error Correction and Dual-bit Error Detection(SEC-DED,汉明校验码)。关于SEC-DED,你可以去Linux内核里看其在NAND上应用的源码实现 nand_ecc.c,写得异常经典。

存储类型 ECC校验数据块巨细 ECC校验值长度 ECC校验能力
Raw NAND 512 bytes 4 bytes 5-bit检错,4-bit纠错
FlexRAM 4/8 bytes 7/8 bits 2-bit检错,1-bit纠错
1.2.2 ECC RAM分配

  128KB ECC RAM并不是只能用来存储ECC校验值的,其也可以当做通俗OCRAM来使用,ECC RAM详细功效是凭据当前FlexRAM分配以及ECC是否开启而定的。eFuse里默认的512KB FlexRAM设置是256KB ITCM, 256KB DTCM, 没有OCRAM。
  在默认FlexRAM设置情形下,若是TCM ECC没有开启,那么128KB ECC RAM所有都是通俗OCRAM,其地址空间如下表所示:

  在默认FlexRAM设置情形下,若是TCM ECC已经开启,那么128KB ECC RAM所有都用来存储ECC校验值,这个区域仅能由FlexRAM模块内部接见,用户无法接见这128KB区域(不在memory map空间里),究竟ECC校验值不能被随便改。

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第1张

  若是我们在eFuse或者IOMUXC_GPR寄存器里将FlexRAM设置改掉,分配出一部门给OCRAM(好比256KB TCM, 256KB OCRAM),那这128KB ECC RAM功效分配就稍微庞大一些了。最简朴的情形是TCM和OCRAM ECC都没有开启,那么这128KB ECC RAM照样通俗OCRAM,map地址是紧跟在FlexRAM OCRAM后面的,如下表所示:

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第2张

  若是TCM和OCRAM ECC都开启了,那么这128KB ECC RAM就照样所有用来存储ECC校验值了,用户无法接见。

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第3张

  若是OCRAM ECC没有开启,不管TCM ECC是否开启,这128KB ECC RAM中本用于存储OCRAM ECC的区域都将被划分为通俗OCRAM,另一部门用于存储TCM ECC的区域(无论是否真的要存储ECC校验值)用户则无法接见。区域划分比例与OCRAM在总FlexRAM巨细中占比保持一致,好比512KB FlexRAM(一共16个bank,每个bank 32KB)划分出了256KB OCRAM,那么128KB ECC RAM(也是16个bank,每个bank 8KB)则划出了64KB作为通俗OCRAM,如下表所示:

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第4张
1.2.3 ECC错误触发处置

  ECC错误分两种,划分是1-bit错误和2-bit错误。从软件层面来看,1-bit错误可以不用管,FlexRAM模块会自动纠错。我们主要处置2-bit错误,由于2-bit错误仅能检错,无法纠错,以是发生了这个错误,就意味着读取的数据不能靠了,需要抛弃并重新写一次(抛弃之前可以再retry read一次看是否照样报错)。
  关于ECC错误处置,可凭据如下FlexRAM寄存器来操作,首先固然是在INT_SIG_EN寄存器中使能multi-bit ECC Error,当有2-bit错误发生时,系统会触发FLEXRAM_IRQn(中止号是50),在中止处置程序里找到响应的ECC_MULTI_ERROR_ADDR,对这个地址重新写一次初始化数据(按ECC校验块长度一次性写入),最后消灭INT_STATUS寄存器里的响应状态位。
  需要注重的是,上述处置流程仅对FlexRAM中存放的是通俗营业数据且发生ECC错误时有用,若是ECC错误发生在要害代码段或变量段中,这个处置是不适用的,由于这种ECC错误可能会造成程序溃逃。

Offset Register
10h Interrupt Status Register (INT_STATUS)
14h Interrupt Status Enable Register (INT_STAT_EN)
18h Interrupt Enable Register (INT_SIG_EN)
30h OCRAM multi-bit ECC Error Address Register (OCRAM_ECC_MULTI_ERROR_ADDR)
50h ITCM multi-bit ECC Error Address Register (ITCM_ECC_MULTI_ERROR_ADDR)
6Ch D0TCM multi-bit ECC Error Address Register (D0TCM_ECC_MULTI_ERROR_ADDR)
84h D1TCM multi-bit ECC Error Address Register (D1TCM_ECC_MULTI_ERROR_ADDR)

二、开启FlexRAM ECC的步骤

  FlexRAM ECC需要根据尺度步骤去开启,需要稀奇注重的是开启ECC操作的代码不能放在待开启ECC的FlexRAM空间里(好比TCM ECC要开启,那么开启ECC操作的代码不能使用任何TCM空间),因此不管是XIP照样Non-XIP应用程序,最好是用一个二级loader(这个loader可以链接在牢固OCRAM1/2空间里,或者XIP)来完成ECC开启操作然后再加载应用程序执行。痞子衡给了如下示例loader代码工程,代码里主要有四个步骤:

参考代码:https://github.com/JayHeng/cortex-m-apps/blob/master/apps/coremark_imxrt1176/loader/loader.c

2.1 使能TCM的RMW(可选)

  若是需要开启TCM ECC,那么首先需要在CM7内核寄存器里开启TCM RMW(Read-Modify-Write)功效,这是ARM的划定,可在 Cortex-M7 Technical RM 手册里找到相关信息如下。手册里明确写了RMW位同时也控制了外部逻辑(即MCU厂商的设计)来支持ECC功效。

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第5张

  操作函数代码如下:

void enable_cm7_tcm_rmw(void)
{
    SCB->ITCMCR |= SCB_ITCMCR_RMW_Msk;
    SCB->DTCMCR |= SCB_DTCMCR_RMW_Msk;
}

2.2 使能FlexRAM的ECC

  现在需要开启FlexRAM ECC,在i.MXRT1170参考手册里的FlexRAM章节可以找到FLEXRAM_CTRL寄存器界说,其中bit5和bit4就是用来划分控制TCM和OCRAM的ECC开关。

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第6张

  操作函数代码如下:

void enable_flexram_tcm_ecc(void)
{
    *(uint32_t *)(FLEXRAM_BASE + 0x108) |= (1u << 5);
}

void enable_flexram_ocram_ecc(void)
{
    *(uint32_t *)(FLEXRAM_BASE + 0x108) |= (1u << 4);
}

2.3 初始化FlexRAM的ECC值

  FlexRAM ECC开启了之后,此时还不能随机接见FlexRAM,由于初始ECC校验值还没有填充,若是这时候去读FlexRAM会发生错误。我们首先需要将会用到的FlexRAM空间所有初始化一遍(就是以ECC校验数据块巨细对齐方式从头至尾写入一遍,写入内容不限,正常用全0)。
  操作函数代码如下:

#define ITCM_START   0x00000000
#define ITCM_SIZE    (256*1024U)  //只是示例长度,凭据实际情形修改
#define DTCM_START   0x20000000
#define DTCM_SIZE    (256*1024U)  //只是示例长度,凭据实际情形修改
#define OCRAM_START  0x20360000
#define OCRAM_SIZE   (256*1024U)  //只是示例长度,凭据实际情形修改

void init_flexram_itcm_ecc(void)
{
    for (uint32_t i = 0; i < ITCM_SIZE; i += sizeof(uint64_t))
    {
        *(uint64_t *)(ITCM_START + i) = 0;
    }
}

void init_flexram_dtcm_ecc(void)
{
    for (uint32_t i = 0; i < DTCM_SIZE; i += sizeof(uint32_t))
    {
        *(uint32_t *)(DTCM_START + i) = 0;
    }
}

void init_flexram_ocram_ecc(void)
{
    for (uint32_t i = 0; i < OCRAM_SIZE; i += sizeof(uint64_t))
    {
        *(uint64_t *)(OCRAM_START + i) = 0;
    }
}

2.4 加载应用程序执行

  当FlexRAM初始ECC校验值已经被填充之后,此时便可以正常随机读写FlexRAM了。若是此时加载的是一个在ITCM里执行而且data段在DTCM里的应用程序,可以参考痞子衡前面给出的示例loader工程。
  这是loader工程完整主函数代码,其中memcpy那一句代码里的app_code是应用程序binary数组(用Python剧本将应用程序工程天生的.bin文件转换成C语言数组放到loader工程源文件里)。

#define APP_START 0U

int main(void)
{
    enable_cm7_tcm_ecc();
    enable_flexram_tcm_ecc();
    init_flexram_itcm_ecc();
    init_flexram_dtcm_ecc();

    // Copy image to RAM.
    memcpy((void *)APP_START, app_code, APP_LEN);
    
    uint32_t appStack = *(uint32_t *)(APP_START);
    uint32_t appEntry = *(uint32_t *)(APP_START + 4);

    // Turn off interrupts.
    __disable_irq();

    // Set the VTOR to default.
    SCB->VTOR = APP_START;

    // Memory barriers for good measure.
    __ISB();
    __DSB();

    // Set main stack pointer and process stack pointer.
    __set_MSP(appStack);
    __set_PSP(appStack);

    // Jump to app entry point, does not return.
    void (*entry)(void) = (void (*)(void))appEntry;
    entry();
}

三、ECC对内存接见性能的影响

  FlexRAM开了ECC后,接见性能会有一定降低,究竟数据接见中插入了分外的ECC校验事情,不外这个影响异常小,由于一次ECC校验仅增添1-2个机械cycle。下面是FlexRAM分配出的差别存储类型的基本情形,其中OCRAM可以被L1 Cache加速,以是从应用程序角度开ECC对其接见性能影响就更小了,我们主要讨论ECC对TCM性能的影响。

FlexRAM分配类型 ECC校验数据块巨细 总线类型 接见速率 L1 Cache加速
ITCM 8 bytes ITCM_ITF 64-bits 与CM7同频
DTCM 4 bytes DTCM_ITF 2x32-bit 与CM7同频
OCRAM 8 bytes AXI64 与CM7频率的1/4

  为了简化测试,痞子衡就用经典的benchmark程序(Coremark和Dhrystone)来测试ECC对TCM的影响,测试工程如下:

Coremark工程:https://github.com/JayHeng/cortex-m-apps/tree/master/apps/coremark_imxrt1176/loader
Dhrystone工程:https://github.com/JayHeng/cortex-m-apps/tree/master/apps/dhrystone_imxrt1176/loader

  需要稀奇提醒的是,我们知道i.MXRT1170 CM7内核最高可以设置到1GHz,然则开了TCM ECC后,为了保证接见可靠性,此时CM7内核最好是事情在800MHz,下面的benchmark效果也是在800MHz主频下获得的:

Benchmark类型 TCM ECC开关 Benchmark效果
coremark 关闭 Total ticks : 2023600
Total time (secs): 20.236000
Iterations/Sec : 3953.350465
Iterations : 80000
CoreMark 1.0 : 3953.350465
coremark 开启 Total ticks : 2023657
Total time (secs): 20.236570
Iterations/Sec : 3953.239111
Iterations : 80000
CoreMark 1.0 : 3953.239111
dhrystone 关闭 Dhrystones per Second: 3622138.51
DMIPS: 2061.5472
DMIPS/MHz: 2.0698
dhrystone 开启 Dhrystones per Second: 3621977.04
DMIPS: 2061.4553
DMIPS/MHz: 2.0697

  从benchmark效果来看,ECC是否开启对性能影响稀奇小,可以忽略,固然benchmark测试并不是稀奇精确地反映了性能影响,底下有空痞子衡会再专门用memcpy函数来测试性能影响。

  至此,恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功效痞子衡便先容完毕了,掌声在那里~~~

迎接订阅

文章会同时公布到我的 博客园主页、CSDN主页、微信民众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

长治天气预报:痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功效特点、开启步骤、性能影响 第7张

,

Sunbet

Sunbet www.hzjdjfls.com Sunbet是Sunbet的官方网站。Sunbt官网有你喜欢的Sunbet、申博APP下载、Sunbet最新网址、Sunbet管理网最新网址等。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.jswx10086.com/post/674.html

网友评论

最新评论

  • Allbet注册 09/23 说:

    欧博手机版下载欢迎进入欧博手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。高大上的感觉

  • Allbet注册 09/23 说:

    欧博手机版下载欢迎进入欧博手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。高大上的感觉

  • 联博统计接口 09/23 说:

    欧博allbet注册欢迎进入欧博allbet注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。每个人都应该看

  • Allbet手机版下载 09/22 说:

    欧博亚洲欢迎进入欧博亚洲(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。大家还记得我不

  • 环球UG充值 09/22 说:

    欧博电脑版下载欢迎进入博电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。只想说:都给我看!

  • 联博开奖网 09/22 说:

    环球UG欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。比打游戏有意思

  • UG环球手机版下载 09/21 说:

    联博开奖网www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。走一波走心评论

  • 欧博在线 09/21 说:

    欧博手机版欢迎进入欧博手机版(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。别忘了更啊