大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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主页知乎主页微信公众号 平台上。

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

痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间的更多相关文章

  1. 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...

  2. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...

  3. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式. 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MO ...

  4. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...

  5. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...

  6. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(13)- 从Serial(1-bit SPI) EEPROM/NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial EEPROM/NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启 ...

  7. 痞子衡嵌入式:开源软件协议(MIT/BSD/Apache/LGPL/MPL/GPL)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是关于开源软件协议基本知识. 牛顿曾说过:"如果我比别人看得更远,那是因为我站在巨人的肩上".在软件开发中如果说也存在巨 ...

  8. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...

  9. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(8)- 从Serial(1-bit SPI) NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的1-bit SPI NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启动的 ...

随机推荐

  1. mysql更新数据时:当想mysql某插入有某字段设置了unique且和之前相同时,会报错,并停止运行

    这个在mysql5.7会报错: 如openid设为unique: 1062 - Duplicate entry 'oTfYq6PKne00IrcTqphmKqKnsahM' for key 'qx_w ...

  2. jquery获取一个元素符合条件的第一个父元素

    closest jQuery 1.3新增.从元素本身开始,逐级向上级元素匹配,并返回最先匹配的元素.. closest会首先检查当前元素是否匹配,如果匹配则直接返回元素本身.如果不匹配则向上查找父元素 ...

  3. ecshop 加入购物车和直接购买同时存在的方法

    一.首先将直接购买的链接设置为 <a href="javascript:bool =1;addToCart({$goods.goods_id})"> bool值为1,g ...

  4. Groovy系列(5)- Groovy IO操作

    IO操作 Groovy为I/O操作提供了许多帮助方法,虽然你可以在Groovy中用标准Java代码来实现I/O操作,不过Groovy提供了大量的方便的方式来操作File.Stream.Reader等等 ...

  5. svn的应用

    SVN 如何来进行多人协作开发? 在实际工作中,通常是一个小组或者一个团队一起开发同一个项目,不同的人开发不同的功能模块,有一个公共的地方存放项目代码. 如果多个人同时对同一个文件做了修改,比如按照分 ...

  6. struts2 使用ajax进行图片上传

    第一步:引入一个插件    jquery.form.js /*! * jQuery Form Plugin * version: 3.36.0-2013.06.16 * @requires jQuer ...

  7. 『Python』进程同步

    1. Lock(互斥锁) 是可用的最低级的同步指令.Lock处于锁定状态时,不被其他的线程拥有. from multiprocessing import Process, Value, Lock de ...

  8. 【k8s】使用k8s部署一个简单的nginx服务

    名词解释 Namespace 表示命名空间 Deployment 表示pod发布 Service 表示多个pod做为一组的集合对外通过服务的表示 kubectl 是k8s的命令行操作命令,可以创建和更 ...

  9. 学习使用SignalR

    1.创建空白的控制台程序 2.添加两个NuGet包(Microsoft.AspNet.SignalR.SelfHost.Microsoft.Owin.Cors.Topshelf)Topshelf用于快 ...

  10. redis学习笔记-02 list列表类型命令

    一.lpush key value1 value2 value3 value4(命令将一个或多个值插入到列表头部. 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作) lpush k1 ...