我正在做一个使用动态重定位的项目,它对Cortex-M4很好,但是Cortex-M0+有一些问题。
浮点函数的符号出现了一些问题。此核心没有浮点单位。
所以我试图理解两个内核(M4和M0+)生成的代码之间的区别。
代码如下:

#include <stdint.h>
#include <math.h>           // <fastmath.h>

float a, b, c; //, d, e;

void ldMain(void)
{
    a = 1.100000f + a;
    b = 1.100000f - b;
    c = 1.100000f * c;
    //d = 1.100000f / d;
}

编译和链接的命令如下:
arm-none-eabi-gcc.exe -c TESTE.c -o TESTE.o0 -mthumb -mcpu=cortex-m0plus -O0 -mlong-calls -mword-relocations -mabi=atpcs -mfloat-abi=soft -mcaller-super-interworking

arm-none-eabi-ld.exe -o TESTE.o TESTE.o0 --relocatable --strip-all --discard-all --embedded-relocs

生成的符号是(get with arm none eabi readelf):
Relocation section '.rel.text' at offset 0x2e4 contains 6 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000028  00000b02 R_ARM_ABS32       00000004   a
0000002c  00000c02 R_ARM_ABS32       00000000   __addsf3
00000034  00000602 R_ARM_ABS32       00000004   b
00000038  00000802 R_ARM_ABS32       00000000   __subsf3
0000003c  00000902 R_ARM_ABS32       00000004   c
00000040  00000a02 R_ARM_ABS32       00000000   __mulsf3

与gcc命令上使用的标记-mcpu=cortex-m0plus或-mcpu=cortex-m4无关,生成的符号是相同的。
问题是,这些符号在CORTEX-M0PLUS上不存在。
cortex-m0plus(armv6-m)的lib gcc位于C:\程序文件(x86)GNU Tools ARM Embedded\4.9 2015q2\lib\gcc\ARM none eabi\4.9.3\armv6-m中,没有这些符号。它是用命令臂none eabi nm验证的。
有没有人知道为什么这些符号被用于CORTEX-M0PLUS?
我使用的是4.9版2015q2的GCC ARM嵌入式。

最佳答案

这些函数在GCC glibc(newlib或nanolib)中定义。这个职位差不多4岁了,我没有2015年海合会的经验。然而,最近的(如2018等)GCC肯定在库中有这些FP软件例程。

关于c - cortex-m0plus上的浮点库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32384037/

10-11 21:03