测试代码如程序清单 1.1所示:app
程序清单 1.1工具
#include <stdio.h>测试
int main (int argc, char **argv)spa
{命令行
sleep(2);debug
volatile int *a = (int *)0x40; //设置物理地址内存
printf("value = %x\n",*a); //读取物理地址中的值源码
*a = 0x12; //设置物理地址中的值it
return (0);io
}
在mini2440模拟器上的运行结果如图 2.1所示:
图 2.1模拟器运行结果
标号4处表示内存访问错误类型,这里是can not write,意思就是系统执行了一个写内存的操做,可是这个内存地址是不容许写的,从而引发内存错误
本测试程序是用debug模式编译所得,将测试程序和sylixos-objdump工具拷贝到同一个目录下,如图 3.1所示:
图 3.1拷贝测试程序和反汇编工具
在空白处按住shift并右击,选择"在此处打开命令窗口",如图 3.2所示:
图 3.2打开命令窗口
在打开的命令行中输入:arm-sylixos-eabi-objdump.exe -S -d 2440_test_app >app.dis,在同一目录下将生成一个app.dis反汇编文件,如图 3.3所示:
图 3.3生成反汇编文件
由以前分析得知,测试程序的加载地址=0x60030000,引发错误的那条指令在内存中的地址=0x600302ec。因此能够计算出引发错误的那条指令在内存中的偏移为0x600302ec-0x60030000=0x2ec。这个地址就是引发错误的那条指令在反汇编文件的汇编地址,如图 4.1所示:
图 4.1查看反汇编文件
能够看出0x2ec汇编地址处对应的是一条写内存指令,对应的c语句是"*a = 0x12",这就是源码中出错的地方。经过这个测试也发现了SylixOS下的一个有意思的地方,那就是非法地址能够读,可是不能写。