RVicente Posted September 16, 2019 at 11:22 AM Report Share #616173 Posted September 16, 2019 at 11:22 AM Olá a todos, Estou a construir uma Toolchain para cross-compiling num ARM Cortex-M4 através do CMake, usango o gcc-arm-none-eabi. Defini o ficheiro da Toolchain com os respetivos caminhos para os compiladores, e com as flags do compilador. #--------------------------------------------------------------------------------------------------------------------- # Targets #--------------------------------------------------------------------------------------------------------------------- set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR ARM) # set(CMAKE_SYSTEM_VERSION ) #--------------------------------------------------------------------------------------------------------------------- # Set compilers #--------------------------------------------------------------------------------------------------------------------- set(CMAKE_C_COMPILER ${ARM_GCC}) set(CMAKE_CXX_COMPILER ${ARM_G++}) set(CMAKE_ASM_COMPILER ${ARM_AS}) set(CMAKE_AR ${ARM_AR}) (...) set(CMAKE_C_FLAGS_INIT "-O0 -g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -Wall \ -Wextra \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16 \ -ffunction-sections \ -fdata-sections \ -fno-strict-aliasing \ -fno-builtin \ -fshort-enums" ) set(CMAKE_ASM_FLAGS "-g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16" ) set(CMAKE_EXE_LINKER_FLAGS_INIT "-O0 -g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16 \ -Wl,--gc-sections \ --specs=nano.specs \ --specs=nosys.specs" ) No ficheiro CMakeLists.txt tenho mais algumas definições para o compilador, e o caminho para o Linker Script, uma biblioteca construida a partir do SDK e depois o processo de linkagem: (...) add_executable(main main.c) target_link_libraries(main sdk_lib) add_custom_command( TARGET main POST_BUILD COMMAND ${ARM_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/main ${CMAKE_SOURCE_DIR}/main.hex ) O Custom Command gera o .hex a partir do .elf gerado no add_executable(). Aparentemente está tudo a funcionar, mas quando analiso o .hex percebi que praticamente não tem informação. Depois de alguma pesquisa percebi que o próprio .elf não tem o conteúdo que é suposto e começo a desconfiar de um possível problema. Uma vez que no processo de compilação em sistemas embebidos, os ficheiros objecto são gerados e depois linkados para construir um ficheiro final que pode ser corrido no dispositivo, desconfio que o linker não estará a ser chamado, pois os ficheiros objecto para cada source está a ser gerado. Reparei também que na compilação, o compilador que é chamado é o expectável /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc mas o linker assume um caminho estranho, que o CMake encontrou por algum motivo /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld Naturalmente este pertence à pasta da toolchain do GCC, mas deixa-me sem saber se este funciona de igual modo ao presente na outra pasta. Resumindo a minha questão, alguém consegue ter uma ideia do que poderá estar a acontecer quando ao ficheiro .elf não conter a informação correcta, e também esta questão do Linker? Obrigado. (Link para o GitHub, embora já tenha feito pequenas alterações/experiências https://github.com/NunoRVicente/cmake-arm-toolchain) Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted November 13, 2019 at 08:52 PM Report Share #616605 Posted November 13, 2019 at 08:52 PM Só me ocorre uma coisa. Uma variável de ambiente ter o PATH errado para o linker. Mas nunca usei Cmake. Foi sempre o make e nunca fiz nada para ARMs. Só mesmo para AtMegas. Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
Solution RVicente Posted November 14, 2019 at 09:24 AM Author Solution Report Share #616606 Posted November 14, 2019 at 09:24 AM Bom dia. Obrigado pela resposta. Entretanto encontrei o problema que percebi ser um pouco periférico. O linker precisava de um ficheiro assembly que não estava a ser bem compilado com as flags corretas. Entretanto o seguinte comando resolveu o problema: set_source_files_properties(${SDK_DIR}/modules/nrfx/mdk/gcc_startup_nrf52.S PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp" ) Obrigado! 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now