Windows CE外部设备虚拟地址映射问题
开发平台:ARM + S3C2440
外设驱动:SM501 图形显示芯片(带二维图形加速功能,暂时没用到)
遇到的问题:通过KITL调试,返回的信息提示DATA ABORT。以为是显示缓存设的太小,在注册表中更改缓存的大小为8M,并在config.bib中添加此部分声明。仍然提示上述错误。
着手驱动程序(添加驱动程序的时候根本没有看源代码,只是将生成的dll文件添加进去,汗!!!)
发现里面虚拟地址和实际的物理地址对应有问题。
原因是这样的:比如501的MMIO_BASE+60寄存器为Device ID,高4位为设备ID号,这个ID号在我调试硬件的时候已经确定了,是正确的,和手册上一样为0x501。
而程序中得到的结果不对。
源程序如下:
pss->m_pREG = (unsigned char *)VirtualAddress(pss->m_nREGPhysical, pss->RegMemorySize());
RETAILMSG(1, (TEXT("m_pREG = 0x%08X 0x%08X\r\n"), pss->m_pREG, *(volatile unsigned long *)(pss->m_pREG + 0x60)));
其中pss->m_nREGPhysical为寄存器段物理起始地址,由注册表获得。
输出的结果为:
m_pREG = 0x44300000 0x23E00FF2
外设驱动:SM501 图形显示芯片(带二维图形加速功能,暂时没用到)
遇到的问题:通过KITL调试,返回的信息提示DATA ABORT。以为是显示缓存设的太小,在注册表中更改缓存的大小为8M,并在config.bib中添加此部分声明。仍然提示上述错误。
着手驱动程序(添加驱动程序的时候根本没有看源代码,只是将生成的dll文件添加进去,汗!!!)
发现里面虚拟地址和实际的物理地址对应有问题。
原因是这样的:比如501的MMIO_BASE+60寄存器为Device ID,高4位为设备ID号,这个ID号在我调试硬件的时候已经确定了,是正确的,和手册上一样为0x501。
而程序中得到的结果不对。
源程序如下:
pss->m_pREG = (unsigned char *)VirtualAddress(pss->m_nREGPhysical, pss->RegMemorySize());
RETAILMSG(1, (TEXT("m_pREG = 0x%08X 0x%08X\r\n"), pss->m_pREG, *(volatile unsigned long *)(pss->m_pREG + 0x60)));
其中pss->m_nREGPhysical为寄存器段物理起始地址,由注册表获得。
输出的结果为:
m_pREG = 0x44300000 0x23E00FF2
...全文
相关推荐
嵌入式WinCE平台下的频谱数据传输控制
WinCE操作系统在嵌入式系统中的应用WinCE(Windows CE)是一种紧凑型、模块化的实时操作系统,广泛应用于嵌入式系统。它支持多任务,提供优先级调度,并采用保护模式。
s3c2410中文手册
**内存管理单元(MMU)**:支持虚拟地址映射,为多任务操作系统提供支持。3. **中断控制器**:管理各种外设的中断请求,确保系统的实时响应。### 三、外设接口1.
Windows CE下操作GPIO的方法(以ARM S3C2410为例)
#### 二、GPIO 在 Windows CE 中的工作原理在 ARM 架构的平台上,如 S3C2410,GPIO 的实际物理地址被映射到了系统的虚拟地址空间。
Windows CE下操作GPIO的方法(以ARM9 S3C2410为例)
值得注意的是,尽管Windows CE系统允许用户态程序直接调用`VirtualAlloc`和`VirtualCopy`,但在更安全的设计中,这些操作通常应该在内核模式下的驱动程序中执行,以避免潜在的权限问题和系统稳定性风险
MMU一、二级映射表
然后,MMU使用虚拟地址中的中间位段来索引二级映射表,最终找到具体的物理地址。#### 4. 实际应用案例分析以Windows CE系统为例,其采用了ARM9系列处理器,并且内置了MMU支持。


