当前位置: 技术问答>linux和unix
dma可以替代memcpy吗
来源: 互联网 发布时间:2017-03-26
本文导语: 我的程序用双缓存绘图(直接操作framebuffer) 每次需要2次memcpy操作, 屏幕数据600k 每次执行memcpy经测试需要15ms, 这样2次就30ms 在考虑执行其他任务的情况下, 速度更低 硬件是OMAPL138 (arm926 ejs) dma不知道可不可以做到内...
我的程序用双缓存绘图(直接操作framebuffer)
每次需要2次memcpy操作, 屏幕数据600k
每次执行memcpy经测试需要15ms, 这样2次就30ms
在考虑执行其他任务的情况下, 速度更低
硬件是OMAPL138 (arm926 ejs)
dma不知道可不可以做到内存之间直接拷贝, 如果可以, 速度会提高多少?
还有最好有示例代码, 网上找的例子和linux内核的例子不是遍不过去就是无法执行
每次需要2次memcpy操作, 屏幕数据600k
每次执行memcpy经测试需要15ms, 这样2次就30ms
在考虑执行其他任务的情况下, 速度更低
硬件是OMAPL138 (arm926 ejs)
dma不知道可不可以做到内存之间直接拷贝, 如果可以, 速度会提高多少?
还有最好有示例代码, 网上找的例子和linux内核的例子不是遍不过去就是无法执行
|
在内核中调用EDMA的实例代码,平台DM6446
int edma3_memtomemcpy(struct edma_linux_params *params)
{
int result = 0;
int i;
unsigned int numenabled = 0;
struct paramentry_descriptor param_set;
unsigned int dma_ch;
unsigned int tcc = EDMA_TCC_ANY;
result = davinci_request_dma(EDMA_DMA_CHANNEL_ANY, "A-SYNC_DMA0",
edma_callback, NULL,
&dma_ch, &tcc, 0);
if (0 != result) {
DMA_PRINTK
("nedma3_memtomemcpytest_dma::davinci_request_dma failed for dma_ch, error:%dn",
result);
return result;
}
davinci_set_dma_src_params(dma_ch, (unsigned long)(params->src),
INCR, W8BIT);
davinci_set_dma_dest_params(dma_ch, (unsigned long)(params->dst),
INCR, W8BIT);
davinci_set_dma_src_index(dma_ch, params->srcbidx, params->srccidx);
davinci_set_dma_dest_index(dma_ch, params->dstbidx, params->dstcidx);
/* AB Sync Transfer Mode */
davinci_set_dma_transfer_params(dma_ch, params->acnt, params->bcnt, params->ccnt,
params->bcnt, ABSYNC);
/* Enable the Interrupts on Channel 1 */
davinci_get_dma_params(dma_ch, ¶m_set);
param_set.opt |= (1