搜索
bottom↓
回复: 11

ATMEL的ARM9,外部挂sdram能跑多快,高手进来看看

[复制链接]

出0入0汤圆

发表于 2015-10-19 21:10:06 | 显示全部楼层 |阅读模式
atmel的ARM9芯片内核速度号称400M,但是程序是在外部的SDRAM里跑的,我看了一下资料sdram的操作频率在100M,
我的程序跑起来后,能真正达到400M吗

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出10入23汤圆

发表于 2015-10-19 21:39:27 来自手机 | 显示全部楼层
有个东西叫cathe

出0入0汤圆

发表于 2015-10-19 21:43:06 来自手机 | 显示全部楼层
cache.........

出0入0汤圆

 楼主| 发表于 2015-10-19 21:50:09 | 显示全部楼层
明白了
我现在操作TFT显示,24BIT的颜色,每次都贴图都要经过两个FOR循环,然后每次取一个字节赋值,赋三次。
准备一张要贴的图片大约需要20多ms,除了降低色彩还有什么别的招没?

出0入0汤圆

 楼主| 发表于 2015-10-19 21:51:24 | 显示全部楼层
有没有什么算法上的提示,背景色是渐变色,要贴的图片是白底黑字

出10入23汤圆

发表于 2015-10-19 22:03:06 来自手机 | 显示全部楼层
贴代码吧!!!

出0入0汤圆

发表于 2015-10-20 08:01:10 | 显示全部楼层
1、精确的说,如果代码没有局部性,比如循环,局部函数重复调用,等等,那么当外部总线带宽小于取指带宽时,肯定会存在等待周期。
假定完全顺序执行的代码,全部ARM指令,那么400MHz的ARM9 Core需要1.6GBytes/s的取指带宽。存储器带宽不足就没办法。
如果有代码局部性,Cache提供充分的带宽,此时可以满速。

2、贴图看具体操作需求,从什么地方获得原始数据?写到什么地方?有没有带宽瓶颈,etc。
如果没有带宽瓶颈,最快的方法是CPU和DMA同时操作,能接近吃光总线带宽。

出0入0汤圆

发表于 2015-10-20 08:49:23 | 显示全部楼层
可以分频到133M,也可以为100M

出0入0汤圆

发表于 2015-10-20 09:09:25 | 显示全部楼层
magicwe 发表于 2015-10-19 21:50
明白了
我现在操作TFT显示,24BIT的颜色,每次都贴图都要经过两个FOR循环,然后每次取一个字节赋值,赋三次 ...

多大的图片需要20ms?图片可以考虑用32位存储,这样每次取32位

出0入0汤圆

 楼主| 发表于 2015-10-20 21:40:39 | 显示全部楼层
我贴的这个代码,还是搞过at91sam的人才能看的明白吧

set_framebuffer(LCDD_BASE,lcd_buff+0x36);//lcd_buff+0x36);//首先开启DMA功能

//=========================================================
void set_framebuffer( uint8_t bLayer,void* pBuffer){
    sLayer            *pLD   = pLayer(bLayer);
   
    sLCDCDescriptor   *pTD   = &pLD->dmaD;  
    volatile uint32_t *pEnR  = pEnableReg(bLayer);
    volatile uint32_t *pDmaR = pHeadReg(bLayer);
    volatile uint32_t *pStrR = pStrideReg(bLayer);
    volatile uint32_t *pBlR  = pBlenderReg(bLayer);
    volatile uint32_t *pCfgR = pCfgReg(bLayer);
    /** DMA is running, just add new descriptor to queue */
    if (pBlR[0] & LCDC_BASECFG4_DMA)
    {
        pTD->addr = (uint32_t)pBuffer;
        pTD->ctrl = LCDC_BASECTRL_DFETCH;
        pTD->next = (uint32_t)pTD;
        pDmaR[0] = (uint32_t)pTD;
        pEnR[0] = LCDC_BASECHER_A2QEN;
    }
    else
    {
        /* 2. Write the channel descriptor (DSCR) structure in the system memory by
              writing DSCR.CHXADDR Frame base address, DSCR.CHXCTRL channel control
              and DSCR.CHXNEXT next descriptor location.        
           3. If more than one descriptor is expected, the DFETCH field of
              DSCR.CHXCTRL is set to one to enable the descriptor fetch operation.      
           4. Write the DSCR.CHXNEXT register with the address location of the
              descriptor structure and set DFETCH field of the DSCR.CHXCTRL register
              to one. */
        LCDD_SetDMA(pBuffer, pTD, (uint32_t)pDmaR);
    }

    /* Enable DMA */
    if (pBuffer)
    {
        pBlR[0] |= LCDC_BASECFG4_DMA;
    }
    /* Enable & Update */
    /* 5. Enable the relevant channel by writing one to the CHEN field of the
          CHXCHER register. */
    pEnR[0] = LCDC_BASECHER_UPDATEEN | LCDC_BASECHER_CHEN;

    /* 6. An interrupt may be raised if unmasked when the descriptor has been
          loaded.  */
    pLD->pBuffer = pBuffer;

}

出0入0汤圆

 楼主| 发表于 2015-10-20 21:47:24 | 显示全部楼层
然后每次把我的小图片像背景图上贴‘
  for(j=0;j<part_hig;j++)                //小图片的高
{
                 ppartdis=pt_partdis+(pos_y+j)*3;//显示缓冲区的指针位置
                 ppartbg=pt_partbg+816*j;//小图片的指针位置
               
                  for(i=0;i<part_wid;i++) //小图片的宽
                  {
       
                                if ( *(ppart) <= 0x70 )//黑色背景直接扔掉
                                        psource=ppartbg;
                                else
                                        psource=ppart;


                    *(ppartdis +0) =*(psource+0);//24bit的 1像素第一个字节
                    *(ppartdis +1) =*(psource+1);//24bit的 1像素第二个字节
                    *(ppartdis +2) =*(psource+2);//24bit的 1像素第三个字节       
                    
                    ppartbg+=3;                                        //背景图片,
                    ppart+=3;                                                //显示图片
                    ppartdis+=1440;                //显示缓冲区;
                  }
       
                }

出0入0汤圆

 楼主| 发表于 2015-10-20 21:50:35 | 显示全部楼层
然后就是两个FOR语句执行的时间超长,计算了一下,大约20ms(开启了两个中断一个100us,一个2ms,还有串口接收和发送中断)


本想配置32bit,但是一直配置不好,显示图片能显示出来,但是颜色不是全绿就是全红,没辙了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 05:27

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

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