野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 81771|回复: 73

infoNES 马里奥 大战 RT1052 PXP,PXP被SDRAM带宽卡住了喉咙,带视频,好刺激!

  [复制链接]
发表于 2018-6-2 12:36:06 | 显示全部楼层 |阅读模式
先上游戏效果视频,回复可见:  
野火i.MX RT1052 EVK Pro跑超级玛丽演示效果,帧率53帧  :


野火i.MX RT1052 EVK Pro跑超级玛丽大屏演示效果



1、什么PXP?在RT1052中PXP是用于在数据发送到LCD显示器或TV编码器之前的一个图像处理缓冲器。

     就是一个简易的2D图像加速器,在显示之前做一些简单操作,比如缩放,颜色域转换,旋转。
     通过集成多个模块,可以消除对外部存储器的中间缓冲操作,从而减少外部存储器带宽、功耗和软件控制的复杂性。      看起来性能相当不错,PXP框图如下所示:


      pxp_arch.jpg




2、之前一直没机会用到PXP,鉴于上面说到PXP的优点,这次移植InfoNES立马尝试PXP,是驴是马测试一番就知道结果,

     这次实验主要针对PXP缩放性能测试,InfoNES的移植过程在这里不做展开。
     实验平台:
     野火i.MX RT1052 EVK Pro开发板
     显示:
     5寸屏,分辨率为800x480

     10.1寸屏,分辨率为1280x800(LVDS接口)




3、 InfoNES的默认输出分辨率是256x224,格式为RGB565,因此液晶显示首选RGB565输出,避免不必要的转换,
      在SDRAM中开辟一个显存空间给液晶屏使用,这里使用AT_NONCACHEABLE_SECTION_ALIGN修饰即显存放在非cache的区域,
      双缓冲,APP_IMG_HEIGHT、APP_IMG_WIDTH分别是液晶屏的长和宽,FRAME_BUFFER_ALIGN缓冲帧对齐。
  1. AT_NONCACHEABLE_SECTION_ALIGN(static uint16_t s_psBufferLcd[2][APP_IMG_HEIGHT][APP_IMG_WIDTH], FRAME_BUFFER_ALIGN);
复制代码
     初始化液晶屏
  1. void APP_ELCDIF_Init(void)
  2. {
  3.             const elcdif_rgb_mode_config_t config = {
  4.         .panelWidth = APP_IMG_WIDTH,/*液晶参数设置*/
  5.         .panelHeight = APP_IMG_HEIGHT,
  6.         .hsw = APP_HSW,
  7.         .hfp = APP_HFP,
  8.         .hbp = APP_HBP,
  9.         .vsw = APP_VSW,
  10.         .vfp = APP_VFP,
  11.         .vbp = APP_VBP,
  12.         .polarityFlags = APP_POL_FLAGS,/*极性设置*/
  13.         .bufferAddr = (uint32_t)s_psBufferLcd[0],/*显存首地址*/
  14.         .pixelFormat = kELCDIF_PixelFormatRGB565,/*像素格式为RGB565*/
  15.         .dataBus = APP_LCDIF_DATA_BUS,/*液晶输出位宽为16bit*/
  16.     };

  17.     ELCDIF_RgbModeInit(APP_ELCDIF, &config);/*初始化液晶屏*/
  18.     ELCDIF_RgbModeStart(APP_ELCDIF);/*启动显示*/
  19. }
复制代码
     在内部OCRAM申请一个RAM空间作为PXP处理缓冲区,这里NES_DISP_HEIGHT,NES_DISP_WIDTH分别是显示NES的图像高度和宽度。
  1. static uint16_t s_psBufferPxp[NES_DISP_HEIGHT][NES_DISP_WIDTH] __attribute__ ((at(0x20200000)));
复制代码
     初始化PXP代码
  1. static void APP_InitPxp(void)
复制代码

4、缩放测试代码
  1. void NES_PIC_Scale(void)
  2. {
  3.                 static        int t0=0;
  4.                 static        int t1=0;

  5.                 int time;
  6.                 uint8_t curLcdBufferIdx = 1U;
  7.         
  8.                 /* 启动计时器 */
  9.                 t0=CPU_TS_TmrRd();        

  10.                 outputBufferConfig.buffer0Addr = (uint32_t)s_psBufferLcd[curLcdBufferIdx];
  11.                 /* 配置PXP输出缓冲区 */
  12.                 PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);
  13.                 /* 启动PXP传输,如果要循环启动必须要每次都重新启动 */
  14.                 PXP_Start(APP_PXP);
  15.                 /* 等待PXP处理完成 */
  16.                 while(!(kPXP_CompleteFlag & PXP_GetStatusFlags(APP_PXP)))
  17.                 {                        
  18.                 }        
  19.                 /* 清除PXP完成标志位 */
  20.                 PXP_ClearStatusFlags(APP_PXP, kPXP_CompleteFlag);
  21.                
  22.                 /* 停止计时器 */
  23.                 t1=CPU_TS_TmrRd();        
  24.                 /* 计算缩放一帧图像所耗费时间(单位us) */
  25.                 time        =(t1-t0)/528;
  26.                 PRINTF("PXP Scale Time=%d us\r\n",time);

  27.                 /* 新一帧已经准备好传递给LCDIF. */
  28.                 ELCDIF_SetNextBufferAddr(APP_ELCDIF, (uint32_t)s_psBufferLcd[curLcdBufferIdx]);

  29.                 /* 切换LCD另一个缓冲区 */
  30.                 curLcdBufferIdx ^= 1U;
  31. }
复制代码

5、代码全部放在ITCM,DATA放在DTCM
  1. #define m_flash_config_start           0x60000000
  2. #define m_flash_config_size            0x00001000

  3. #define m_ivt_start                    0x60001000
  4. #define m_ivt_size                     0x00001000

  5. #define m_interrupts_start             0x60002000
  6. #define m_interrupts_size              0x00000400

  7. #define m_text_start                   0x60002400
  8. #define m_text_size                    0x03FFDC00

  9. #define m_text1_start                  0x00000400
  10. #define m_text1_size                   0x0001FC00//ITCM 127KB

  11. #define m_data_start                   0x20000000
  12. #define m_data_size                    0x00020000//DTCM 128KB

  13. #define m_ncache_start                 0x81000000
  14. #define m_ncache_size                  0x01000000


  15. /* Sizes */
  16. #if (defined(__stack_size__))
  17.   #define Stack_Size                   __stack_size__
  18. #else
  19.   #define Stack_Size                   0x0400
  20. #endif

  21. #if (defined(__heap_size__))
  22.   #define Heap_Size                    __heap_size__
  23. #else
  24.   #define Heap_Size                    0x15000
  25. #endif

  26. LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
  27.         RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
  28.         * (.boot_hdr.conf, +FIRST)
  29.         }
  30. }
  31. LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
  32.         RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
  33.         * (.boot_hdr.ivt, +FIRST)
  34.         * (.boot_hdr.boot_data)
  35.         * (.boot_hdr.dcd_data)
  36.         }
  37. }
  38. LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
  39.   VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
  40.     * (RESET,+FIRST)
  41.   }
  42.   ER_m_text m_text_start m_text_size { ; load address = execution address
  43.     * (InRoot$Sections)
  44.     startup_mimxrt1052.o(+RO)
  45.                 system_mimxrt1052.o(+RO)
  46.   }
  47.   ER_m_text1 m_text1_start m_text1_size { ; load address = execution address
  48.     .ANY (+RO)
  49.   }        
  50.   RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
  51.     .ANY (+RW +ZI)
  52.     *(m_usb_dma_init_data)
  53.     *(m_usb_dma_noninit_data)
  54.   }
  55.   ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
  56.   }
  57.   ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
  58.   }
  59.   RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
  60.     * (NonCacheable.init)
  61.     * (NonCacheable)
  62.   }
  63. }
复制代码

6、测试结果
     A、5寸液晶屏全屏显示,分辨率800x480,SDRAM工作在163.8MHz,耗时为10.49ms,图像刷新率53帧/秒(不显示图像,PXP缩放耗时为9.04ms)
     B、10.1寸液晶屏全屏显示,分辨率1280x800,SDRAM工作在163.8MHz,耗时为28.93ms,图像刷新率26帧/秒  (不显示图像,PXP缩放耗时为24.491ms)

    代码在QSPI flash运行时测试结果如下:
     C、5寸液晶屏全屏显示,分辨率800x480,SDRAM工作在163.8MHz,耗时为10.53ms,图像刷新率53帧/秒
     D、10.1寸液晶屏全屏显示,分辨率1280x800,SDRAM工作在163.8MHz,耗时为29.01ms,图像刷新率26帧/秒  

7、以上测试结果显示代码在QSPI执行与否对PXP硬件加速是没有影响,PXP的主要瓶颈在于SDRAM的带宽,实际应用选择800x480比较合适,效果相当不错。















回复

使用道具 举报

发表于 2018-6-2 14:04:44 | 显示全部楼层
cool               
以上测试结果显示代码在QSPI执行与否对PXP硬件加速是没有影响,PXP的主要瓶颈在于SDRAM的带宽,实际应用选择800x480比较合适,效果相当不错,帧率达到完美的53帧。      
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:06:35 | 显示全部楼层
看看游戏的效果
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:14:55 | 显示全部楼层
看一看   
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:16:45 | 显示全部楼层
回复

使用道具 举报

发表于 2018-6-2 14:18:26 | 显示全部楼层
流啤。。。不可思议啊
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:19:37 | 显示全部楼层
看一看效果
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:47:35 | 显示全部楼层
谢谢分享         
回复 支持 反对

使用道具 举报

发表于 2018-6-2 15:10:08 | 显示全部楼层
期待,看看是什么效果
回复 支持 反对

使用道具 举报

发表于 2018-6-2 15:21:04 | 显示全部楼层
好像很牛X,看看学习一下
回复 支持 反对

使用道具 举报

发表于 2018-6-2 18:19:09 来自手机 | 显示全部楼层
就是直接用这个涵数更新新的中断涵数,它会先把中断项量表复制到ram
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 20:09:36 | 显示全部楼层
继续优化,5寸液晶屏全屏显示,最高可以达到77帧,10.1寸液晶屏全屏显示,最高可以达到30帧。
回复 支持 反对

使用道具 举报

发表于 2018-6-2 20:19:43 | 显示全部楼层
:):):):):):):):):):):):):):):):):):):):):):):):)
回复 支持 反对

使用道具 举报

发表于 2018-6-2 23:54:45 来自手机 | 显示全部楼层
test test
回复

使用道具 举报

发表于 2018-6-3 06:36:46 | 显示全部楼层
好像很牛X,看看学习一下!
回复 支持 反对

使用道具 举报

发表于 2018-6-3 08:17:51 | 显示全部楼层
看看~~~~~~~~~~
回复

使用道具 举报

发表于 2018-6-3 11:01:26 | 显示全部楼层
adsadadasdasdasd
回复 支持 反对

使用道具 举报

发表于 2018-6-3 11:08:17 | 显示全部楼层
牛X,看看凑个热闹
回复 支持 反对

使用道具 举报

发表于 2018-6-3 11:31:16 | 显示全部楼层
流啤!观摩观摩
回复 支持 反对

使用道具 举报

发表于 2018-6-3 11:34:35 | 显示全部楼层
666666666666666
回复 支持 反对

使用道具 举报

发表于 2018-6-3 13:47:02 | 显示全部楼层
牛x牛x,学习学习
回复 支持 反对

使用道具 举报

发表于 2018-6-3 19:40:39 | 显示全部楼层
什么PXP?在RT1052中PXP是用于在数据发送到LCD显示器或TV编码器之前的一个图像处理缓冲器。
回复 支持 反对

使用道具 举报

发表于 2018-6-3 20:56:45 | 显示全部楼层
很牛X哦
回复

使用道具 举报

发表于 2018-6-4 08:15:07 | 显示全部楼层
强势围观大佬
回复 支持 反对

使用道具 举报

发表于 2018-6-4 09:24:03 | 显示全部楼层
厉害,过来学习一下大姥对RT105X PXP的调戏,啊呸,调校
回复 支持 反对

使用道具 举报

发表于 2018-6-4 13:40:12 | 显示全部楼层
看一看效果~
回复 支持 反对

使用道具 举报

发表于 2018-6-5 09:05:43 | 显示全部楼层
继续想跟着学习
回复 支持 反对

使用道具 举报

发表于 2018-6-5 09:30:12 | 显示全部楼层
图像刷新很厉害,PXP是个厉害干将
回复 支持 反对

使用道具 举报

发表于 2018-6-5 11:13:51 | 显示全部楼层
先围观,看看是什么样子
回复 支持 反对

使用道具 举报

发表于 2018-6-5 14:27:01 | 显示全部楼层
谢谢楼主,学习一下
回复 支持 反对

使用道具 举报

发表于 2018-6-5 15:23:35 | 显示全部楼层
回复看看!!!!!!!!!
回复

使用道具 举报

发表于 2018-6-5 15:39:49 | 显示全部楼层
牛逼大了啊
回复 支持 反对

使用道具 举报

发表于 2018-6-5 19:28:54 | 显示全部楼层
牛逼大了啊
回复 支持 反对

使用道具 举报

发表于 2018-6-5 19:29:09 | 显示全部楼层
紧跟大神脚步,生怕掉队
回复 支持 反对

使用道具 举报

发表于 2018-6-5 19:29:23 | 显示全部楼层
很吊很吊。
回复

使用道具 举报

发表于 2018-6-6 13:51:28 | 显示全部楼层
就看看效果。
回复 支持 反对

使用道具 举报

发表于 2018-6-6 16:46:44 | 显示全部楼层
看起来很爽的样子
回复 支持 反对

使用道具 举报

发表于 2018-6-6 16:58:59 | 显示全部楼层
看看。。。。
回复

使用道具 举报

发表于 2018-6-6 17:34:21 | 显示全部楼层
cool,看看   
回复 支持 反对

使用道具 举报

发表于 2018-6-7 08:10:27 来自手机 | 显示全部楼层
约一下。学习
回复 支持 反对

使用道具 举报

发表于 2018-6-7 08:13:09 来自手机 | 显示全部楼层
书要不要无所谓,我只在乎这是什么软件开发的?界面不错啊♂♂
回复 支持 反对

使用道具 举报

发表于 2018-6-7 08:33:00 来自手机 | 显示全部楼层
13年开始接触野火,那时候在学校一片迷茫,不知道学什么,尝试了好多东西都没学会!偶然的机会,看到了火哥的视频,就跟着看了下去,发现他讲的跟老师讲的完全不一样,通俗易懂,书也写的很详细,不是单纯的单子手册!就找了块stm32板子,一步步的看完了视频,做完了几个实验。后来就凭借stm32找了个实习的工作,一直到现在,都是靠stm32吃饭!感谢火哥
回复 支持 反对

使用道具 举报

发表于 2018-6-7 09:19:27 | 显示全部楼层
支持支持
回复

使用道具 举报

发表于 2018-6-7 09:33:18 | 显示全部楼层
在农村,小时候就没玩过这马里奥,怎么搞出来玩个痛快。。。
回复 支持 反对

使用道具 举报

发表于 2018-6-7 10:54:44 | 显示全部楼层
顶贴支持
回复

使用道具 举报

发表于 2018-6-7 12:43:14 | 显示全部楼层
看看是啥????
回复

使用道具 举报

发表于 2018-6-7 16:04:09 | 显示全部楼层
看看!!!!!!!!!!!!
回复

使用道具 举报

发表于 2018-6-9 17:18:15 | 显示全部楼层
厉害 看看。。。。。。。。。。。。。
回复

使用道具 举报

发表于 2018-6-9 22:32:57 | 显示全部楼层
看一看效果                                         
回复 支持 反对

使用道具 举报

发表于 2018-6-10 00:16:51 | 显示全部楼层
cool....................
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-30 11:06 , Processed in 0.044983 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表