摘要:STM32F407VG工程进入软件仿真时,出现*** error 65: access violation at 0x0000000C : no 'read' permission
错误。当点击RUN按钮时会重复提示*** error 65: access violation at 0x00000000 : no 'execute/read' permission
的错误。
解决步骤:
1. Option->Debug->Use_Simulator->CPU.DLL的Parameter,改为-REMAP
。现象:依然错误,当时内存地址已经改变:*** error 65: access violation at 0x40023800 : no 'read' permission
2. Option->Debug->Use_Simulator->Initialization_File,打开并新建一个.ini文件,里面写上map 0x40000000,0x400FFFFF read write
保存即可(MAP不区分大小写,注意read和write中间是空格不是逗号)
3. 再进入Debugger就可以了
4. 或者,可以省略第二步,进入Debugger之后再设置map:Debug->Memory_map,手动输入0x40000000,0x400FFFFF
(输入框上面有个示例是0x4000FFFF,但是这个地址值不够大,我们要大一点的0x400FFFFF)。步骤2和4的区别在于:每次退出Debugger后,步骤4的设置都会丢失,会比较麻烦,所以一般只用步骤2的方法
5. 貌似不能通过更改设置中的DLL和它的参数来修正STM32F4的这个错误。因为在keil的安装目录下的\ARM\BIN里面没有相应的DLL文件(通过“文件说明”项来查看文件的使用说明~)
参考:
1. amobbs帖子四楼:
前两天我也遇到这个问题,一起总结在这里:
1. 目标平台:stm32f107VCT6,使用Keil MDK4.72
进入仿真后直接出现第一个错误:*** error 65: access violation at 0x0000000C : no 'read' permission
。
读权限不够。ISP调试没有问题,只有软件仿真才出现error。
查了半天相关的内容解决不掉,很沮丧,大家都是用simulator状态下debug的memory map来解决访问权限不足的问题,这不能解决我的问题
但是后来思考了一下发现问题不在这里。
2. 在仿真时候查看反汇编窗口发现0x0000_0000的地方开始存储器的内容都是0x0000。这个被解释成机器指令就是 MOV R0,R0(实际上这里正常情况下不是可执行的代码
区,因此也不应该将0x0000解释为MOV R0,R0)。原本这些位置应该存放的是[参考《CM3权威指南》第三章]MSP初值(0x0000_0000 ~ 0x0000_0003),复位向量
(0x0000_0004 ~ 0x0000_0007),紧接着后面是一些异常中断向量表。其中复位向量是指示CM3内核在复位后应该从哪个地址取指的非常重要的一个值,而现在这个值是
0x0000_0000,也就是说机器在复位后时设置MSP为0x0000_0000中的值后,从0x0000_0000取出指令解释并执行。这样程序会执行MOV R0,R0。
3. 出现的第一个Error是:access violation at 0x0000000C : no 'read' permission
。0x0000_000C是硬Fault的异常向量入口地址。仿真时点击工具栏 -> Periphral ->Core Periphral
-> Fault Reports,发现有两个Fault:Usage Faults的INVSTATE和Hard Faults的FORCED。查询《CM3权威指南》,INVSTATE位挂起的原因是加载到PC中的跳转地址值是偶数。
机器在这个地址取值的时候应该(这里我不确定)还在执行F107的启动文件(.asm),由于STM32的指令地址的最低位必须是1(CM3的Thumb-2 ISA支持16位和32位寻址,因此地址的LSB
理论上是没有用的,CM3在正常情况下将PC的LSB置为1来表示执行Thumb指令)。
出现Usage Faults后,应该是由于一些CM3寄存器复位值的问题(我没有去验证过),又触发了硬Faults的FORCED位。这样Faults Reports中的位就解释通了。
4. 随后Google了半天,发现Keil官方论坛中提出的解决方案与我的问题相符(官方论坛的/22994/)。在Options for Target -> Debug -> “Simulator section” -> CPU DLL
中应该设置-REMAP,这样才会将0x0800_0000的Flash映射到0x0000_0000的地址上。
5. 这样,一开始0x0000_000C的Error解决了,运行出现了楼主的错误:*** error 65: access violation at 0x40021000 : no 'read' permission
。
现在出现的问题才是大部分人遇到的问题,CM3对存储器定义了4种属性,读写执行缓冲等等[参考《CM3权威指南》第五章],这时只要在仿真时点 Debug -> Memory map,将适当长度的
存储器赋予所需的权限就可以进行F107的仿真了。
楼主链接中提到的:自己写simulation DLL,恐怕对处理器细节没有很好把握的话估计很难用到了,毕竟有硬件平台还是用硬件平台调试,Flash的烧写算法比这个CPU DLL的仿真靠谱。