我是在做WDM驱动时,为了验证DM642的DSP端究竟有没有写入相应的数据,编写了一个这样的程序,用CCS环境Load到仿真器里去遍历 ,并由此推断主机端为DM642分配的虚拟地址空间和DM642的物理地址空间之间的映射关系。
贴出这个程序并不是说这个程序有多么高深,而是提供一个思路,因为很多朋友在工作或学习中遇到类似的问题往往想不起来编这么个小程序就能解决问题。
类似的代码当然也可以用于遍历主机的一块内存,甚至主机的整个编程空间。鉴于这属于极基础极Easy的代码,高手请跳过,不要浪费时间。如有遗漏或错误,请大家指正。
代码如下:
#include <std.h>
#include <stdio.h>
#define BASE (unsigned int *)0x00000000 //遍历内存块的起始地址
#define END (unsigned int *)0x00040000 //遍历内存块的结束地址,我只遍历4M空间
Void main()
{
unsigned int *addr;
BOOL flag = 0;
printf("This project is used to test memory address!/n");
addr = BASE; //赋值为起始地址
while(addr<END && flag == 0) //在没遍历完并且没找到指定data的条件下循环
{
if(*addr == 0x88888888) //比对数据
{
flag = 1; //表示找到指定数据
break; //跳出循环
}
else
addr += 100; //以100个子单元为单位递增,当然可以自己选择步进尺寸,我是用0x88888888写了一块100字的空间,所以步进100字单元
printf("Addr:0x%8x,Data:0x%8x/n",addr,*addr);//为了调试时看到遍历进度
}
if(flag == 1)//找到数据
{
printf("Found!/n");
printf("Addr:0x%8x,Data:0x%8x/n",addr,*addr);
}
else//没找到数据
{
printf("There is not such a data!/n");
}
exit(0);
}
这个程序我在CCS中编译并执行通过。
当然,如果指定的一个数据可能分散在不同的地址上,而我们想把所有这样的内存地址找到的话,就在比对成功的时候,不要急着跳出循环,而只是输出找到的地址后,继续循环下去就行了。
--------------
§ 李文凯 2008年04月05日 §
§ 作于WHHIT之IMLAB §
--------------