μVision4 error 65: access violation at <address> : no ‘execute/read‘ permission

背景

利用μVision4软件,调试代码,Debug功能使用软件仿真,Device选择SST89C58

首先下面这个博客介绍了两种方法,但第一种方法对我就可以了。

关于error 65: access violation at 0x000080D4 : no execute/read permission解决方法_no execute read-CSDN博客

下面是第一个博客提到的第一种方法的详细介绍(针对STM32系列器件、μVision5软件)

“*** error 65: access violation at 0x0000000C : no 'read' permission”错误的解决-CSDN博客

官方帮助

官方对此Error的详细解释:

https://developer.arm.com/documentation/ka004447/latest

Debug时,找到Memory Map,可以帮助我们看到各个区域的权限。官方对Memory Map的帮助:

Documentation – Arm Developer

解决方法

首先Debug,先找到Memory Map,查看各个区域的权限。一般情况下可以看到,报错提示了Debug对<address>的权限不足,只需要写一条命令将相应权限赋予对应区域即可。

例如

error 65: access violation at <address> : no 'execute/read' permission

只需要一条命令

MAP  C:0x0100, C:0xFFFF  READ EXEC // 意思是从C:0x0100到C:0xFFFF的区域,执行时可以获得对这段区域的READ权限及EXEC权限

注意在上面的Error中,<address>在C:0x0100, C:0xFFFF区域之内,这个区域当然可以缩短或变长,但具体有多长,起点是什么,根据具体情况而定,但一般情况下长一点是没问题的。

读者会注意到,Error 65是一种出错类型,不止<address>会与笔者的不同,权限也会不同;这就要求读者应该根据自己Memory Map和出错信息,对笔者的命令做出修正。

如何在Debug时执行命令呢?具体有两种方法:

  • command窗口输入命令。这种情况下,每一次Debug都必须输入一次。
  • Debug设置里设定起始文件。这种情况下,一个工程只需设定一次起始文件即可,但是当其他工程遇到这类问题,也必须在其他工程的设置里设定。设定完成后,点击Debug后,立即便能看到command窗口里显示了第一种方法中的命令,可见两种方法对解决问题的本质相同,只是表现形式略有差别。

可以忽略Error的情形

注:Debug时,假设此Error对代码执行没有影响,也可以忽略不计。

笔者是在调试代码时,发现对一些简单程序,此Error其实是代码逻辑的问题。

当汇编代码从RET指令或其他指令返回时,假设在程序存储器中,返回后的地址中没有指令,那么其机器码是00,相当于NOP指令,假设用户选择的运行方式是全速运行,而Debug系统对这段区域(即返回后的地址)没有一些权限,出现此Error是自然而然的事,不出现此Error才不正常。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值