0
我有一個連接到cortex-A9 OMAP4板的相機。視頻V4L2幀在3.4內核分配有:緩存/未緩存的內存mmap:對Neon的影響
static int vb2_dc_mmap(void *buf_priv, struct vm_area_struct *vma)
{
struct vb2_dc_buf *buf = buf_priv;
if (!buf) {
printk(KERN_ERR "No buffer to map\n");
return -EINVAL;
}
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
return vb2_mmap_pfn_range(vma, buf->dma_addr, buf->size,
&vb2_common_vm_ops, &buf->handler);
}
我還測試:
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
我有一個複雜的後處理組件霓虹燈基於每個幀上運行的算法。它通過一個標準的用v412架構訪問幀:此優化算法的
mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, camera->fd, buf.m.offset);
性能如下:
x ms: user-space malloc allocation of a fake frame (reference)
10*x ms: kernel allocation with pgprot_noncached
4*x ms: kernel allocation with pgprot_writecombine
x ms: kernel allocation with no pgprot call
的問題是,如果我沒有做任何pgprot_ *,我有一些非常奇怪的噪音,又名。視頻中隨機選擇幾個黑色像素。當所有分配的內存範圍被訪問時,噪聲會在某些特定情況下消失。
最後,如果我簡單地使用原始pgprot_noncached分配內存時執行memcpy,那麼似乎沒有任何性能問題,但我無法負擔添加memcpy。
我該如何解決這種情況,又名。得到一個沒有任何噪音的內核內存分配,這和用戶空間malloc一樣好。
霓虹燈代碼用不同的增量來做很多vld1.u8和vst1.u8。