痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间分布...


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间

  痞子衡之前写过一篇文章 《串行NOR Flash的页编程模式对于量产效率的影响》,简要分析了 NOR Flash 的 Page Program 命令不同模式对于整体量产时间的影响,文章仅从理论计算角度做了分析,假定了 Flash 中所有 Page 擦写表现都是一致的,但是每个 Page 的表现真的是完全一致吗?今天我们从一个客户问题出发来探讨下这个话题:

一、引入客户问题

  最近有一个 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 字节(一个 Page)写入时,写入 API 返回时间较长(因为是轮询模式),但是返回状态是正确的。

  由于客户并没有进一步给出 Page 写入快慢时间分别是多少,痞子衡只能先盲猜。既然写入 API 返回状态是正确的,那说明 FlexSPI 驱动是能正常工作的,先排除板级硬件设计问题。那么只剩下两种可能:一、FlexSPI 软件驱动执行稳定性问题;二、Flash 本身 Page 表现一致性问题。这两个问题都可以通过观察统计全部 Page 的写入时间来进一步确认。对于第二个可能性,从 Flash 手册里我们可以得知 Page 写入命令的等待时间典型值是 0.2ms,最大值是 0.8ms,但这个表述并没有明确这是针对不同 Flash 芯片而言,还是针对同一 Flash 内不同 Page 而言。

二、确定测量方案

  带着上述疑问,痞子衡决定在官方 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://github.com/JayHeng/microseconds 项目,具体用法参考 《通用微秒(microseconds)计时函数框架设计与实现》 一文。

// 保存 65536 个 Page 的写入 API 执行时间
uint16_t timeRes[65536];

int main(void)
{
    // 省略原 Flash 初始化、擦除代码

    microseconds_init();

#if !(defined(XIP_EXTERNAL_FLASH))
    uint32_t startAddr = 0;
#else
    uint32_t startAddr = 0x8000;
#endif
    uint32_t endAddr = 0x1000000;
    while (startAddr < endAddr)
    {
        // 计时开始
        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 (status == kStatus_Success)
        {
            // 计时结束
            endTicks = microseconds_get_ticks();
            deltaTicks = endTicks - startTicks;
            uint16_t costMicroseconds = microseconds_convert_to_microseconds(deltaTicks);
            timeRes[startAddr / 256] = costMicroseconds;
        }
        startAddr += 256;
    }

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

三、选一款串口波形显示软件

  上一节代码中,我们把所有 Page 的写入时间都通过串口打印了出来,现在需要一款串口波形显示软件,来直观地看这 65536 个时间结果的差异。痞子衡试用了好几款软件:Serial Plot v0.12.0、Serial Chart V034、Serial Hunter V31,发现做得最完善的是 Serial Plot 软件,推荐给大家:

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

四、测试结果分析

  准备就绪,给板卡通上电,将测试程序下载进去跑起来,打开 Serial Plot 设置好串口接收参数后观测结果,我们发现波形显示是一条直线,即 65536 个 Page 写入时间是稳定的,都是 271us(测试工程选择的是 debug build),这个结果推翻了我们之前的两个猜测,写入 API 执行时间是稳定的,Flash 的各 Page 表现也是一致的。后来跟客户进一步沟通,客户反馈他们是在 ThreadX 的 LevelX 中发现的,所以看起来客户问题和 ThreadX 系统调度有关,那就是另外一个话题了,以后再展开。

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

欢迎订阅

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SerialPlot接受3种不同类型的数据输入: *简单的二进制流,支持不同的数字格式(无符号/有符号 - 8/16/32位和浮点数) * CSV格式的ASCII数据 *用户定义的自定义帧格式(帧开始字节,帧大小,校验和等)。 您可以拍摄当前视图的快照并将其存储在CSV文件中。您也可以从CSV文件加载它们,方便查看。 用户也可以通过点击定义“命令”发送到串口设备。命令可以用HEX或ASCII格式定义。 SerialPlot v0.10.0发布 哈桑YavuzÖzderya • 09/03/ 2017在15:19 • 0评论 SerialPlot 0.10发布。此版本带来了一些性能改进,次要功能和错误修复。 现在,您可以设置2个选项,而不是“样本数”选项卡中的“样本数”选项。“缓冲区大小”和“绘图宽度”。“缓冲区大小”是保存在内存中的样本总数,“绘图宽度”是在X轴上一次绘制的最大样本数。要查看以前的样本,只需使用X轴滚动条。这个区别的主要原因是表现。以前,您无法将样本数量设置得太高,因为SerialPlot试图一次绘制所有数据。现在您可以将“缓冲区大小”设置为1.000.000,只要保持“绘图宽度”较小,很可能就可以了。另一个好处是,有时当你频繁地更改数据时,缩放出路并不意味着太多,您也可以在X轴上保持一定的缩放级别,以便能够看到任何细节。如果你喜欢旧的行为,你总是可以设置缓冲区大小选项相同的数量作为绘图宽度,它应该没事。请记住,虽然“绘图宽度”选项有一个较小的限制,然后“缓冲区大小”出于性能的原因。一张纸条; 性能改进没有完成。我仍在进行一些改进,以增加“缓冲区大小”限制。 现在您可以设置RS232控制信号(DTR,RTS),并从“端口”选项卡查看输入信号()状态。能够设置DTR信号是一个要求的功能,以便SerialPlot可以与Arduino Leanardo板一起使用。 我们现在也有一个更新检查器。您可以从“帮助”菜单启动它。除非您禁用了SerialPlot,否则每天会检查一次更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痞子衡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值