magicwe 发表于 2015-10-19 21:10:06

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

atmel的ARM9芯片内核速度号称400M,但是程序是在外部的SDRAM里跑的,我看了一下资料sdram的操作频率在100M,
我的程序跑起来后,能真正达到400M吗

zouzhichao 发表于 2015-10-19 21:39:27

有个东西叫cathe

javenreal 发表于 2015-10-19 21:43:06

cache.........

magicwe 发表于 2015-10-19 21:50:09

明白了
我现在操作TFT显示,24BIT的颜色,每次都贴图都要经过两个FOR循环,然后每次取一个字节赋值,赋三次。
准备一张要贴的图片大约需要20多ms,除了降低色彩还有什么别的招没?

magicwe 发表于 2015-10-19 21:51:24

有没有什么算法上的提示,背景色是渐变色,要贴的图片是白底黑字

zouzhichao 发表于 2015-10-19 22:03:06

贴代码吧!!!

dr2001 发表于 2015-10-20 08:01:10

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

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

长风万里 发表于 2015-10-20 08:49:23

可以分频到133M,也可以为100M

modbus 发表于 2015-10-20 09:09:25

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

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

magicwe 发表于 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 & LCDC_BASECFG4_DMA)
    {
      pTD->addr = (uint32_t)pBuffer;
      pTD->ctrl = LCDC_BASECTRL_DFETCH;
      pTD->next = (uint32_t)pTD;
      pDmaR = (uint32_t)pTD;
      pEnR = 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 |= LCDC_BASECFG4_DMA;
    }
    /* Enable & Update */
    /* 5. Enable the relevant channel by writing one to the CHEN field of the
          CHXCHER register. */
    pEnR = LCDC_BASECHER_UPDATEEN | LCDC_BASECHER_CHEN;

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

}

magicwe 发表于 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;                //显示缓冲区;
                  }
       
                }

magicwe 发表于 2015-10-20 21:50:35

然后就是两个FOR语句执行的时间超长,计算了一下,大约20ms(开启了两个中断一个100us,一个2ms,还有串口接收和发送中断)


本想配置32bit,但是一直配置不好,显示图片能显示出来,但是颜色不是全绿就是全红,没辙了
页: [1]
查看完整版本: ATMEL的ARM9,外部挂sdram能跑多快,高手进来看看