Embedded ARM KEIL 5中出现错误65(权限错误)

Embedded ARM KEIL 5中出现错误65(权限错误),embedded,arm,microcontroller,keil,cortex-m,Embedded,Arm,Microcontroller,Keil,Cortex M,我是ARM Cortex M4系列微控制器的新手。 当我试图使用KEIL 5模拟器调试一个简单的项目(blinky,它可以轻松地打开和关闭led)时,我会遇到如下错误: *错误65:0x400FE608处的访问冲突:没有“读取”权限 *错误65:0x400FE608的访问冲突:没有“写入”权限 我在互联网上搜索了一个解决方案,我得到了这个: 但实际上,像上面提到的方法一样,在我的整个代码中提到我想要访问的所有地址并不容易,也不符合逻辑 有人能给我推荐点别的吗 (实际上,我在所有我打算模拟的项目

我是ARM Cortex M4系列微控制器的新手。 当我试图使用KEIL 5模拟器调试一个简单的项目(blinky,它可以轻松地打开和关闭led)时,我会遇到如下错误:

*错误65:0x400FE608处的访问冲突:没有“读取”权限 *错误65:0x400FE608的访问冲突:没有“写入”权限

我在互联网上搜索了一个解决方案,我得到了这个:

但实际上,像上面提到的方法一样,在我的整个代码中提到我想要访问的所有地址并不容易,也不符合逻辑

有人能给我推荐点别的吗

(实际上,我在所有我打算模拟的项目中都会遇到这个错误,所以我无法模拟任何东西)

下面是我一直在使用的简单代码:

#define GCGPIOR (*((int*)0x400FE608))
int main(void) 
{ 
GCGPIOR |= 0x20; 
return 0; 
}

我正在使用这个mc:TM4C1294NCPDT

这真的是芯片供应商提供的示例代码吗?GCGPIOR的定义应为
volatile

#define GCGPIOR (*((volatile int*)0x400FE608)))
您是否在模拟器/项目配置中选择了正确的设备?您是否安装了Keil::TM4C_DFP设备包,是否使用了正确的设备配置

问题似乎是模拟器使用的内存映射是从链接器内存映射自动设置的。如果链接器不知道直接内存映射I/O访问,则会引发异常(当此机制检测到代码中的错误时,您可能会对此感到高兴-这不是uVision中的错误-这是故意行为)


如果MAP命令或对话对您不起作用,Occam的剃须刀会告诉我您没有正确执行操作。您应该映射零件数据表或用户手册中给出的整个I/O区域。如果您在链接器分散文件中定义I/O区域,我想它可能会起作用,但这可能会变得有点太复杂。

在使用LPC1768微控制器的CMSIS项目中,KEIL V5也有类似的问题

以真正的微控制器为目标进行调试时,一切正常。以模拟器为目标进行调试,当CMSIS尝试初始化系统核心时钟时,我得到:

*** error 65: access violation at 0x400FC1A0 : no 'write' permission

嗯?为什么您不想使用正确的解决方案?你在映射一个范围,而不是单个地址…所以我必须提到我想要使用的每个地址范围?但是为什么当我下载一些现成的示例时,问题仍然存在!编写示例的人不应该已经这样做了吗。。这些都是官方的例子,所以我觉得有点不对劲!像IAR这样的所有其他IDE都有这个问题吗?大多数人使用真正的硬件。@MohammedNoureldin:不,你不必提及每个范围,你只需要映射整个内存。然而,人们不得不质疑,为什么在链接器知识之外直接寻址内存?访问冲突报告用于捕获错误。什么“官方例子”?为这些问题添加链接,或为您的问题添加实际代码,将有助于您的事业。您是否选择了正确的模拟设备?您是否在目标选项对话框或链接器选项分散文件中正确设置了内存区域(如果您正在使用的话)?@MohammedNoureldin:我很确定Cortex-M4上没有4Gb内存!您的答案w.r.t.示例毫无帮助-您仍然没有在问题中添加代码或指向源代码的链接。我想看看直接访问链接器映射之外内存的实际代码,因为坦率地说,我对此表示怀疑,这可能是您真正的问题。您可能正在询问修复症状,而实际上您需要找到真正的问题。抱歉,您看到的地址只是一个示例,错误实际上发生在我尝试访问的地址中(在我们的示例中为0x400FE608)。另一个模拟器配置是默认的关于大括号,是的,它应该是你提到的,但是它在代码中是明确正确的,因为我的错误不在语法中。关于你问题的其余部分,答案都是肯定的。@MohammedNoureldin:notbeing
volatile
不是语法错误,而是语义错误。有关详细信息,请参阅。我的观点是,我不能相信芯片或编译器供应商会提供这样的代码示例,而你说这是“官方的”(但没有引用链接)。对不起,我没有注意到volatile。。我指的是最后的支架。无论如何,我使用volatile尝试了代码,但出现了相同的错误:**错误65:0x400FE608的访问冲突:没有“读取”权限***错误65:0x400FE608的访问冲突:没有“写入”权限链接并不表明这是一个“问题”-检测错误代码是故意行为。这就是我建议您的配置不正确的原因。Keil的ARM MDK使用ARM自己的编译器(Keil归ARM所有);我认为它至少比IAR的编译器更好。特别是它支持ISOC++98,而不是IAR的EC++子集。也就是说,调试器在一些C++代码中挣扎,尤其是命名空间(当然,EC+++不支持)。