为 cortexm4 CPU 编译配方时与拇指指令混淆

问题描述 投票:0回答:1

我有一个 STM32F373 微控制器和一些使用 ST HAL 库的 C 应用程序。我需要按照 Yocto 的配方构建此应用程序。请注意,我不需要在此 MCU 上运行 Linux,我只需要为

.hex
CPU 编译
cortexm4
固件文件。我为它创建了一个机器文件
stm32f373.conf

TARGET_ARCH         = "arm"                                                          
MACHINEOVERRIDES   =. "stm32:stm32f3:stm32f373:"                                     
#TUNE_FEATURES       = "thumb"                                                       
#ARM_INSTRUCTION_SET = "thumb"                                                       
                                                                                                                                                                    
require conf/machine/include/arm/armv7m/tune-cortexm4.inc

但是当我尝试用这台机器编译我的菜谱时,某些系统包无法编译并出现错误:

arm-oe-linux-gnueabi-gcc  -mcpu=cortex-m4 -march=armv7e-m --sysroot=.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot ../sysdeps/arm/crtn.S -c     -I../include -I.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu  -I.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi  -I../sysdeps/unix/sysv/linux/arm/le  -I../sysdeps/unix/sysv/linux/arm  -I../sysdeps/arm/nptl  -I../sysdeps/unix/sysv/linux/include -I../sysdeps/unix/sysv/linux  -I../sysdeps/nptl  -I../sysdeps/pthread  -I../sysdeps/gnu  -I../sysdeps/unix/inet  -I../sysdeps/unix/sysv  -I../sysdeps/unix/arm  -I../sysdeps/unix  -I../sysdeps/posix  -I../sysdeps/arm/le/nofpu  -I../sysdeps/arm/nofpu  -I../sysdeps/ieee754/soft-fp  -I../sysdeps/arm/le  -I../sysdeps/arm/include -I../sysdeps/arm  -I../sysdeps/wordsize-32  -I../sysdeps/ieee754/flt-32  -I../sysdeps/ieee754/dbl-64  -I../sysdeps/ieee754  -I../sysdeps/generic  -I.. -I../libio -I. -nostdinc -isystem .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot-native/usr/bin/arm-oe-linux-gnueabi/../../lib/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/11.4.0/include -isystem .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot-native/usr/bin/arm-oe-linux-gnueabi/../../lib/arm-oe-linux-gnueabi/gcc/arm-oe-linux-gnueabi/11.4.0/include-fixed -isystem .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot/usr/include -D_LIBC_REENTRANT -include .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h  -DPIC     -DTOP_NAMESPACE=glibc -DASSEMBLER -I.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/. -g -fdebug-prefix-map=.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0=/usr/src/debug/glibc/2.35-r0 -fdebug-prefix-map=.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot= -fdebug-prefix-map=.../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/recipe-sysroot-native= -Werror=undef -Wa,--noexecstack   -o .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/crtn.o -MD -MP -MF .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/crtn.o.dt -MT .../yocto-builder/build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/crtn.o
...
mv -f .../build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/stamp.oT .../build/tmp-stm32f373/work/cortexm4-oe-linux-gnueabi/glibc/2.35-r0/build-arm-oe-linux-gnueabi/csu/stamp.o
| ../sysdeps/arm/sysdep.h: Assembler messages:
| ../sysdeps/arm/sysdep.h:144: Error: selected processor does not support ARM opcodes
| ../sysdeps/arm/crti.S:64: Error: attempt to use an ARM instruction on a Thumb-only processor -- `ldr r3,.LGOT'
| ../sysdeps/arm/crti.S:65: Error: attempt to use an ARM instruction on a Thumb-only processor -- `ldr r2,.LGOT+4'
| ../sysdeps/arm/crti.S:67: Error: attempt to use an ARM instruction on a Thumb-only processor -- `add r3,pc,r3'
| ../sysdeps/arm/crti.S:68: Error: attempt to use an ARM instruction on a Thumb-only processor -- `ldr r2,[r3,r2]'
| ../sysdeps/arm/crti.S:69: Error: attempt to use an ARM instruction on a Thumb-only processor -- `cmp r2,#0'
| ../sysdeps/arm/crti.S:70: Error: attempt to use an ARM instruction on a Thumb-only processor -- `bxeq lr'
| ../sysdeps/arm/crti.S:71: Error: attempt to use an ARM instruction on a Thumb-only processor -- `b __gmon_start__'
| ../sysdeps/arm/crti.S:84: Error: attempt to use an ARM instruction on a Thumb-only processor -- `push {r3,lr}'
| ../sysdeps/arm/crti.S:86: Error: attempt to use an ARM instruction on a Thumb-only processor -- `bl call_weak_fn'
| ../sysdeps/arm/crti.S:97: Error: attempt to use an ARM instruction on a Thumb-only processor -- `push {r3,lr}'

我尝试通过

thumb
启用
ARM_INSTRUCTION_SET = "thumb"
,如注释代码中所示,但它没有任何改变。我也尝试在我的应用程序配方中设置此变量,但它也没有效果。我也尝试通过
TUNE_FEATURES = "thumb"
启用它,但出现错误:

ERROR:  OE-core's config sanity checker detected a potential misconfiguration.
    Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
    Following is the list of potential problems / advisories:

    Error, the PACKAGE_ARCHS variable (all any noarch armv7em cortexm4 stm32f373) for DEFAULTTUNE (cortexm4) does not contain TUNE_PKGARCH (cortexm4t2).

我使用

kirkstone
Yocto 版本,主机是
x86_64
机器。

如何使用 Yocto 为

cortexm4
CPU 编译单个应用程序配方?

arm stm32 yocto bitbake
1个回答
0
投票

定义编译器需要三件事。

  1. ISA 或目标汇编器。
  2. 操作系统(或“裸机”)。
  3. 图书馆。

有一些“C”功能(例如浮点和双精度)需要实用程序。反过来,可能会出现发出“信号”(例如“SIGFPE”等)的错误情况。编译器支持库“libgcc”可能会调用 Linux 内核和/或依赖 Yocto 中 Linux 内核的功能工具套装。

如果您坚持使用 yocto/open 嵌入式工具,您必须使用

-ffreestanding
进行构建。其他项目是设置“C”环境。有一些例程可以设置堆栈、清除“bss”和初始化数据。某些函数(如“C++”静态构造函数)必须在 main 之前运行。

您还必须删除诸如 --sysroot 之类的选项,因为没有可以使用的根文件系统。即,您不能链接到 Yocto 库和/或包含 Yocto 头文件。当且仅当您使用 -ffreestanding时,编译器会取消定义“HOSTED”,并且编译器“C”库将有条件地设置为

NOT
以使用 Linux 系统调用和功能。

获取“arm-none-eabi”工具套件要简单得多。无论您使用 yocto 编译器的建议来自哪里,都是来自有技术需求的人。虽然这是可能的,但这是一种挫败感的练习。我将获得 arm-none-eabi 编译器并生成“.hex”文件。构建完成后,您可以尝试替换 yocto gcc。然后,也只有那时,我才会尝试让 bitbake 的东西发挥作用。您必须重写 bitbake 文件中的许多假设。

© www.soinside.com 2019 - 2024. All rights reserved.