2744|1

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急!求教使用VirtualAlloc/VirtualCopy用于DMA传输遇到的问题 [复制链接]

    大家好,我是WinCE新手,现在三星2451平台下开发WinCE下的摄像头模块。三星2451的CAMIF要求开辟四个ping-pong memory用于一副图像的最终保存,而对于诸如2048*1536这样高分辨率的图像,因为Sensor输出是RGB888 24-bit格式的,而2451的CAMIF对于RGB888格式一个像素要求4 bytes存储,因此按照三星CAMIF的要求需要2048*1536*4 Bytes*4 Frame = 48MB内存空间,我的开发板上有两块64MB的RAM芯片,在没有为摄像头模块驱动申请内存之前总共有近75MB的剩余空间(这是通过WinCE“控制面板->系统->内存”看到的),其中一块64 MB芯片应该完全是空的(因为最初我的开发板上只有64 MB物理内存,后来是因为摄像头和其他模块需要才另外添加的64MB RAM,而在后来添加这块64MB内存之前,抛开摄像头模块整个系统也是正常运行的),所以我觉得单就内存来说应该是完全够2048*1536高分辨率图像需要的。
    但是实际情况却不是这样,我在camera.c驱动程序中,使用HalAllocateCommonBuffer申请内存却总是只能申请到12MB左右(只够2048*1536这样高分辨率图像的一帧),如果将三星CAMIF的四个ping-pong memory全部指向这一帧的物理地址,最终只要拍照时稍微一点抖动,图像必然出现严重的叠加——这个现象也是和三星CAMIF使用四个ping-pong memory的机制相对应的。

    后来,我在微软的官方技术支持页面上看到了《如何使用 DMA 设备配置用于 Windows CE》一文(http://support.microsoft.com/kb/299355/zh-cn),和我的实际情况完全对应,于是我完全按照该文的描述来做

1、首先我在系统的oemaddrtab_cfg.inc文件中看到如下的配置:
DCD     0x80000000, 0x30000000, 64      ; 64 MB DRAM BANK 6
DCD     0x84000000, 0x38000000, 64      ; 64 MB DRAM BANK 7 add by ww for 128MB MEMORY

于是我修改config.bib中的内容如下:

MEMORY
#define        CHAIN_ADDRESS        804FF000
#define        CHAIN_LENGTH        00001000
XIPKERNEL          80200000    00300000        RAMIMAGE
NK          80500000    03A00000        NANDIMAGE
CHAIN          $(CHAIN_ADDRESS)        $(CHAIN_LENGTH)        RESERVED
RAM          80500000    03B00000        RAM

;  Ralphsage added
CAMERA_DMA 84000000  03000000  RESERVED ——这是我添加的

FLASH                92000000                00100000        RESERVED

2、然后我在camera.c驱动程序中申请内存的地方使用如下的语句段:

void *pSrc = (void *)0x84000000;
unsigned int dwSize = 0x3000000; // 48 MB

pVirtCodecAddr = (PBYTE)VirtualAlloc(0, dwSize, MEM_RESERVE, PAGE_READWRITE);
if( pVirtCodecAddr == NULL )
{
   RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Codec, and the lasterror is %d\r\n"), GetLastError()));
}
else
{
RETAILMSG(TRUE, (TEXT("the pVirtCodecAddr is 0x%x.\r\n"),pVirtCodecAddr));

bRetCode = VirtualCopy((PVOID) pVirtCodecAddr, (PVOID)(0x84000000/256), dwSize, PAGE_READWRITE | PAGE_PHYSICAL);

if( bRetCode == FALSE )
RETAILMSG(TRUE, (TEXT("Camera: VirtualCopy() - Failed to VirtualCopy DMA buffer for Codec, and the lasterror is %d\r\n"), GetLastError()));

}


3、可是我重新运行系统的结果却是在VirtualAlloc就出错了,返回信息如下:
Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Codec, and the lasterror is 8
我查文档error 8意味着“存储空间不足,无法处理此命令”
可是我明明在config.bib中预留了空间的啊
CAMERA_DMA 84000000  03000000  RESERVED
而且这还只是reserved的嘛

4、随后我又尝试过,在config.bib中不添加
CAMERA_DMA 84000000  03000000  RESERVED
而是将原来的RAM          80500000    03B00000        RAM 修改为
RAM          80500000    07B00000        RAM

可是运行的结果仍然是Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Codec, and the lasterror is 8


小弟在此虚心向各位xdjm请教了,我上面哪里弄错了,还是其他什么原因呢?先谢过大家了~~~

最新回复

各位师兄师弟,真的希望你们能够帮帮我啊,现在这个问题已经卡在这里了,我们这边的人对WinCE的内存管理都不熟悉,我在网上找了好久也没有找到解决的办法,求求你们了  详情 回复 发表于 2009-8-27 15:59
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
各位师兄师弟,真的希望你们能够帮帮我啊,现在这个问题已经卡在这里了,我们这边的人对WinCE的内存管理都不熟悉,我在网上找了好久也没有找到解决的办法,求求你们了
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表