test.axf: Error: L6238E: cpu_asm.o(test) contains invalid call from '~PRES8

本文介绍了解决在使用Keil MDK编译器时遇到的特定错误的方法。错误涉及从'~PRES8'函数到'REQ8'函数的无效调用。文章提供了两种解决方案,包括在启动文件中添加PRESERVE8指令和调整编译器配置。

从周立功网站下载的“Keil uVision3在EasyARM系列开发板上的工程模板”包含两个文件夹,分别是EasyARM2100和EasyARM2200。该两个模板对应的开发板分别是EasyARM2100和EasyARM2200。

将EasyARM2100模板复制到相应目录后,根据模板内的使用说明设置好编译器环境,编译提示出现以下错误:

1、 .\debug_in_RAM\Project.axf: Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function FIQ_Exception.

2、 .\debug_in_RAM\Project.axf: Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function TargetResetInit.

不知道使用了周立功模板的朋友是否碰到了这个问题,如果碰到,可以和我一起探讨!目前该问题已经被我解决,但不知道大家是怎么解决的,欢迎大家各抒己见!

解决方法:

建议1、

在startup.s中顶部加个

PRESERVE8

就行了.

没有什么要修改了.

建议2、

从ads到rv,基本上要修改下列参数

1>.汇编模块前面加 PORESERVE8

2>.连接器选项中的 -first 改为 --first

3>.fromelf 的参数都要变成 -- ,

比如fromelf --bin --outoput a.bin a.axf 即可从axf文件生成bin文件,用于下载




具体点,就是在

;    PRESERVE8//添加的一个标号

CODE32

AREA    Init,CODE,READONLY

        ENTRY

注释处将“;”去掉,就可在MDK中编译通过,不拿掉就会出现

.\Debug_in_ChipFlash\Project.axf: Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function FIQ_Exception.

.\Debug_in_ChipFlash\Project.axf: Error: L6238E: startup.o(vectors) contains invalid call from '~PRES8' function to 'REQ8' function TargetResetInit.

 

 

我验证的加在此处:

   CODE32

    AREA    Init,CODE,READONLY
        ENTRY

 PRESERVE8
;interrupt vectors
;中断向量表
Reset


`test\test.axf: Error: L6218E: Undefined symbol mdelay (referred from driver_led.o)` 这个错误表明链接器在链接过程中找不到 `mdelay` 函数的定义。以下是一些可能的解决方法: ### 检查函数定义是否存在 需要确保 `mdelay` 函数在某个源文件(`.c` 文件)中被定义。例如,有一个 `delay.c` 文件,其中定义了 `mdelay` 函数: ```c // delay.c #include <stdint.h> void mdelay(uint32_t ms) { // 实现延时功能的代码 for (uint32_t i = 0; i < ms; i++) { // 进行一些空操作来模拟延时 for (uint32_t j = 0; j < 1000; j++); } } ``` ### 确保源文件被编译和链接 要保证定义了 `mdelay` 函数的源文件(如 `delay.c`)被编译成目标文件,并且在链接时被包含进去。如果使用 Makefile 进行编译和链接,需要确保 Makefile 中包含了 `delay.c` 文件: ```makefile CC = gcc CFLAGS = -Wall all: test test: driver_led.o delay.o $(CC) $(CFLAGS) -o test driver_led.o delay.o driver_led.o: driver_led.c $(CC) $(CFLAGS) -c driver_led.c delay.o: delay.c $(CC) $(CFLAGS) -c delay.c clean: rm -f test driver_led.o delay.o ``` ### 检查头文件包含 在使用 `mdelay` 函数的源文件(如 `driver_led.c`)中,要确保包含了声明 `mdelay` 函数的头文件。例如,创建一个 `delay.h` 头文件: ```c // delay.h #ifndef DELAY_H #define DELAY_H #include <stdint.h> void mdelay(uint32_t ms); #endif // DELAY_H ``` 然后在 `driver_led.c` 中包含该头文件: ```c // driver_led.c #include "delay.h" // 使用 mdelay 函数 void some_function() { mdelay(100); } ``` ### 检查库文件 如果 `mdelay` 函数是在某个库文件中定义的,需要确保该库文件被正确链接。例如,如果 `mdelay` 在 `libdelay.a` 库中,可以在链接命令中添加 `-ldelay` 选项: ```sh gcc -o test driver_led.o -L/path/to/library -ldelay ``` ### 检查命名空间和作用域 确保 `mdelay` 函数的命名没有冲突,并且在正确的命名空间和作用域中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值