关于KEIL5编译出现“Target not createt”全系列解决办法——情况1:字节限制 RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT

前言

在KEIL5编程,往往遇到许多“Target not createt”,即目标不能实现这类情况。由此为帮助大家解决这些问题特开此贴。

情况如下:

1、2K字节限制错误 ERROR:RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT 或者 ADDRESS SPACE OVERFLOW

     直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125344372

2、程序溢出错误 ERROR: PUBLIC REFERS TO IGNORED SEGMEN

      直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125346305

一、问题产生:

当编译出现如上情况时候,我们读出英文可知道:0800H字节码大小限制的受限版本。

其实就是所使用KEIL5是2048版本,造成原因由二:

1、KEIL5未激活(过期)

2、当初KEIL5激活选错了要生成的版本序列

这时候需要我们去查询一下KEIL5的序列码:

1、首先:打开KEIL5,点击左上角File,然后点击License Managment

2、然后,观察弹出来的界面

 PS:上述情况,只单独出现,如果第一种和第二种同时出现则属于第一种情况!!!

二、解决办法:

1、问题情况一:激活了且没过期但仍然出现“Target not createt”

该情况是由于软件生成序列码选错了版本导致。

即是下列版本选择生产序列码出现的问题。

这里强烈建议选择 prif. Developers Kit 。

2、问题情况二和三:过期了或没激活KEIL5

此时只需要再次激活KEIL5即可。用下方提供的工具可激活日期至2032年!!!

三、激活过程

1、 管理员身份运行KEIL5,否则出现不让激活的弹窗。

2、打开界面License Managment ,并且复制CID

3、打开Keygen工具,粘贴CID,选择 prif. Developers Kit 版本,生成并复制序列码。

4,粘贴序列码至KEIL5,完成激活。

 

 完成上述步骤即可解决编译问题。

 四、工具下载

以下是我个人的网盘分享:

网盘链接:https://pan.baidu.com/s/1Bb83bRb94mooo_eWEw79Uw

提取码:FZLL

(工具只有几十K的大小,网页下载即可)

<think>好的,我现在需要帮助用户解决他们遇到的编译错误。用户的问题是关于“Running with Code Size Limit: 32K”以及错误65的访问冲突。首先,我需要理解这些错误的具体含义和可能的原因。 首先,用户提到了代码大小限制为32K,而当前使用了1052字节,这似乎并不超过限制。但错误提示是访问冲突,地址0x0000000C没有读取权限。这可能涉及内存映射或权限设置的问题。 接下来,我需要考虑用户可能使用的开发环境。之前用户询问过STM32F103ZE,所以很可能是在Keil MDK或者STM32CubeIDE中进行开发。错误信息中的路径显示使用的是.axf文件,这是ARM的可执行文件格式,常见于Keil或IAR。而错误65Keil的特定错误代码,指向内存访问问题。 错误65通常表示程序试图访问一个没有权限的内存地址。地址0x0000000C可能是一个未配置或受保护的内存区域。在STM32中,内存映射包括外设寄存器、SRAM、Flash等。这个地址可能位于某个外设寄存器区域,但未正确初始化或配置。 可能的原因有几个: 1. **链接脚本配置错误**:链接脚本可能没有正确分配内存区域,导致程序访问了未允许的区域。比如,启动文件或分散加载文件中的内存分配不正确。 2. **启动文件问题**:启动文件负责初始化堆栈指针和向量表。如果向量表地址错误,可能导致程序跳转到错误的位置,访问非法地址。 3. **代码或数据误写入只读区域**:程序可能错误地修改了只读区域,如Flash或受保护的SRAM区域。 4. **外设寄存器未初始化**:如果代码试图访问未启用时钟的外设寄存器,或者寄存器地址错误,会导致访问冲突。 5. **编译器/链接器版本限制**:用户提到使用的是限制版本,可能某些功能被禁用,导致生成错误的代码。 解决步骤: 首先检查链接脚本或分散加载文件是否正确配置了内存区域,特别是Flash和RAM的起始地址和大小是否符合STM32F103ZE的规格(512KB Flash,64KB RAM)。确保代码段、数据段正确分配到Flash和RAM中。 其次,检查启动文件是否正确,尤其是向量表的起始地址是否设置为Flash的起始地址(0x08000000)。向量表的第二个条目是复位处理程序,地址0x0000000C可能对应某个中断向量,但如果没有正确映射到Flash,会导致访问错误。 然后,检查代码中是否有直接访问外设寄存器的操作,尤其是未初始化的外设。例如,在访问外设寄存器之前,需要先启用对应的时钟。 此外,用户使用的是限制版的编译器,代码大小限制为32K,但目前只用了1052字节,似乎没有超过限制,但可能需要确认编译器是否限制了某些功能,比如优化选项或特定库的使用,导致生成错误的代码。 还需要检查是否有野指针或数组越界的问题,导致程序错误地访问了非法内存地址。使用调试器进行单步调试,查看程序在崩溃时的调用栈和寄存器值,可以更精确地定位问题。 最后,建议用户更新到正式版编译器,或者检查项目配置是否正确,特别是目标设备的型号是否选对了STM32F103ZE,确保所有外设和内存配置与设备匹配。 可能还需要检查中断向量表的配置是否正确,特别是在使用自定义链接脚本或启动文件时,确保向量表正确指向中断服务例程。 总结:需要从链接配置、启动文件、外设初始化、内存访问以及编译限制等多个方面进行排查,逐步缩小问题范围,找到具体的错误原因。</think>以下是关于编译错误 **`Running with Code Size Limit: 32K`** 和 **`error 65: access violation at 0x0000000C`** 的详细分析与解决方案: --- ### **1. 错误背景** - **错误提示**: - `Code Size Limit: 32K`:当前使用的是 **Keil MDK 限制版**(评估版),生成的代码大小被限制为 32KB。 - `error 65: access violation at 0x0000000C`:程序尝试从地址 `0x0000000C` 读取数据,但该地址无访问权限。 --- ### **2. 根本原因** #### **(1) 访问地址 `0x0000000C` 的合法性** - **地址 `0x0000000C`** 在 ARM Cortex-M 系列中通常是 **中断向量表** 的一部分: - `0x00000000`: 初始堆栈指针(SP)。 - `0x00000004`: 复位向量(程序入口地址)。 - `0x0000000C`: 一般为 **NMI(不可屏蔽中断)** 或 **HardFault 中断** 的入口地址。 - **触发原因**: - 程序可能因 **未初始化外设**、**非法内存操作** 或 **中断配置错误** 导致进入 HardFault。 - 编译限制版可能未正确处理某些代码优化或链接脚本。 #### **(2) 代码大小限制问题** - 当前代码仅占 `1052 Bytes`(未超限),但限制版可能导致: - 禁用部分调试功能。 - 链接脚本或启动文件配置冲突。 --- ### **3. 解决步骤** #### **(1) 检查中断向量表和启动文件** - **确认启动文件**(如 `startup_stm32f103xe.s`)是否正确: - 向量表应对齐到 Flash 起始地址 `0x08000000`(STM32F103ZE 的 Flash 起始地址)。 - 确保链接脚本中代码段从 `0x08000000` 开始。 - **修改方法**(Keil): ```c // 在代码中显式设置向量表地址(可选) SCB->VTOR = 0x08000000; ``` #### **(2) 排查内存访问问题** - **检查代码中的指针操作**: - 是否存在 **野指针** 或 **数组越界**。 - 避免直接操作未初始化的外设寄存器。 - **使用调试器定位崩溃点**: - 在 Keil 中进入调试模式,查看 **Call Stack** 和 **Register** 值,确认触发崩溃的具体代码位置。 #### **(3) 验证外设初始化** - **确保外设时钟已使能**: ```c // 示例:启用 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); ``` - **检查外设寄存器地址映射**: - 确认外设基地址正确(如 GPIOA 基地址为 `0x40010800`)。 #### **(4) 处理编译限制** - **升级到正式版**:购买 Keil MDK 许可证以解除代码大小限制。 - **优化代码**: - 启用编译器优化(`-O1` 或 `-O2`)。 - 移除未使用的库函数或代码段。 --- ### **4. 示例调试流程** 1. **连接调试器**(如 ST-LINK)。 2. **进入调试模式**,运行程序至崩溃点。 3. 查看 **反汇编窗口**,确认 `0x0000000C` 处的指令。 4. 检查 **SCB->CFSR(Configurable Fault Status Register)** 的值,分析故障类型: - 如果是 `IMPRECISERR`,通常由内存访问越界引起。 - 如果是 `PRECISERR`,可通过 **SCB->MMFAR** 获取具体错误地址。 --- ### **5. 注意事项** - **链接脚本配置**:在 Keil 的 `Options for Target -> Linker` 中,确认 `Scatter File` 正确指向芯片的 Flash 和 RAM 区域。 - **避免评估版限制**:限制编译器可能导致隐性问题,建议使用 **STM32CubeIDE**(免费且无代码大小限制)作为替代。 如果需要进一步分析,请提供相关代码片段或调试信息!
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值