大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170上PXP对CM7 TCM进行随机地址短小数据写入操作限制

  在 MCU 里能够对片内外映射的存储器进行读写操作的主设备(Master)除了常见的 Core 以及 DMA 外,其实还有一些面向高速数据传输(比如 USB、uSDHC、ENET 接口等)或其他特定功能(比如 GPU、LCD、Crypto 等)的外设,但就用户数据搬移处理而言,一般我们只借助 Core 和 DMA。

  在 i.MXRT 四位数上,还有一个叫 PXP 的外设,这本是一个面向像素数据处理的模块,但是它也能够完成一般数据搬移处理任务。当我们借助这个 PXP 来做数据搬移时,发现它在对 CM7 TCM 写入时有一些使用限制。今天我们就来聊聊这个话题:

一、PXP功能简介

  先来看一下 PXP 模块功能框图,既然是面向图像数据处理,那常见的图像缩放、色彩空间转换、图像旋转功能支持必不可少(即下图蓝框里的三个独立引擎被整合在 PXP 里),这些操作实际上都涉及到 FrameBuffer 像素数据处理(读改写) 。

  再进一步细读 PXP 特性,我们发现除了像素处理之外,它还是个标准的 2D DMA(这里 2D 的意思是为搬移二维图像数据而设计的),这就是我们所要的数据搬移特性。在用 PXP 做数据搬移操作时,当源 FrameBuffer 和目的 FrameBuffer 大小相同,且搬移目标尺寸就是 FrameBuffer 长度时,其就蜕变成了大家所熟悉的普通 DMA。

二、一个RT1170的Errata

  在我们实测 PXP 数据搬移功能时,我们先来看一个 RT1160/1170 上独有的 Errata,也正是因为这个 Errata 让痞子衡关注到了 PXP 的 2D DMA 功能。

  这个 Errata 提及到 RT1160/1170 里若干个具有存储器读写能力的主设备在对 CM7 TCM 进行 Sparse write(随机地址短小数据写入操作)时可能会导致数据出错,PXP 就是其一,解决方案就是 CM7 TCM 不要作为目的 FrameBuffer。

  • Note:列出来的有限制的主设备大多是 RT1170 里新增的外设(CAAM, ENET_1G, ENET_QOS, GC355, LCDIFv2),除了 PXP 是 RT10xx 上也存在的,但是 RT10xx PXP 并没有这个限制。

三、在PXP下实测数据搬移

  要实测 PXP 数据搬移功能可以直接借助 \SDK_2_16_000_MIMXRT1170-EVKB\boards\evkbmimxrt1170\driver_examples\pxp\copy_pic\cm7 例程,其主要函数 APP_CopyPicture() 摘录如下,代码清晰明了。我们要做不同的测试,只需要将 s_inputBuf、s_outputBuf 分别链接在不同存储器空间里,并且设置不同的拷贝块大小与坐标位置即可。

  • Note:仅需调整 COPY_WIDTH、DEST_OFFSET_X 值来测试对一维数据搬移影响(数据长度、起始地址对齐因素)
#include "fsl_pxp.h"
// 源/目标 Buffer 长宽设置(为测试方便,可设置成一样)
#define BUF_WIDTH 64
#define BUF_HEIGHT 64
// 拷贝块长宽及在目标 Buffer 坐标设置(从源 Buffer 坐标固定为 [0,0])
#define COPY_WIDTH 8
#define COPY_HEIGHT 8
#define DEST_OFFSET_X 1
#define DEST_OFFSET_Y 1 uint16_t s_inputBuf[BUF_HEIGHT][BUF_WIDTH];
uint16_t s_outputBuf[BUF_HEIGHT][BUF_WIDTH]; static void APP_CopyPicture(void)
{
pxp_pic_copy_config_t pxpCopyConfig;
// 设置拷贝参数(将s_inputBuf里坐标[0,0]开始的大小为8x8的数据拷贝到s_outputBuf里[1,1]位置处)
// 源 Buffer 地址与拷贝块坐标设置
pxpCopyConfig.srcPicBaseAddr = (uint32_t)s_inputBuf;
pxpCopyConfig.srcPitchBytes = sizeof(uint16_t) * BUF_WIDTH;
pxpCopyConfig.srcOffsetX = 0;
pxpCopyConfig.srcOffsetY = 0;
// 目的 Buffer 地址与拷贝块坐标设置
pxpCopyConfig.destPicBaseAddr = (uint32_t)s_outputBuf;
pxpCopyConfig.destPitchBytes = sizeof(uint16_t) * BUF_WIDTH;
pxpCopyConfig.destOffsetX = DEST_OFFSET_X;
pxpCopyConfig.destOffsetY = DEST_OFFSET_Y;
// 拷贝块大小设置(像素点格式为 RGB565 即 2bytes)
pxpCopyConfig.width = COPY_WIDTH;
pxpCopyConfig.height = COPY_HEIGHT;
pxpCopyConfig.pixelFormat = kPXP_AsPixelFormatRGB565;
// 启动拷贝(将拷贝块数据从源 Buffer 搬移到目的 Buffer)
PXP_StartPictureCopy(PXP, &pxpCopyConfig);
while (!(kPXP_CompleteFlag & PXP_GetStatusFlags(PXP)));
PXP_ClearStatusFlags(PXP, kPXP_CompleteFlag);
}

  经测试当 s_outputBuf 放在 OCRAM 或者外部 RAM 空间里时,搬移结果完全如预期。而当 s_outputBuf 放在 CM7 ITCM 或者 DTCM 时,则会出现异常结果,在 ITCM/DTCM 异常表现是一致的。

  设置不同的 COPY_WIDTH、DEST_OFFSET_X 值组合带来的异常结果不尽相同,这里仅放出一个 COPY_WIDTH = 1、DEST_OFFSET_X = 3 的情况供参考,可以看到除了目标地址数据之外,前后还会有一些额外数据被写入,这样的数据搬移操作显然不可靠了。

  当然并不是 s_outputBuf 放在 CM7 TCM 就一定能引起异常,只要拷贝的一维数据长度是 16bytes 整数倍,且目的起始地址以 8 对齐时,此时并无出错情况发生。不满足这个条件的写入我们即称之为有风险的 Sparse write(随机地址短小数据写入)。

  至此,i.MXRT1170上PXP对CM7 TCM进行随机地址短小数据写入操作限制痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:i.MXRT1170上PXP对CM7 TCM进行随机地址短小数据写入操作限制的更多相关文章

  1. 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...

  2. 痞子衡嵌入式:史上最强ARM Cortex-M学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M学习资源. 类别 资源 版本 短评 官方汇总 cortex-m-resources / ARM公司专家Josep ...

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

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

  4. 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...

  5. 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...

  6. 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...

  7. 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...

  8. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...

  9. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...

  10. 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...

随机推荐

  1. Java 动态编译工具 Janino 和 Liquor 差别

    如果你只要 Java7 及以下的语法支持,建议 Janino.如果要你想更全的 Java8.Java11.Java17.Java21 等语法,可以选 Liquor. 1.它们相同的地方 提供的相似的能 ...

  2. 【赵渝强老师】在Spark SQL中读取JSON文件

    Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.为什么要学习Spark SQL?如果大家了解Hive的话,应该 ...

  3. Failed to connect to github.com port 443: Connection refused问题解决

    解决办法: 1.找到github的ip地址:查找链接 2.找到本地的hosts文件.我的hosts文件路劲为:C:\Windows\System32\drivers\etc 3.在hosts文件最后添 ...

  4. 活动预告 | 中国数据库联盟(ACDU)中国行定档深圳,一起揭秘数据库前沿技术

    在当今数字化时代,数据库是各行各业中最核心的信息管理系统之一.随着技术的飞速发展,数据库领域也不断涌现出新的前沿技术和创新应用.数据库运维和开发人员需要紧跟前沿技术,才能保持竞争力,并实现更高效.更智 ...

  5. 2022年3月中国数据库排行榜:TiDB “三连降”仍霸榜首,“常胜四将军”得分集体下跌

    春暖花开好时光,三月一号迎榜来.2022年3月的 中国数据库流行度排行榜 已在墨天轮社区发布,本月共有 199个 数据库参与排名,相比上月新增四个数据库.排名前十的数据库得分均有所波动,整体排名变动略 ...

  6. query和params的区别

    2者都是编程式路由跳转用来存放传递数据的位置,query使用path引入,数据显示在地址栏上,params使用name引入,传递的数据在页面看不见 :

  7. 04 统计语言模型(n元语言模型)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  8. 牛逼!5K star! 推荐一款集监控和埋点于一体的前端性能监控工具!开源、简单易用、功能强大!

    在互联网的快速发展下,网站已成为企业和个人展示信息.提供服务的重要平台.然而,随之而来的网站性能问题也日益凸显,如加载速度慢.频繁出错.服务器故障.数据异常.网络攻击等.如何确保用户能够快速稳定地访问 ...

  9. Python实现火柴人的设计与实现

    1.引言 火柴人(Stick Figure)是一种极简风格的图形,通常由简单的线段和圆圈组成,却能生动地表达人物的姿态和动作.火柴人不仅广泛应用于动画.漫画和涂鸦中,还可以作为图形学.人工智能等领域的 ...

  10. 布局(LinearLayout,RelativeLayout,FrameLayout,TableLayout,GridLayout,ConstraintLayout)

    LinearLayout layout_gravity:组件在父容器里的对齐方式 gravity:组件包含的所有子元素的对齐方式 layout_weight:在原有基础上分配剩余空间,一般把layou ...