打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、原因:引用#include <assert.h> 断言功能缺失

未定义的符号__aeabi_assert,原因是keil没有添加依赖项,请按图添加即可。
Compiler–I/O–STDERR

在这里插入图片描述

二、 官方解答

适用于:Arm编译器6,Keil MDK
保密性:客户非机密性
本知识库文章中的信息适用于:
Keil MDK 5
Arm编译器5
Arm编译器6
Arm MicroLIB C库

(1) 症状

使用Arm Compiler 6(或Arm Compiler 5)构建项目会产生以下链接错误:

Error: L6218E: Undefined symbol __aeabi_assert (referred from *.o)

(2)导致

如果在Target选项卡上的Project -> Options for Target ->下选择Use MicroLIB,可能会出现“Error: L6218E: Undefined symbol __aeabi_assert…”。
在这里插入图片描述
Microlib是一个独立的、比ARM标准C库更小的库。

为了节省大小,Arm MicroLIB C库不支持或实现几乎所有与操作系统交互的函数,例如abort()、exit()或assert()等函数。

(3)解决

有几个选项可以解决这个问题:

1. 使用µVision中的Keil::ARM_Compiler Pack:

打开“管理运行时环境”对话框,展开“编译器-> I/O”。
在这里插入图片描述

2. 在STDERR旁边,选中复选框。在变体列中,选择ITM。

单击OK关闭对话框。

3. 启用该软件组件包括Project Window的Compiler部分中的retarget_io.c文件。retarget_io.c文件包含一个__aeabi_assert()函数,

如下所示:

__attribute__((weak,noreturn))
void __aeabi_assert (const char *expr, const char *file, int line) {
  char str[12], *p;

  fputs("*** assertion failed: ", stderr);
  fputs(expr, stderr);
  fputs(", file ", stderr);
  fputs(file, stderr);
  fputs(", line ", stderr);

  p = str + sizeof(str);
  *--p = '\0';
  *--p = '\n';
  while (line > 0) {
    *--p = '0' + (line % 10);
    line /= 10;
  }
  fputs(p, stderr);

  abort();
}

__attribute__((weak))
void abort(void) {
  for (;;);
}

自制(方案2)

在使用Arm MicroLIB C库时,实现一个自定义的__aeabi_assert()函数。使用上面的代码作为模板。

禁用assert(): On Project -> Options For Target -> On C/ c++选项卡,用于定义类型“NDEBUG”。-这会导致对assert()函数的调用不起作用。

禁用MicroLIB:在Target对话框右上方的Project -> Options For Target ->下,取消选中Use MicroLIB以禁用Arm MicroLIB C库。

修改完成后,重新构建项目使其生效。

链接

posted on 2023-01-31 08:34  xuejianqiang  阅读(845)  评论(0编辑  收藏  举报  来源
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033