搜索
bottom↓
回复: 28

难得小清闲6:2440-ucos-ucgui-fatfs显示gif-bmp-开启MMU就是爽!

  [复制链接]

出0入22汤圆

发表于 2012-7-27 16:40:31 | 显示全部楼层 |阅读模式
昨天刚把2440-ucos-ucgui-fatfs显示gif-bmp显示弄好,但是没开MMU和cache的显示效果慢入蜗牛!400M的频率刷屏跟比stm32还差劲,今天学习了一早上mmu的知识,下午就把mmu给加上了,那个效果果然不一样啊,原来没开mmu和cache如果比作蜗牛,那么开启之后那就如同飞机一样了

上代码

工程设置与先前的小清闲系列有点改变,具体是运行地址改为了0x30004000,前面4k用来存放mmu页表了,具体如下图:






总结:这次还是挺顺利的,早上肯理论,肯了半天没得其中奥妙,中午午睡了一下,一边睡一边思考,综合早上的试验的失败结果,想通了 ,下午一来就试验,立马成功!还是那句话,想不出就别死磕,先放松,保持头脑清醒才是最重要的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2012-7-30 00:00:35 来自手机 | 显示全部楼层
我来了。必须顶。

出0入0汤圆

发表于 2012-7-30 01:14:12 | 显示全部楼层
主要是SDRAM太慢了,所以要cache缓冲一下,速度就上来了

出0入0汤圆

发表于 2012-7-30 09:43:28 | 显示全部楼层
顶,佩服

出0入0汤圆

发表于 2012-8-13 18:52:56 | 显示全部楼层
正纠结为啥我的gui跑的这么慢呢,下来楼主的参考学习下,谢谢。

出0入4汤圆

发表于 2012-8-13 19:28:46 | 显示全部楼层
先乘火车再改乘飞机

出0入0汤圆

发表于 2013-6-4 12:29:28 | 显示全部楼层
这么好的帖子现在才看到

出0入0汤圆

发表于 2013-6-4 18:19:50 | 显示全部楼层
好东西,谢谢!

出0入0汤圆

发表于 2014-1-14 22:06:18 | 显示全部楼层
看着挺爽的,就是还不熟2440,硬是没在手里的mini2440开发板上跑起来,实在是业余啊,仰望楼主哈

出0入0汤圆

发表于 2014-2-11 16:46:04 | 显示全部楼层
有东西???

出0入8汤圆

发表于 2014-2-16 18:21:48 来自手机 | 显示全部楼层
好东西~以前用2440刷屏也很慢~还以为是uc

出0入8汤圆

发表于 2014-2-16 18:22:18 来自手机 | 显示全部楼层
好东西~多谢分享

出0入0汤圆

发表于 2014-2-22 00:33:17 | 显示全部楼层
楼主的学习精神值得发扬!

出0入0汤圆

发表于 2014-10-26 14:51:35 | 显示全部楼层
楼主你好,我最近也在学习这个2440的ucgui,移植成功了,但是显示的灰常慢,比STM32F1的还差劲。查看了您的帖子,发现是MMU和Cache没开导致的。
各种百度之后发现,Cache分为ICahce 和DCache,ICache可以单独使用,在开启Icache之后速度确实快了一点,但是我认为还不够,还能感觉到明显的刷屏现象,但是Dcache必须在MMU开启的时候才能使用,我也了解了一下MMU的原理,因为是Ucos+UCGUI不需要太大的内存,所以直接将虚拟地址一一对应的映射到物理地址上就可以了。
理论部分我只了解这么多,但是接下来怎么开启MMU的代码没有思路,我用的是JZ2440选择从NOR Flash(2MBytes)启动,你的例程里面的代码我复制过,好像不行,你知道哪些地方需要更改么?

出0入0汤圆

发表于 2014-10-26 16:11:36 | 显示全部楼层
好。。。。。。。。。。

出0入0汤圆

发表于 2014-10-26 16:12:31 | 显示全部楼层
但如果没有MMU怎么办

出870入263汤圆

发表于 2014-10-26 16:38:56 | 显示全部楼层
本帖最后由 armstrong 于 2014-10-26 16:40 编辑
enterpriseZ 发表于 2014-10-26 14:51
楼主你好,我最近也在学习这个2440的ucgui,移植成功了,但是显示的灰常慢,比STM32F1的还差劲。查看了您的 ...


你要做的,就是通过startup汇编代码,把整个应用程序拷贝到SDRAM,然后跳转到其入口去执行,然后建立转换表,开启MMU及ICache,DCache。当然,应用程序要按照最终的虚拟地址来编译定位。最方便的办法是建立转换表时,让SDRAM的虚拟地址和物理地址一致,这样就免去了地址切换时所需的技巧。

出0入0汤圆

发表于 2014-10-26 23:40:25 | 显示全部楼层
armstrong 发表于 2014-10-26 16:38
你要做的,就是通过startup汇编代码,把整个应用程序拷贝到SDRAM,然后跳转到其入口去执行,然后建立转换 ...

你好,很感谢你的回答,我现在不知道的是怎么让物理地址和虚拟地址一一对应。。。还有,程序需要拷贝到SDRAM里面运行么?运行速度会快一点么?我现在是在NOR Flash里面直接读取并运行的

出0入0汤圆

发表于 2014-10-27 08:38:34 | 显示全部楼层
感谢分享

出870入263汤圆

发表于 2014-10-27 08:40:44 | 显示全部楼层
enterpriseZ 发表于 2014-10-26 23:40
你好,很感谢你的回答,我现在不知道的是怎么让物理地址和虚拟地址一一对应。。。还有,程序需要拷贝到SD ...

SDRAM比NOR flash快不少。物理地址和虚拟地址的对应是通过MMU管理的,也就是一个16KB的数组而已,这叫一级页表或者叫粗页表。然后按照自己的需求填充这个数组,在通过MCR协处理器指令把这个数组提交给MMU单元,然后开启MMU即可。大致过程就是这样。
具体的知识必须你自己学习,否则就有急功近利的嫌疑了。你可以参考ARM官方参考指南,很多文档里有十分具体的MMU规范讲解。

出870入263汤圆

发表于 2014-10-27 08:43:35 | 显示全部楼层
粗页表16KB,每个条目4字节,因而有4KB个条目。每个条目管理1MB粒度的内存空间,因而4096个1MB就是4GB空间。

出0入0汤圆

发表于 2014-10-27 08:52:48 | 显示全部楼层
图片挺清晰

出0入0汤圆

发表于 2014-11-12 20:55:21 | 显示全部楼层
armstrong 发表于 2014-10-27 08:43
粗页表16KB,每个条目4字节,因而有4KB个条目。每个条目管理1MB粒度的内存空间,因而4096个1MB就是4GB空间 ...

跳转到其入口去执行
用什么汇编指令呀,
我用的,
LDR        PC,=0x30000000
可以不?

出870入263汤圆

发表于 2014-11-12 21:11:53 | 显示全部楼层
enterpriseZ 发表于 2014-11-12 20:55
跳转到其入口去执行
用什么汇编指令呀,
我用的,

如果你的app连接定位在0x30000000地址,是可以的。不过用C更方便啊:
void (*pEntry)(void) = (void(*)(void))0x30000000;
pEntry();

效果一样,但是不是看起来更直观?

出0入0汤圆

发表于 2014-11-12 21:42:56 | 显示全部楼层
真不错,俺弄明白scatter之后就一直卡在mmu这儿了,板子都吃了两个个月灰了~

出0入0汤圆

发表于 2014-11-13 14:43:52 | 显示全部楼层
armstrong 发表于 2014-11-12 21:11
如果你的app连接定位在0x30000000地址,是可以的。不过用C更方便啊:
void (*pEntry)(void) = (void(*)(v ...

LZ你好,之前跟您提到过,之前我的代码都是在NOR Flash里面直接读取并运行的,效率不高,比较慢。。。
按照您的建议,我准备将代码全部复制到SDRAM里面执行。
我准备将NOR Flash分成两部分,各1M的空间。0x00000000~0x00100000这1M的空间用来写Loader,0x00100000~0x00200000这1M的空间用来写用户代码,
然后上电之后使用Loader开始运行,

#define CODE_SIZE       0x00100000
#define FLASH_ADDR      0x00100000
#define RAM_ADDR        0x30000000

void (*App)(void)=(void (*)(void))(RAM_ADDR);

void main ( void )
    {
        unsigned int Num = 0;
        for ( Num = 0; Num < CODE_SIZE; Num += 4 )
        {
            (*( volatile unsigned int *)( RAM_ADDR + Num )) = (*( volatile unsigned int *)( FLASH_ADDR + Num ));
        }
            App();
    }

在代码复制过去之后,系统就死机了。。。不知道为什么
若是将用户代码直接烧写到Loader的位置,代码是可以正常运行的,我也通过仿真,看到了代码的内容确实已经复制到了SDRAM里面去了,可是不能执行,我也不知道是怎么回事

出0入0汤圆

发表于 2014-11-13 17:55:04 | 显示全部楼层
谢谢分享

出0入22汤圆

 楼主| 发表于 2014-11-13 18:31:09 | 显示全部楼层
enterpriseZ 发表于 2014-11-13 14:43
LZ你好,之前跟您提到过,之前我的代码都是在NOR Flash里面直接读取并运行的,效率不高,比较慢。。。
...

开mmu了么,用到中断了吗,中断向量表放到sdram了吗,app的scat文件设置成sdram了吗,你放到nor里面能跑app,说明的的app编译地址还设置在nor里面,这是不对的,要在sdram里面跑,加载地址就要像我一楼那样设置,设置成nor的地址你复制到sdram是跑不了的,除非你mmu映射了sdram和nor一样的地址

出870入263汤圆

发表于 2014-11-14 16:44:11 | 显示全部楼层
enterpriseZ 发表于 2014-11-13 14:43
LZ你好,之前跟您提到过,之前我的代码都是在NOR Flash里面直接读取并运行的,效率不高,比较慢。。。
...

首先你关注一下28楼说的意思,接着,你该弄明白自己链接而成的二进制镜像的运行时地址,你能在nor-flash里运行,说明你的代码连接在nor-flash地址空间,中断向量也映射到此空间的。
你现在要做的是,修改项目的链接地址,例如ro-base设置为0x30000000;然后将mmu的0x00000000首个1MB映射到0x30000000,这样就可以了。
要记住,运行地址是链接器决定的,还要让cpu知道中断向量的地址,这个通过mmu移花接木来实现。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 19:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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