Home > Back-end >  Ceedling and STM32CubeIDE: arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; de
Ceedling and STM32CubeIDE: arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; de

Time:11-11

I am trying to create a first Unit Test with Ceedling/Unity/CMoke for my STM32CubeIDE project.

The project has started building but getting an error:

`Linking test_functions_STM32G474RB.out... /Applications/STMicroelectronics/STM32CubeIDE.app/Contents/Eclipse/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.macos64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol Reset_Handler; defaulting to 0000000008000000 Running test_functions_STM32G474RB.out...

ERROR: Test executable "test_functions_STM32G474RB.out" failed.

Produced no final test result counts in $stdout: sh: build/test/out/test_functions_STM32G474RB.out: No such file or directory And exited with status: [0] (count of failed tests). This is often a symptom of a bad memory access in source or test code.

rake aborted!`

This is the project.yml file:

'

---

# Notes:
# Sample project C code is not presently written to produce a release artifact.
# As such, release build options are disabled.
# This sample, therefore, only demonstrates running a collection of unit tests.

:project:
  :use_exceptions: FALSE
  :use_test_preprocessor: TRUE
  :use_auxiliary_dependencies: TRUE
  :build_root: build
#  :release_build: TRUE
  :test_file_prefix: test_
  :which_ceedling: gem
  :ceedling_version: 0.31.1
  :default_tasks:
    - test:all
        
#:test_build:
#  :use_assembly: TRUE

#:release_build:
#   :output: MyApp.out
#  :use_assembly: FALSE

:environment:

:extension:
  :executable: .out

:paths:
  :test:
    -  :test/**
    - -:test/support
  :source:
    - Core/Inc/**
    - Core/Src/**
    - Core/**
    - Drivers/CMSIS/Device/ST/STM32G4xx/Include/**
    - Drivers/CMSIS/Include/**
    - Drivers/STM32G4xx_HAL_Driver/Inc/**
    - Drivers/STM32G4xx_HAL_Driver/Inc/Legacy/**
  :support:
    - test/support
  :libraries: []

:defines:
  # in order to add common defines:
  #  1) remove the trailing [] from the :common: section
  #  2) add entries to the :common: section (e.g. :test: has TEST defined)
  :common: &common_defines []
  :test:
    - *common_defines
    - TEST
  :test_preprocess:
    - *common_defines
    - TEST

:cmock:
  :mock_prefix: mock_
  :when_no_prototypes: :warn
  :enforce_strict_ordering: TRUE
  :plugins:
    - :ignore
    - :callback
  :treat_as:
    uint8:    HEX8
    uint16:   HEX16
    uint32:   UINT32
    int8:     INT8
    bool:     UINT8
  :includes:
    - <stdbool.h>
    - <stdint.h>
  :treat_externs: :include

# Add -gcov to the plugins list to make sure of the gcov plugin
# You will need to have gcov and gcovr both installed to make it work.
# For more information on these options, see docs in plugins/gcov
:gcov:
  :reports:
    - HtmlDetailed
  :gcovr:
    :html_medium_threshold: 75
    :html_high_threshold: 90

#:tools:
# Ceedling defaults to using gcc for compiling, linking, etc.
# As [:tools] is blank, gcc will be used (so long as it's in your system path)
# See documentation to configure a given toolchain for use

:tools:
  :test_compiler:
    :executable: arm-none-eabi-gcc
    :arguments:
      - '${1}'
      - '-mcpu=cortex-m4'
      - '-std=gnu11'
      - '-g3'
      - '-DDEBUG'
      - '-DUSE_HAL_DRIVER'
      - '-DSTM32G474xx'
      - '-c'
      - '-I Core/Inc'
      - '-I Core/Startup'
      - '-I Drivers/STM32G4xx_HAL_Driver/Inc'
      - '-I Drivers/STM32G4xx_HAL_Driver/Inc/Legacy'
      - '-I Drivers/CMSIS/Device/ST/STM32G4xx/Include'
      - '-I Drivers/CMSIS/Include'
      - '-I #{Ceedling.load_path}/../vendor/unity/src'
      - '-I Core/Startup'
      - '-O0'
      - '-ffunction-sections'
      - '-fdata-sections'
      - '-Wall'
      - '-fstack-usage'
      - '--specs=nano.specs'
      - '-mfpu=fpv4-sp-d16'
      - '-mfloat-abi=hard'
      - '-mthumb'
  :test_linker:
    :executable: arm-none-eabi-gcc
    :arguments:
      - '-o "STM32G474RB - PLATFORM.elf"'
      - '-mcpu=cortex-m4'
      - '-T"/Users/raul/Documents/repository/platform-firmware-c/STM32G474RB - PLATFORM/STM32G474RBTX_FLASH.ld"'
      - '--specs=nosys.specs'
      - '-Wl,-Map="${BuildArtifactFileBaseName}.map"'
      - '-Wl,--gc-sections'
      - '-static'
      - '--specs=nano.specs'
      - '-mfpu=fpv4-sp-d16'
      - '-mfloat-abi=hard'
      - '-mthumb'
      - '-Wl,--start-group'
      - '-lc'
      - '-lm'
      - '-Wl,--end-group'

# LIBRARIES
# These libraries are automatically injected into the build process. Those specified as
# common will be used in all types of builds. Otherwise, libraries can be injected in just
# tests or releases. These options are MERGED with the options in supplemental yaml files.
:libraries:
  :placement: :end
  :flag: "-l${1}"
  :path_flag: "-L ${1}"
  :system: []    # for example, you might list 'm' to grab the math library
  :test: []
  :release: []

:plugins:
  :load_paths:
    - "#{Ceedling.load_path}"
  :enabled:
    - stdout_pretty_tests_report
    - module_generator
...

'

I have tried to add the .S file on the compiler/linker flags. But, either I am doing it wrongly or it doesn't work.

I would really appreciate that somebody with more experience than me could point what I am doing wrong.

Thanks in advance.

CodePudding user response:

You're not assembling your startup file startup_stm32.S where probably your vector table and reset handler are defined.

Sometimes, I don't know why, on windows it doesn't get compiled because the extension S has an "incorrect" case. Try switching it to lowercase or uppercase, it may help.

CodePudding user response:

For future visitors, if can be of any help…

I ended up using the gcc compiler instead of the arm one. I removed the HAL drivers and the rest of the source files from the :source: includes. Then I created a separate .h and .c with the code I wanted to test. Then I had to mock up a few included headers with the minimum required functions and variables to be able to build the test code. The functions and the variables were in some cases adjusted/mocked to make it work.

Good luck…

  • Related