Ошибка __libc_init_array на STM32L0

Я начинаю с STM32L053 в Linux, использую Eclipse IDE, кросс-компиляцию с gcc-arm-none-eabi-7-2017-q4 и отладку с помощью openocd.

Перед входом в main() я попадаю в WWDG_IRQHandler(). В стеке отладчика я вижу:

  ↓ Reset_Handler() at 0x8002812
  ↓ __libc_init_array() at 0x8002836
  ↓ <signal handler called>() at 0xfffffff9
    WWDG_IRQHandler() at 0x8002830

Несколько строк из Reset_Handler(), кстати, я думаю, что стрелка показывает неправильную строку, потому что в стеке написано __libc_init_array().

    Reset_Handler:
...
    08002806:   cmp     r2, r3
    08002808:   bcc.n   0x80027fe <Reset_Handler+30>
    0800280a:   bl      0x8000128 <SystemInit>
    0800280e:   bl      0x8002834 <__libc_init_array>
 -> 08002812:   bl      0x80027d8 <main>
...

Я надеюсь, что для __libc_init_array () стрелка показывает правую линию, а не следующую.

    __libc_init_array:
    08002834:   eors    r0, r6
 -> 08002836:   stmdb   sp!, {r2, r3, r5, r6, sp, lr}
    0800283a:   b.n     0x800237c <SPIx_Write+8>
    0800283c:   str     r4, [r5, r1]
...

Для WWDG_IRQHandler () это не важно, но все равно опубликуйте

    WWDG_IRQHandler:
 -> 08002830:   b.n     0x8002830 <WWDG_IRQHandler>
    08002832:   movs    r0, r0

Мой код "c" содержит только include (основная функция не достигнута):

#include <stm32l0538_discovery.h>
#include <sys/types.h>

Для конфигурации на eclipse я не использовал плагин, я установил его как:

C/C++ Build
|
|_Cross Settings
| |_Prefix : arm-none-eabi-
| \_Path : /.../gcc-arm-none-eabi-7-2017-q4-major/bin
|
|_Cross Gcc Compiler
| |_Command : gcc
| |_All Options : -nostdinc
| |               -I/.../gcc-arm-none-eabi-7-2017-q4-major/lib/gcc/arm-none-eabi/7.2.1/include
| |               -I/.../gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/include
| |               -I/.../STM32Cube_FW_L0_V1.10.0/Drivers/BSP/STM32L0538-Discovery
| |               -I/.../STM32Cube_FW_L0_V1.10.0/Drivers/CMSIS/Include
| |               -I/.../STM32Cube_FW_L0_V1.10.0/Drivers/STM32L0xx_HAL_Driver/Inc
| |               -I/.../STM32Cube_FW_L0_V1.10.0/Drivers/CMSIS/Device/ST/STM32L0xx/Include
| |               -Os
| |               -g3
| |               -Wall
| |               -Wextra
| |               -mcpu=cortex-m0plus
| |               -march=armv6s-m
| |               -mlittle-endian
| |               -mthumb
| |               -DSTM32L053xx
| |               -c
| |               -v
| \_Command line pattern : ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
|
|_Cross Gcc Linker
| |_command : gcc
| |_All Options : -static
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/lib
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/lib
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/lib/gcc/arm-none-eabi/7.2.1
| |               -mcpu=cortex-m0plus
| |               -march=armv6s-m
| |               -mlittle-endian
| |               -mthumb
| |               -DSTM32L053xx
| |               -T/.../STM32Cube_FW_L0_V1.10.0/Projects/STM32L053C8-Discovery/Templates/TrueSTUDIO/STM32L053C8_Discovery/STM32L053C8_FLASH.ld
| |               -Wl,--gc-sections
| |               -Os
| \_Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
|
\_Cross GCC Assembler
  |_command : as
  |_all options: /*blank*/
  \_Command line pattern : ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

В файле LD я вижу только две вещи, которые могут быть интересными, я не делаю CP всего файла:

    /* Entry Point */
    ENTRY(Reset_Handler)
...
    /* Remove information from the standard libraries */
    /DISCARD/ :
    {
      libc.a ( * )
      libm.a ( * )
      libgcc.a ( * )
    }
...

Запуск, предоставляемый ST, легко восстанавливаемый на Gogole, как этот файл:
https://github.com/AndiceLabs/STM32L053R8-Nucleo/blob/master/Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/gcc/startup_stm32l053xx.s
За исключением того, что строка 151 установлена ​​мной на 0, а строки 205/206 вне курса находятся не в моем файле.

Я не владелец libc и сред настройки, я пробовал много вещей, таких как (не) проверка "nostdlibs", "nostartfiles" или "nodefaultlibs". Но это всегда приводит к неудачной компиляции.

Я действительно не знаю, что пытается, пожалуйста, осветите мне путь! Спасибо!

Jibz

4 ответа

Решение

После записи с кем-то он показывает мне ошибки, которые я сделал в конфигурации, поэтому я публикую здесь (снова) конфигурацию:

|_Cross Settings : Prefix : arm-none-eabi-
|                  Path : ${GccPath}/bin
| 
|_Cross Gcc Compiler : command : gcc
| |_Preprocessor : uncheck "Do not search system directories(-nostdinc)",
| |                I believed that I will search in the native system x64
| |                machin, but no, it just means that it will search in
| |                the GCC folder.
| |                -D STM32L053xx :needed to use some code provided by ST
| |_Includes : removing all references of path to /gcc/*/include because
| |            now they are included without the -nostdinc option.
| |            -I ${DriversPath}/BSP/STM32L0538-Discovery
| |            -I ${DriversPath}/CMSIS/Include
| |            -I ${DriversPath}/STM32L0xx_HAL_Driver/Inc
| |            -I ${DriversPath}/CMSIS/Device/ST/STM32L053xx/Include
| |_Optimization : Optimization level : Optimization for size (-Os)
| |_Debugging : Debug Level : Maximum (-g3)
| |_Warnings : All Warnings (-Wall)
| |            Extra warnings (-Wextra)
| \_Miscellaneous : -mcpu=cortex-m0plus   : with march, GCC will know which lib it should use, and not using the first found in the paths provided previously with the linker option -L.
|                   -march=armv6s-m
|                   -mlittle-endian
|                   -mthumb
|                   -c
|                   -ffunction-sections   : it permits to remove not necessary code
|                   -fdata-sections       : it permits to remove not necessary data.
|                   -v (Verbose)
|
\_Cross GCC Linker : command : gcc
  |_general : No shared libraries (-static)
  |_Libraries : it should stay blank, I removed all -L options.
  \_Miscellaneous : -mcpu=cortex-m0plus
                    -mtune=cortex-m0plus  :Actually, I believe it is just an optimization for **that** cpu.
                    -march=armv6s-m
                    -mlittle-endian
                    -mthumb
                    -T${ProjDirPath}/LinkerScripts/STM32L053C8_FLASH.ld
                    -Wl,-Map=${ProjDirPath}/Logs/Pluviographe.map : The map file is a kind of log, showing links between elements. 
                    -Wl,-gc-sections : It removes some unused code, provided by the -ffunctions-sections and -fdata-sections from the compiler.

Возможно, в коде все еще есть "маленькие" ошибки, но он более чистый.

Решено!!

Я нашел libc.a для armv6, изменил некоторые параметры компоновщика и добавил путь, вот мой конфиг для компоновщика:

C/C++ Build
|
|_Cross Settings
|
|_Cross Gcc Compiler
|
|_Cross Gcc Linker
| |_command : gcc
| |_All Options : -static
| |            => -L/.../gcc-arm-none-eabi-7-2017-q4-major/lib/gcc/arm-none-eabi/7.2.1/thumb/v6-m/
| |            => -L/.../gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/lib/thumb/v6-m/
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/lib
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/lib
| |               -L/.../gcc-arm-none-eabi-7-2017-q4-major/lib/gcc/arm-none-eabi/7.2.1
| |               -mcpu=cortex-m0plus
| |               -march=armv6s-m
| |               -mlittle-endian
| |               -mthumb
| |               -T/.../STM32Cube_FW_L0_V1.10.0/Projects/STM32L053C8-Discovery/Templates/TrueSTUDIO/STM32L053C8_Discovery/STM32L053C8_FLASH.ld
| |               -Wl,--gc-sections
| |               -Os
| \_Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
|
\_Cross GCC Assembler

Спасибо Turbo J за помощь и помощь
Jibz

08002836: stmdb sp!, {r2, r3, r5, r6, sp, lr}

Вероятно, это первый раз, когда вы фактически используете стек в своем коде. Некоторые скрипты компоновщика не выравнивают стек должным образом, поэтому вы можете столкнуться с (жесткой) ошибкой в ​​этой инструкции. Проверить SP зарегистрируйте значение в вашем отладчике.

Если вы не настроите свой собственный обработчик ошибок в исходном коде, будет настроен какой-то обработчик по умолчанию, который будет выглядеть точно так же, как ваш WWDG_IRQHandler,

Компилятор / компоновщик использует одну и ту же функцию для всех незавершенных прерываний IRQ и обработчиков сбоев, что может помешать вам правильно идентифицировать фактический сбой, который произошел.

После некоторого исследования я уверен, что это не проблема, связанная с указателем стека SP.
Вернуться к коду:

    __libc_init_array:
    08002834:   eors    r0, r6
 -> 08002836:   stmdb   sp!, {r2, r3, r5, r6, sp, lr}
    0800283a:   b.n     0x800237c <SPIx_Write+8>
    0800283c:   str     r4, [r5, r1]
...

Что касается набора команд из другой коры (от M0 до M4F), инструкция STMDB не включена в набор команд cortex-M0, в cortex-M0+ есть только команда STM (третий белый столбец, 10-я строка для STM и первая синяя колонка, 17-я строка для STMDB).

Прямо со страницы GNU Arm Embedded Toolchain ( https://developer.arm.com/open-source/gnu-toolchain/gnu-rm) написано, что Cortex-M0(+) поддерживается, поэтому я предполагаю, что с C библиотекарь. На другом сайте они предлагают протестировать мульти-библиотеки gcc, я пробую и:

[jibz@Jazptop bin]$ ./arm-none-eabi-gcc --print-multi-lib
.;
thumb;@mthumb
hard;@mfloat-abi=hard
thumb/v6-m;@mthumb@march=armv6s-m
thumb/v7-m;@mthumb@march=armv7-m
thumb/v7e-m;@mthumb@march=armv7e-m
thumb/v7-ar;@mthumb@march=armv7
thumb/v8-m.base;@mthumb@march=armv8-m.base
thumb/v8-m.main;@mthumb@march=armv8-m.main
thumb/v7e-m/fpv4-sp/softfp;@mthumb@march=armv7e-m@mfpu=fpv4-sp-d16@mfloat-abi=softfp
thumb/v7e-m/fpv4-sp/hard;@mthumb@march=armv7e-m@mfpu=fpv4-sp-d16@mfloat-abi=hard
thumb/v7e-m/fpv5/softfp;@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=softfp
thumb/v7e-m/fpv5/hard;@mthumb@march=armv7e-m@mfpu=fpv5-d16@mfloat-abi=hard
thumb/v7-ar/fpv3/softfp;@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=softfp
thumb/v7-ar/fpv3/hard;@mthumb@march=armv7@mfpu=vfpv3-d16@mfloat-abi=hard
thumb/v8-m.main/fpv5-sp/softfp;@mthumb@march=armv8-m.main@mfpu=fpv5-sp-d16@mfloat-abi=softfp
thumb/v8-m.main/fpv5-sp/hard;@mthumb@march=armv8-m.main@mfpu=fpv5-sp-d16@mfloat-abi=hard
thumb/v8-m.main/fpv5/softfp;@mthumb@march=armv8-m.main@mfpu=fpv5-d16@mfloat-abi=softfp
thumb/v8-m.main/fpv5/hard;@mthumb@march=armv8-m.main@mfpu=fpv5-d16@mfloat-abi=hard

Я считаю, что он установлен, так как Cortex-M0+ находится на архитектуре ARMv6-M. Но результат показывает ARMv6s-M, это что-то меняет?

Во всяком случае, я до сих пор не знаю, как получить правильный libc.

Другие вопросы по тегам