你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教STM32外挂SDRAM的读写冲突问题  

[复制链接]
tovax 提问时间:2018-2-28 11:53 /
主控为STM32F429BI,外挂32位SDRAM,请教一下:当移植了FreeRTOS和ucGUI后,在SDRAM中开辟一片存储区域作为显存,FreeRTOS的显示任务不断往SDRAM写入数据,而STM32的LTDC模块从SDRAM读出数据并传输到LCD上显示,这之间是不是有冲突呢?因为现在LCD屏幕有跳动现象,我是这么想的,显示任务不断的往SDRAM写入数据,必然触发SDRAM的写入时序,而LTDC在从SDRAM读取数据时必然触发读出时序,这两者之间如果没有互斥信号量处理的话,应该会导致时序异常。没有这方面的经验,不知道我的想法是否正确,还请过往的大侠指点迷津,从整体的概念上指点一下就行,谢谢了!
收藏 1 评论24 发布时间:2018-2-28 11:53

举报

24个回答
tovax 回答时间:2018-3-21 15:55:31
dsjsjf 发表于 2018-3-21 11:28
多个任务对同一个资源(SDRAM)的操作,需要用到互斥信号量

谢谢您的回复!
问题找到了:FMC读写数据这两个函数的问题
显示格式是RGB888的,于是在SDRAM里像素是24位的,与32位的AHB接口之间存在一个转换过程,来来回回的读写造成了“AHB总线冲突”,现在改成ARGB8888格式了,alpha填充0xFF就好了,这样读写像素的速度就提高了若干倍,目前显示"hello, world"和"毫秒表"都是没有问题的,目前是这样的状况,测试过程中发现问题的话我再回来补充。
再次感谢各位这些天的耐心交流!

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结贴奖励

查看全部评分

maxtch 回答时间:2018-2-28 17:09:52
如此操作冲突是必然的,而且同时存在两方面的冲突:内存带宽争夺和 SDRAM 页面访问争夺。

FMC 的每一个管脚都只有一定量的通信带宽。如果两个 DMA 都在访问同一块内存,这些访问就需要争抢通信带宽,发生冲突。

SDRAM 在读取的时候需要先打开页面,这个过程远远比 SDRAM 数据传输速率要慢得多,在 SDR SDRAM 上一般在 10-15 倍左右,DDR3 可以接近 20-30 倍,DDR4 直接 40 倍起跳。如果两个 DMA 所访问的内容不在同一页,那就需要不断地打开关闭页面,访问速度更慢。电脑显卡用的 GDDR SDRAM 最大的特点是支持同时打开两页,避免了这个瓶颈。

至于互斥信号量,bus matrix 是支持先来先服务排队和自动生成等待状态的,所以说一般用不到信号量,排队等数据即可。

你的这个使用场景之下,建议你考虑把程序数据放到 SDRAM 里面,使用片内 SRAM 来做 framebuffer。SRAM 本来就比 SDRAM 快,而且不会因为来回跳地址而大幅度减速。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

tovax 回答时间:2018-3-2 11:48:41
maxtch 发表于 2018-2-28 17:09
如此操作冲突是必然的,而且同时存在两方面的冲突:内存带宽争夺和 SDRAM 页面访问争夺。

FMC 的每一个管 ...

STM32一般的内部SRAM只有几百KB,用来做显示缓存怕是不够哦,这款STM32F429BI只有256KB的SRAM,以800*480的8寸屏(RGB888)计算,800 * 480 * 4就超出了SRAM的范围。
xmshao 回答时间:2018-3-2 14:30:31
写SDRAM 和 LTDC从SDRAM读数据要考虑互斥错开操作。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

maxtch 回答时间:2018-3-2 18:45:01
tovax 发表于 2018-3-2 11:48
STM32一般的内部SRAM只有几百KB,用来做显示缓存怕是不够哦,这款STM32F429BI只有256KB的SRAM,以800*480 ...

如果处理得当,大量的显示数据可以直接从 Flash 里面 DMA 出去。这样的话依然可以支持 800x480 但 SRAM 占用就不多了。
tovax 回答时间:2018-3-5 09:15:27
maxtch 发表于 2018-3-2 18:45
如果处理得当,大量的显示数据可以直接从 Flash 里面 DMA 出去。这样的话依然可以支持 800x480 但 SRAM  ...

从flash读出,然后在LCD上显示,这个是没有问题的,但是不断对flash进行写入操作是不现实的吧。
tovax 回答时间:2018-3-5 09:18:37
xmshao 发表于 2018-3-2 14:30
写SDRAM 和 LTDC从SDRAM读数据要考虑互斥错开操作。

我也是这么考虑的,移植的freertos和ucgui,我是这么想的:在ucgui的最底层描点函数和ltdc的dma传输结束之间互斥操作,这两天有点其他事情,过两天我试试,到时候还请多多指教。
maxtch 回答时间:2018-3-5 12:29:28
tovax 发表于 2018-3-5 09:15
从flash读出,然后在LCD上显示,这个是没有问题的,但是不断对flash进行写入操作是不现实的吧。 ...

把窗口分块处理:整个生命周期里面不动的内容放在 Flash 里面,需要运行时填充的数据放在 RAM 里面。
tovax 回答时间:2018-3-5 14:28:31
maxtch 发表于 2018-3-5 12:29
把窗口分块处理:整个生命周期里面不动的内容放在 Flash 里面,需要运行时填充的数据放在 RAM 里面。 ...

我这个案子的图形数据变化比较大,数据放在内部flash的比较困难,最终方案是外挂SDRAM和nand flash,在nand flash上做文件系统,存储比如图片,图表这样的文件,根据操作显示在lcd上。内部flash只有2MB,24位的位图也存不了几张。
maxtch 回答时间:2018-3-5 16:58:47
tovax 发表于 2018-3-5 14:28
我这个案子的图形数据变化比较大,数据放在内部flash的比较困难,最终方案是外挂SDRAM和nand flash,在na ...

如果是这样的话,那必须拿外挂 SDRAM 当 VRAM,就要考虑 DMA 互锁了。两边都是顺序访问的话,只要调度得当,一般不会卡顿的。另外可以考虑用一个定时器来控制帧速率,定时器设定成 60Hz,每次定时器触发先启动 LTDC 把画面更新了,然后跑业务逻辑更新界面内容,渲染到内存,把 LTDC 的内存打开,准备下一帧。

还有一种方法:换主控,譬如全志 V3s,譬如 NXP i.MX233。这些主控用的 DRAM 要比 STM32 的快一些(前者是片内自带 64MB LPDDR2,后者是外挂 DDR)而且有都专门的 2D 图形加速单元。V3s 的主频足有 1.2GHz 而 i.MX233 也能上至少 500MHz。这两个芯片都是设计拿来跑 Linux 的,图形体系可能还好开发一点,有现成的 Qt 和 Cairo 体系可以用,甚至可以用 Chrome OS 的体系设计来偷懒(系统启动直接就是全屏的网页浏览器打开 localhost,实际界面和功能完全用 HTML5 + CSS + JS 做,至于和硬件的交互就靠 CGI)

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版