背景
利用μ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的帮助:
解决方法
首先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才不正常。