转载_MDK调试时出现MEMORY MISMATCH错误的原因及解决方法

时间:2022-08-10 10:58:27

一、问题
    在用RealView MDK + ULink仿真器进行调试时,有些情况下会提示Memory Mismatch错误。但出现这种错误的情况并不多。有时同一个程序,在不同时间调试可能有时候会出现这个错误,有时却没有这个错误。似乎有一定的偶然和随机性。

二、原因
    看似有随机性,其实有深层的原因。首先说明一下,MDK调试方式有两种,即在RAM中调试和在Flash中调试。在RAM中调试时需要将可执行程序下载到RAM中,在Flash中调试时需要将可执行程序烧写到Flash中,为了方便描述暂时将前面的调试方法称为第一种调试方法,将后面的调试方法称为第二种调试方法。在默认设置下,在开始调试时CPU会重启并会检验下载的存储空间的内容。即采用第一种调试方法会检查RAM中的内容,采用第二种调试方法会检查Flash中的内容。
    采用第一种调试方法时出现这种错误的原因有两种:其一,如果链接脚本给出了一个错误的地址空间,比如AT91SAM7S512/256/128/64/321/32/161/16的片上SRAM开始地址为0x200000,如果用户误写为0x300000,那么调试开始之时会从地址0x300000检查下载内容,而地址0x300000是没接任何存储芯片的,所以得到的是一个错误的值,会提示Memory Mismatch的错误。 其二,有些芯片的SRAM需要初始化才能正常使用,在调试时如果没有使用初始化脚本,也可能导致Memory Mismatch错误。
    采用第二种调试方法时,出现这种错误的原因也有两种:其一,没有使用初始化脚本,即使Flash中内容烧写完全正确,当Flash没有完全使能时(比如有些与Falsh相关的寄存器还未配置),这时检测Flash内容会得到一个错误的结果。其二,使用了错误的地址空间。

三、解决办法
    我们主要遇到这种问题首先检测地址空间是否有错,在地址空是正确的情况下,还存在这个问题的有效解决办法有两种:
1、打开对话框Project->Options->Debug->ULINK Settings。将Verify Code Download前面的勾去掉。去掉之后,不管第一种调试方法还是第二种调试方法均不会检查下载的内容。如下图,当然使用这种方法的前提是您确定生成的执行代码已正确下载。

转载_MDK调试时出现MEMORY MISMATCH错误的原因及解决方法

图一  将选项Verify Code Download前面的勾去掉

2、使用初始化文件(INI文件),初始化文件的内容一般和您的软件中初始化RAM、Flash的代码类似,功能主是初始化RAM、Flash和时钟等。在使用初始化文件时需要做以下设置:打开对话框Project->Options->Debug,去掉选项Load Application at Startup前面的勾。然后在Initialization选项中选择初始化文件,现举个初始化Flash的例子,如下图:

转载_MDK调试时出现MEMORY MISMATCH错误的原因及解决方法

图二  使用初始化文件

附:初始化文件示例
// Switching from Slow Clock to Main Oscillator for faster Download
_WDWORD(0xFFFFFC20, 0x00000601);        // PMC_MOR: Enable Main Oscillator
_sleep_(10);                            // Wait for stable Main Oscillator
_WDWORD(0xFFFFFC30, 0x00000001);        // PMC_MCKR: Switch to Main Oscillator

_WDWORD(0xFFFFFF70, 0x00003284);        // SMC_CSR0: Setup SCM for Ext Flash

LOAD BasicIdle_test.axf INCREMENTAL     // Download
g, main         // Running to main function

注:关于初始化脚本的格式和作用可参考MDK帮助文档。