MDK 5.37 error: unknown register name ‘control‘ 和 Error: C9932E: Cannot obtain license for Compiler

一、背景

2022年6月6日,满心欢喜地下载了时下最新版的 MDK5.37,用于编译基于STM32F4VET6的ROS小车底盘源码。毫不例外地出了问题。

二、流程记录

1、初打开工程时,提示没有设备

于是下载安装了STM32F4的设备包。可以双击安装包安装,也可以按如下步骤手动安装:

步骤③之后,进入设备包保存路径,可以定位到如下.pack文件,选择并导入即可:

2、现在有设备了,编译,报错

../CORE\core_cmFunc.h(66): error: unknown register name 'control' in asm

把报错粘贴到百度,大致了解到是编译器太新了,需要切换为旧编译器,步骤如下:

发现2022.6.6最新版的MDK537居然没有自带 Version 5 的编译器,于是按照 这篇博客下载并添加了 Version 5 的编译器。以为随便哪个 Version 5 的编译器都可以,就真随便下了一个,而且随便下载的这个是不用安装的,解压之后直接就是个文件夹放在自定义的路径下就行。但是编译依然会报错,反复使用注册机注册也无果:

Error: C9932E: Cannot obtain license for Compiler

3、于是下载了MDK531版本,编译成功

检查 MDK531 的 Version 5 编译器具体版本号为V5.06 update 6 (build 750)

再根据这篇博客下载安装 V5.06 update 6 (build 750) 的编译器到 MDK537 上,步骤如下:


定位到编译器文件夹所在的文件夹,选择编译器文件夹,添加即可。这样,就可以使用最新版的MDK537编译旧工程了,暂时还不知道MDK537相对之前的版本更新了啥,也没感觉出有啥让人眼前一亮的东西。

在 Keil V6.14 编译器中遇到 "unknown type name '__packed'" 错误通常是因为你在尝试使用 GCC 的 `__attribute__((packed))` 特性,而 Keil MDK(μVision)默认使用的编译器不是支持这种特性。这是GCC用于告诉编译器将数据结构成员紧密地排列在一起,减少内存占用的方法。 要在 Keil V6.14 中解决这个问题,你可以做以下几个步骤: 1. **确认目标板编译设置**:确保你的项目配置为使用C/C++标准库(如 GNU C Library),而不是Keil的内建库。通常在工程设置 -> 链接器 -> 链接器选项 -> 链接器输入中选择“GNU Linker”。 2. **禁用 packed 特性**:如果你确实需要紧凑布局,可以创建一个新的头文件,在其中包含 `__packed` 宏定义,然后在所有依赖它的地方包含这个新头。例如: ```c #pragma pack(push, 1) // 开始使用1字节对齐 typedef struct { uint8_t a; uint8_t b; } __packed MyPackedStruct; #pragma pack(pop) // 结束紧凑布局 ``` 3. **替换为其他方法**:如果只是为了节约内存,你可以考虑优化数据结构设计,比如通过联合体 (`union`) 或者手动调整成员的顺序和大小。 4. **更新库或工具链**:如果可能的话,升级到支持`__attribute__((packed))`特性的版本,但注意这可能需要更新整个开发环境。 5. **检查第三方库的兼容性**:确认引入的第三方库是否与 Keil V6.14 的编译器兼容,某些库可能已经处理了这种差异。 记得每次更改后都要重新编译并检查错误是否消失。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值