欢迎光临
我们一直在努力

用keil出现L6050U错误如何突破32kb限制

叠甲:此都是有授权的,非破解版

本人是在什么情况下遇到这种错误(事先说明):我在学习韦东山freeRTOS时,在编译游戏代码(33_cpu_usage)的时候出现了这个错误(我用的是mdk_lite版)有对于超过32kb的编程项目编译时会直接报错

为什么我要教下载编译器因为对于使用江科大或者韦东山的keil(我发现下载的都有32kb限制)

所以作为取舍我就不用他们的keil了,我放弃了他们给的(鱼与熊掌不可兼得焉),干脆自己装了一个对于现在的我来说更好用的

安装编译器

牢骚(你们听听就行):现在AI这么强大我们也可以使用AI来帮我安装并激活这个keil)

以下是手动安装与激活方式

1.可以在keil官网下载:MDK-ARM 版本 5.43a 评估软件请求

如果你们上面的不行安装不了也可以试试下面这个链接:https://armkeil.blob.core.windows.net/eval/MDK543.exehttps://armkeil.blob.core.windows.net/eval/MDK543.exehttps://armkeil.blob.core.windows.net/eval/MDK543.exehttps://armkeil.blob.core.windows.net/eval/MDK543.exe

2.下载完之后,怎么激活?

我们不用keygen工具了,我们换一个方式来激活

以下链接是arm官方激活方式手册:

Arm Keil | MDK-Community editionhttps://www.keil.arm.com/mdk-community/https://www.keil.arm.com/mdk-community/https://www.keil.arm.com/mdk-community/(方式一)(用powershell命令行激活)

第 1 步:找到授权工具

装完 MDK 5.43 后,授权 CLI 工具在这里(这个是我下载的路径你们下载位置可能和我不一样):

D:\\Keil\\UV4\\armlm\\armlm.exe

第 2 步:查询授权服务器上有哪些产品

D:\\Keil\\UV4\\armlm\\armlm.exe inspect –server https://mdk-preview.keil.arm.com

实际输出(可截图):

1 product found on license server https://mdk-preview.keil.arm.com:

Keil MDK Community (non-commercial free of charge)
Product code: KEMDK-COM0
Order Id: Community, expires on: May 31, 2033

Your username is: username

👉 关键信息:产品代码是 KEMDK-COM0(下一步要用)

第 3 步:激活(核心就这一条)

D:\\Keil\\UV4\\armlm\\armlm.exe activate –server https://mdk-preview.keil.arm.com –product KEMDK-COM0

实际输出:

Activation of Keil MDK Community (non-commercial free of charge) was successful.

就完了。 不用注册账号、不用填序列号、不用付费。

第 4 步:验证

D:\\Keil\\UV4\\armlm\\armlm.exe inspect

返回值:

1 active product in your local cache:

Keil MDK Community (non-commercial free of charge)
Product code: KEMDK-COM0
Order Id: Community
License expires on: May 31, 2033
Local cache expires on: October 10, 2026 (6 days and 23 hours from now)
License server: https://mdk-preview.keil.arm.com

第 5 步:终极验证(最有说服力)

D:\\Keil\\ARM\\ARMCLANG\\bin\\armclang.exe –version

返回值(编译器自己报出了授权名称 —— 这是最硬的证据):

Product: Keil MDK Community (non-commercial free of charge)
Component: Arm Compiler for Embedded 6.24

给不习惯命令行激活的读者的 GUI 版本

µVision → File → License Management
→ 【User-Based License】标签页
→ 点 【Activate / Deactivate…】
→ 弹出 Arm License Management Utility
→ 点右上角【License Server…】
→ 地址填: https://mdk-preview.keil.arm.com
→ 点【Query】
→ 选中 "Keil MDK Community…"
→ 点【Activate】✅

  • 授权到期:2033-05-31(这是永久免费版的当前有效期,不是"7 年试用期")
  • 本地缓存约 7 天,会自动联网续期,你什么都不用做
  • 那个日期是从你激活那天算的 7 天,所以每个人不一样,而且会自动往后滚

装完keil后正片开始了

切换ARM5代编译器(AC5)换成ARM6(AC6)

因为我感肯定大部分人都是从江科大和韦东山等博客走出来的国家之栋梁,用的编译器大部分人是5代编译器,我们换成6代就正式突破了32kb的限制了(只是突破了代码规范这两个编译器会变,5代小部分代码在6可能用不了,后面我在教大家怎么解决此问题)

AC5 / AC6 是什么?

AC = Arm Compiler(Arm 编译器) —— 把你的 C 代码翻译成芯片能执行的机器码的那个工具。5 和 6 就是版本号:第 5 代、第 6 代。

第 1 步:切换编译器 ← 核心就这一步

  • 用 µVision 打开工程(双击 .uvprojx)
  • 按 Alt + F7(或点工具栏那个魔术棒图标)打开 Options for Target(目标选项)
  • 停在 Target(目标) 标签页
  • 找到页面上方的 ARM Compiler(ARM 编译器) 下拉框
  • 把它从 Use default compiler version 5(使用默认编译器版本 5)改成 Use default compiler version 6
  • ⚠️ 如果你的下拉框里显示的是具体版本号(比如 V5.06 update 7),同样改成 Use default compiler version 6

    第 2 步:顺便打开 MicroLIB

    同一个 Target 标签页,看右下角,勾上:

    ☑ Use MicroLIB(使用 MicroLIB)

    (这一步能让代码小十几 KB——NWatch 就是靠它从"差 8904 字节"变成"差 96 字节")

    第 3 步:必须 Rebuild All,不能只按 F7

    这是最容易踩的坑。菜单 Project → Rebuild all target files(项目管理 → 重新编译全部目标文件),或者工具栏那个带感叹号的"重新编译"按钮。

    为什么:AC5 编出来的 .o 文件必须全部丢掉。只按 F7 是增量编译,新旧编译器的目标文件混在一起链接,就会炸出一堆莫名其妙的 L6406E。

    以上操作后现在就已经没有32kb的内存限制了

    接下来细调这个33_cpu_usage代码报错

    切换freeRTOS适配器将RVDS改为GCC

    port.c 是干嘛的?—— FreeRTOS 的"适配器"

    FreeRTOS 要跑在几十种芯片(Cortex-M、RISC-V、ESP32、AVR…)和好几种编译器(Keil AC5、AC6、GCC、IAR…)上。所以它的源码被劈成两半:

    FreeRTOS/Source/
    ├── tasks.c queue.c list.c timers.c event_groups.c ← 内核核心
    │ 纯 C 写的调度算法、队列、链表 —— 【与芯片和编译器都无关】
    │
    └── portable/ ← 移植层
    ├── RVDS/ARM_CM3/ ← 给 Keil AC5 用
    ├── GCC/ARM_CM3/ ← 给 GCC / AC6 用
    ├── IAR/ARM_CM3/ ← 给 IAR 用
    │ (每个里面都是 port.c + portmacro.h 这一对)
    └── MemMang/ ← 内存管理 heap_1~5.c(跟编译器无关,通用)

    打个比方:内核核心是"普通话",port.c 是"翻译官"—— 不同的编译器讲不同的"方言",得配不同的翻译。

    一下是下载port.c和port.h的url路径如果嫌麻烦用我百度网盘里的文件也行

    【推荐】从 FreeRTOS 官方仓库下载(和你的内核版本匹配)
    V10.0.1(老版本,本项目用):
    https://github.com/FreeRTOS/FreeRTOS/tree/V10.0.1/FreeRTOS/Source/portable/GCC/ARM_CM3
    V10.3+(较新版本):
    https://github.com/FreeRTOS/FreeRTOS-Kernel/tree/main/portable/GCC/ARM_CM3

    GCC 链接:百度网盘 请输入提取码 提取码:6666

    下载并解压后,你会得到一个 GCC 文件夹,里面就是给 GCC / AC6 编译器用的移植层文件(port.c 和 portmacro.h 这一对)。

    将 GCC 文件剪切到此路径下:

    33_cpu_usage\\33_cpu_usage\\02_nwatch_game_freertos\\Middlewares\\Third_Party\\FreeRTOS\\Source\\portable

    操作时注意三点:

    • 是剪切,不是复制:把整个 GCC 文件夹放进 portable 目录下,和原有的 RVDS、IAR 等文件夹平级。
    • 不要删掉 RVDS 文件夹:虽然我们不再用它,但工程里可能还有其他文件引用它,先留着更稳妥。
    • 路径别放错层级:一定要放到 portable 这一层,而不是 portable/RVDS 里面,否则编译器找不到。

    放好之后,回到 µVision 里,把工程中 FreeRTOS 的 portable 路径下的 RVDS/ARM_CM3 文件夹从工程中移除,再添加 GCC/ARM_CM3 文件夹(具体操作:在 Project 面板里右键 RVDS 文件夹 → Remove,再右键 portable → Add Existing Files,选中 GCC/ARM_CM3 下的 port.c 和 portmacro.h)。

    改完之后,原来的报错应该就消失了:

    报错路径: …/portable/RVDS/ARM_CM3/port.c ← port.c 还是 RVDS 的 ❌
    错误内容: __asm void … / PRESERVE8 ← RVDS 的嵌入式汇编
    而且: 一条 __forceinline 错误都没有了 ← portmacro.h 已经是 GCC 的了 ✅

    如果编译后 __asm、PRESERVE8 这类错误不再出现,说明移植层已经成功切换到了 GCC 版本。最后记得按 Rebuild All 重新编译一次,让所有目标文件都基于新的移植层重新生成。

    🟢 剩下 11 个错误:照这张表改

    文件改什么
    Core/Src/freertos.c 顶部加 3 行:#include <stdio.h>、#include "driver_led.h"、#include "driver_color_led.h"
    driver_led.c void Led_Test(void) → void Led_Test(void *argument)
    driver_led.h void Led_Test(void); → void Led_Test(void *argument);
    driver_color_led.h void ColorLED_Test(void); → void ColorLED_Test(void *argument);
    driver_color_led.c 顶部加:#include "FreeRTOS.h" + #include "task.h"(为了 vTaskDelay)
    driver_oled.c 顶部加:#include <string.h>(为了 memset)
    nwatch/game2.c 顶部加:#include "driver_timer.h" + extern void RegisterQueueHandle(QueueHandle_t queueHandle);

    之后就可以编译之后烧录到你的stm32板子中了

    赞(0)
    未经允许不得转载:171主机测评 » 用keil出现L6050U错误如何突破32kb限制
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址