搜索
bottom↓
回复: 17

小总结:解决*** error 65: access violation at 0x40021000 : no 'read' pe...

[复制链接]

出0入0汤圆

发表于 2013-4-18 18:06:27 | 显示全部楼层 |阅读模式
本帖最后由 y574924080 于 2013-4-18 18:06 编辑

之前使用野火开发板,学习自己建立工程模板的时候

在工程模板建立完成,编译无错误后

进入软件仿真,出现如下错误

         *** error 65: access violation at 0x40021000 : no 'read' permission

当时我想到的笨办法是打开 Project -> Options for Target .....

里面一共十个标签页,一个一个与火哥的工程模板对比

终于在 Debug 页面中发现不同



修改之后就可以仿真了

今天突然想起这个问题

使用 evenring 搜索一下 TARMSTM.DLL,找到在 D:\Keil\ARM\BIN

打开一看



大概看了一下,这些是分别给不用的芯片用的

dll 参数我猜是 各个芯片的型号

搜索一下,发现这里 http://www.realview.com.cn/faq/142.pdf

嗯嗯,这个是我的第一有点点技术的贴

大家表扬一下啊







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入8汤圆

发表于 2013-4-18 18:40:58 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2013-4-19 16:56:04 | 显示全部楼层
牛B,真的可以,太感谢了

出0入0汤圆

发表于 2013-11-13 10:56:53 | 显示全部楼层
前两天我也遇到这个问题,一起总结在这里:
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的仿真靠谱。

出0入0汤圆

发表于 2013-11-19 14:49:36 | 显示全部楼层
我刚开始学SMT32也遇到楼主的问题,按楼主说的做确实解决了问题

出0入0汤圆

发表于 2013-11-19 14:55:54 | 显示全部楼层

出0入0汤圆

发表于 2013-12-20 09:51:44 | 显示全部楼层
我也遇得这种情况,花了一天时间才解决,我是从STM32F103ZE的程序改成STM32F105VC的,要把启动文件换成startup_stm32f10x_cl.s,同时Preprocessor Symbols 中的DEFINE 那行的 STM32F10X_HD 改成 STM32F10X_CL.以下是大概过程:
1.先是按http://www.amobbs.com/thread-5501597-1-1.html  14楼的方法,选上USE microlib,但还是没用。因为我根本没有用printf函数。
2.仔细观察后来发现debug后,单步时提示  *** error 65: access violation at 0x40021000 : no 'read' permission
搜下一下根据这个帖http://www.amobbs.com/thread-5529894-1-1.html   
1楼的方法,没有解决,4楼是比较全面的方法,也没有解决。
3.最后根据http://www.amobbs.com/thread-5528756-1-1.html 这个帖子2楼的方法,要先设置BOOT1,BOOT2为0才解决了,因为我的硬件有外部把这两个脚改变了。
总结:要先排除硬件的原因,重点为是BOOT1,BOOT2的两个脚电平,不再值对应不同的启动方式。再从软件入手,第2点方法比较全面地解决这个问题。

出0入0汤圆

发表于 2013-12-20 11:03:53 | 显示全部楼层
连接是个广告啊,还得再转一个连接。。

出0入0汤圆

发表于 2014-7-8 16:30:45 | 显示全部楼层
支持一下,不错,正用到谢谢。

出0入0汤圆

发表于 2014-7-8 17:21:21 | 显示全部楼层
支持一下,不错

出0入0汤圆

发表于 2014-7-8 17:40:55 | 显示全部楼层
谢谢分享!暂时还没碰到,但不等于以后碰不到。

出0入10汤圆

发表于 2014-7-8 18:41:38 | 显示全部楼层
这种问题以后也许都会碰到,mark一下

出0入0汤圆

发表于 2014-9-27 13:46:49 | 显示全部楼层
非常的感谢楼主啊,非常的不错啊,解决了我的问题!非常的好!

出0入0汤圆

发表于 2014-11-9 11:45:43 | 显示全部楼层
本帖最后由 caoyannay 于 2014-11-9 11:53 编辑

补充一下另一种定位解决的方法:
Option for Target '' -> Debug -> Use Simulator,当使用软件仿真时,有两个DLL及其参数需要填写
正确,否则仿真时会出现error 65: accessviolation。
如果你的工程不是新创建的,则可能DLL的参数设置与你当前Keil的版本并不匹配。
正确的DLL参数应当根据你选择的Option for Target '' -> Device来设置,假如你选择了STM32F103C8,
通过查看Device DataBase, File -> Device DataBase -> STM32F103C8,这里列出一个例子:
  1. BOOK0=DATASHTS\ST\STM32F10xxx.PDF("Reference Manual")
  2. BOOK1=datashts\arm\cortex_m3\r1p1\DDI0337E_CORTEX_M3_R1P1_TRM.PDF("Technical Reference Manual")
  3. BOOK2=datashts\arm\cortex_m3\r2p1\DUI0552A_CORTEX_M3_DGUG.PDF("Generic User Guide")
  4. CPU=IRAM(0x20000000-0x20004FFF) IROM(0x8000000-0x800FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")
  5. FLDLL=UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128 -FS08000000 -FL010000)
  6. MON=SARMCM3.DLL TARMSTM.DLL("-pSTM32F103C8")
  7. REGFILE=stm32f10x.h("ST\STM32F10x")
  8. SFILE="STARTUP\ST\STM32F10x\startup_stm32f10x_md.s" ("STM32 Medium Density Line Startup Code")
  9. SIM=SARMCM3.DLL  DARMSTM.DLL("-pSTM32F103C8")
  10. SVD=SFD\ST\STM32F1xx\STM32F103xx.sfrSVD=SFD\ST\STM32F1xx\STM32F103xx.sfr
复制代码


可以看到,DLL的参数需要按照SIM=所指定的参数来填写:
CPU.DLL: SARMCM3.DLL
Parameter:
Dialog DLL: DARMSTM.DLL
Parameter: -pSTM32F103C8

其中 CPU.DLL Parameter这个没有填写,有些解决方案里写上了-REMAP,根据Help->uVision Help->uVision User Guide->Dialogs » Project » Options » Debug里看到:
CPU/Driver DLL - Parameter
Preferably, do not modify these settings. Device Database Parameters describe the parameters.
Dialog DLL - Parameter
Preferably, do not modify these settings. Device Database Parameters describe the parameters.

所以这里我们并不需要填写这个参数。

  1. -REMAP,这个选项是为了将0x0800_0000的Flash映射到0x0000_0000的地址上。
复制代码


当然,上面的Device Database里的参数是我当前Keil版本里的,不同的Keil版本设置会有所需别,有的就必须要加-REMAP,所以只要根据Device Database里所指定的参数
设置好,一般软件仿真就可以正常跑起来了。

出0入0汤圆

发表于 2014-11-9 12:17:37 | 显示全部楼层
学习,mark

出0入0汤圆

发表于 2015-8-23 10:42:26 | 显示全部楼层
142文档不能下载了,你有链接给一个。还有好像不支持105系列的。

出0入8汤圆

发表于 2015-12-4 19:59:32 | 显示全部楼层
MARK,也遇到这个问题,明天看一下,不过我是用的M051的单片机

出0入8汤圆

发表于 2015-12-5 11:09:58 | 显示全部楼层
Pendragon 发表于 2013-11-13 10:56
前两天我也遇到这个问题,一起总结在这里:
1.  目标平台:stm32f107VCT6,使用Keil MDK4.72
    进入仿真 ...

Debug -> Memory map
我现在用的STM32F051K8的芯片,这个地方怎么设置?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表