首页 - 信息 - Piziheng Embedded:使用Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页面编程执行时间分布

Piziheng Embedded:使用Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页面编程执行时间分布

2023-10-02 16:05

  大家好,我是皮子恒,一个认真科技的痞子。今天皮子恒给大家介绍i.MXRT系列FlexSPI驱动Flash页编程执行时间

  皮子衡之前《串行NOR Flash的页编程模式对于量产效率的影响》写过一篇文章,简单分析了NOR Flash的Page Program命令不同模式对整体量产时间的影响。文章只是从理论计算的角度进行了分析,假设Flash中所有Page的擦除和写入性能是一致的,但是每个Page的性能真的完全一样吗?今天我们就根据一个客户问题来讨论这个话题:

1。介绍客户问题

  最近,一位i.MXRT1170客户报告其应用程序中的IAP功能代码对于Flash擦除表现不稳定。他们的IAP代码是移植的\SDK_2.10.0_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer例程。 Flash使用与官方EVK相同的型号IS25WP128-JBLE。测试代码会对整个Flash进行16MB的循环擦除写入,反复测试,测试过程中发现部分区域速度较慢。缓慢的定义是,当写入部分256字节(一页)时,写入API返回很长时间(因为是轮询模式),但返回状态正确。

  由于客户没有进一步提供页面写入速度和慢速时间,皮子衡只能先瞎猜。由于write API返回状态正确,说明FlexSPI驱动可以正常工作。首先,消除板级硬件设计问题。那么就只剩下两种可能了: 1、FlexSPI软件驱动执行稳定性问题; 2. Flash本身Page性能一致性问题。这两个问题都可以通过观察所有Page的写入时间来进一步确认。关于第二种可能性,我们从Flash手册中可以得知,Page write命令的典型等待时间为0.2ms,最大值为0.8ms。不过这个说法并没有明确这是针对不同的Flash芯片还是针对不同的Flash芯片。对于同一 Flash 中的不同页面。

2。确定测量计划

  带着以上疑问,皮子衡决定在官方的MIMXRT1170-EVK上进行测试。我们只需要简单修改\SDK_2.10.0_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer例程,在flexspi_nor_polling_transfer中将计时代码添加到.c源文件中的main()函数中即可统计flexspi_nor_flash_page_program() 函数的执行时间。计时实现可以在 https://www.gsm-guard.net/JayHeng/microseconds 项目中使用。具体使用请参考文章《通用微秒(microseconds)计时函数框架设计与实现》。

//节省65536 Pages的写入API执行时间
uint16_t timeRes[65536];

int 主函数(无效)
{
    //省略原来的Flash初始化和擦除代码

    微秒_init();

#if !(已定义(XIP_EXTERNAL_FLASH))
    uint32_t 起始地址 = 0;
#别的
    uint32_t 起始地址 = 0x8000;
#万一
    uint32_t 结束地址 = 0x1000000;
    while (开始地址 < 结束地址)
    {
        // 计时开始
        uint64_t startTicks = microseconds_get_ticks();
        uint64_t endTicks = startTicks;
        uint64_t deltaTicks = 0;status_t status = flexspi_nor_flash_page_program(FLEXSPI1, startAddr, (void *)s_nor_program_buffer);
        if (状态== kStatus_Success)
        {
            // 定时器结束
            endTicks = microseconds_get_ticks();
            deltaTicks = endTicks - startTicks;
            uint16_t costMicroseconds = microseconds_convert_to_microseconds(deltaTicks);
            timeRes[startAddr / 256] = costMicroseconds;
        }
        起始地址 += 256;
    }

    for (uint32_t i = 0; i < sizeof(timeRes) /sizeof(uint16_t); i++)
    {
        PRINTF("%d\r\n", timeRes[i]);
    }
    
    而 (1)
    {
    }
}

3。选择串口波形显示软件

  在上一段代码中,我们通过串口打印出了所有Page的写入时间。现在我们需要一个串口波形显示软件来直观地看到65536次结果的差异。皮子衡尝试了几个软件:Serial Plot v0.12.0、Serial Chart V034、Serial Hunter V31,发现最全的是Serial Plot软件。推荐给大家:

  • Serial Plot软件源码:https://www.gsm-guard.net/hyOzd/serialplot
  • Serial Plot 软件安装包:https://www.gsm-guard.net/downloads/serialplot-0.12.0-win32-setup.exe

  Serial Plot软件最好的地方就是完全支持串口接收数据格式,可以是Binary(可设置单个通道的字节长度),也可以是ASCII码(可设置通道分隔符) ,也可以是自定义数据帧(帧头和帧格式可设置),通道数也可以任意设置,基本可以满足大部分串口波形显示需求。

4。测试结果分析

  准备就绪,给板卡上电,下载测试程序并运行,打开Serial Plot,设置串口接收参数并观察结果。我们发现波形显示是一条直线,即65536页。写入时间稳定。 ,都是271us(测试项目选择debug build)。这个结果推翻了我们之前的两个猜测。写入API的执行时间稳定,Flash各页的性能也一致。与客户进一步沟通后,客户反映是在ThreadX的LevelX中发现的,所以看来客户的问题与ThreadX系统调度有关。这是稍后要讨论的另一个话题。

  至此,皮子恒介绍完了i.MXRT系列FlexSPI驱动Flash页编程执行时间,掌声在哪~~~

欢迎订阅

文章将同时发布到我的博客园主页、CSDN主页、知乎主页、微信公众号平台。

微信搜索“痽子hengembedded”或扫描下方二维码即可在手机上立即观看。