使用RealViewMDK时常见的问题 access violation at 0xFFFFFFFC: no “write” permission

本文介绍了使用RealView MDK调试ARM程序时常见的错误“Error65: access violation at 0xFFFFFFFC: no ‘write’ permission”,并提供了三种解决方法,帮助开发者避免因模拟器内存权限设置不当导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



目前在市场上最常用的ARM编程工具无非是Real View MDK和IAR Embedded Workbench。


我个人觉得,目前IAR是比较成熟、稳定、使用方便等优点,深受广大嵌入式开发者的喜爱。Real view MDK得到ARM公司的大力支持,功能很强,也逐步完善起来。


使用Real view(以下省略为RV)学习ARM指令的时候,初学者在调试过程中,经常会遇到类似于如下的错误消息。


Error 65:access violation at 0xFFFFFFFC: no “write” permission


这个错误一般在使用RV模拟器(使用’debug’的’Use simulator’模式)进行调试时出现。


在发生这个错误时,观察寄存器的话,会错误消息中的地址正是SP(R13)的值。从此可以推测,错误就在进行堆栈操作时发生。


那为什么进行堆栈操作时,发生错误呢?因为,现在使用的是模拟器,而不是真正的目标板,所以对这些内存区域没有任何定义。


所以我们必须在模拟器中要将这个内存地址段的属性设置为可读/可写。


下面,以S3C2410模拟器为例,说明解决上述问题的几种方法:


第一种方法:打开(project -> options..)工程的选项对话框,其中将’Debug’标签的’Dialog DLL’中的DLL文件名(默认为DARMSS9.DLL)改成DARMST9.DLL


第二种方法:在ini file(.ini文件)中写入以下部分,表示这个内存区域是可读/可写/可执行。


map 0xFFFFF000,0xFFFFFFFF read write exec


第三种方法:这是在调试过程中的修改方法,所以在每次运行的时候,都要设置。


先进入调试模式(crtl+F5),接下来在debug菜单下打开memory_map对话框,在这个对话框中添加新的映射区域(map range)和它的属性。
<think>嗯,用户问的是关于“error 65: access violation at 0x40000080 : no 'write' permission”的问题。首先,我需要确定这个错误通常出现在什么情况下。可能是在嵌入式开发或者底层编程中,尤其是在使用微控制器的候,比如STM32之类的。因为这类错误通常和内存访问权限有关。 接下来,我得拆解错误信息。错误65应该是一个特定的错误代码,可能来自某个编译器或调试器,比如Keil或者IAR。访问冲突发生在地址0x40000080,提示没有写权限。这候应该想到,这个地址可能属于某个外设寄存器,而程序试图写入被阻止了。 用户可能需要知道原因和解决方法。首先,地址0x40000080可能属于某个外设的内存映射区域,比如GPIO或者USART的寄存器。微控制器的外设寄存器通常被映射到特定的内存地址,但这些寄存器可能需要特定的访问权限。例如,有些寄存器是只读的,或者需要先启用外设的钟才能进行写操作。 然后,可能的原因有几个:一是没有启用外设的钟,导致无法写入寄存器;二是试图写入只读寄存器;三是内存保护单元(MPU)或类似的安全机制阻止了写入;四是链接脚本或内存分配错误,导致该地址不可写。 解决方法方面,首先检查外设钟是否启用,比如在使用GPIO之前是否调用了RCC_AHB1ENR来启用钟。其次,确认要写入的寄存器是否确实允许写操作,查阅参考手册确认寄存器的权限。然后检查是否有MPU配置错误,或者是否启用了写保护机制。另外,检查链接脚本是否正确,确保该地址区域被正确标记为可写。还有可能是调试器配置问题,比如没有正确设置访问权限。 用户可能需要具体的步骤,比如在STM32中如何启用钟,或者如何检查寄存器权限。可能需要指导他们查阅相关文档,或者提供代码示例。例如,在STM32的HAL库中,启用GPIO钟的代码是__HAL_RCC_GPIOA_CLK_ENABLE()之类的。 另外,还要考虑用户是否有其他配置错误,比如错误地使用了指针操作,直接访问了硬件地址而没有正确映射。或者可能是堆栈溢出导致内存被破坏,意外覆盖了该区域。 需要以清晰的结构解释这些可能性和解决方案,帮助用户逐步排查问题。可能需要分点列出原因和解决方法,并给出示例代码或调试建议。同,提醒用户注意查阅所用芯片的参考手册,确认地址的归属和权限设置。</think>出现 **Error 65: Access violation at 0x40000080 : No 'write' permission** 错误,通常表示程序试图向一个没有写权限的内存地址写入数据。以下是问题分析和解决方法: --- ### **错误原因** 1. **外设寄存器未启用钟** 在嵌入式开发中,地址 `0x40000080` 通常属于微控制器(如 STM32)的外设寄存器区域。许多外设需要先启用钟才能访问其寄存器。 - **例如**:若该地址对应 GPIO 寄存器,但未启用 GPIO 钟,写入操作会触发此错误。 2. **尝试写入只读寄存器** 某些寄存器是只读的(如状态寄存器)。强行写入会引发权限错误。 3. **内存保护单元(MPU)限制** 若启用了 MPU 或内存保护机制,可能因配置错误禁止了对该地址的写入。 4. **链接脚本错误** 链接脚本(`.ld` 文件)可能未正确配置,导致该地址区域未被标记为可写。 --- ### **解决方法** #### 1. 检查外设钟 - 确认操作外设前已启用对应的钟。 **示例代码(STM32 HAL 库)**: ```c __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 钟 ``` #### 2. 确认寄存器权限 - 查阅芯片参考手册,确认目标地址对应寄存器的读写权限。 - 只读寄存器(如 `IDR`)不可写入。 - 需要解锁的寄存器(如 FLASH_CR)需先执行特定操作。 #### 3. 检查 MPU 配置 - 若使用 MPU,确保目标内存区域配置为可写: ```c MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; // 允许读写 ``` #### 4. 验证链接脚本 - 在链接脚本中,确保外设寄存器区域(如 `PERIPH`)被标记为可写: ```ld MEMORY { PERIPH (rw) : ORIGIN = 0x40000000, LENGTH = 1M } ``` #### 5. 调试器配置 - 若使用调试器(如 Keil、IAR),检查是否禁用了写保护选项: - 在调试设置中勾选 **Enable write to memory**。 --- ### **典型场景示例** 假设地址 `0x40000080` 对应 STM32 的 `GPIOA_MODER` 寄存器: 1. **未启用 GPIOA 钟** → 启用钟:`__HAL_RCC_GPIOA_CLK_ENABLE()`。 2. **直接写入寄存器** → 使用合法操作:`GPIOA->MODER |= 0x01;`。 3. **地址计算错误** → 检查寄存器偏移量是否正确。 --- ### **总结** 此错误的本质是 **非法内存写入**。需结合芯片手册、代码逻辑和调试工具,定位目标地址的归属及权限设置。多数情况下,未启用外设钟是最常见原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值