当我编译stm32项目(使用cmake)时,某些大项目无法运行,但其他小项目可以运行(具有完全相同的配置)! 经过一天的调试,我认为问题出在前2个字(isr_vector地址和入口点地址不正确)
说明
起初我有一个bootloader(二进制11k)和一个项目(130k),所有都可以与keils 5(windows)完美运行。我正在尝试迁移到linux,我使用CMake重建项目,替换startup.s / asm for gnuc,给gcc ldscript(sections和memory),现在bootloader可以从0x8000000运行。但该项目无法从0x8000000或0x80080000运行(当然我根据地址更改了isr,ldscripth和jlink脚本);
问题:
编译bootloader(或任何可以运行的东西)时,第一个二进制文字如下:
00 00 01 20 0d 1c 00 08 //0x20010000 & 0x08001c0d
表示isr_vecotr位于ram中,程序main位于0x08001c0d。当调试程序运行在0x08001c0d时。
但是,当我编译Project时,第一个单词看起来像:
5c 84 02 08 00 00 00 20 //0x0800845c & 0x20000000
当我使用臭氧进行调试时,程序运行在0x20000000,并且每件事都令人难以置信。
配置:
工具链文件:
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++")
set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc")
add_definitions(-DCMAKE_BUILD_TYPE=Release)
set(COMMON_FLAGS "-DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 --specs=nosys.specs -mfloat-abi=soft -MMD -mcpu=cortex-m3 -mthumb -mthumb-interwork -Wall")
Ldscript:两者都是一样的:(我只想先运行不带bootloader,在0x8000000)
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
CCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 0
}
__stack = ORIGIN(RAM) + LENGTH(RAM);
_estack = __stack; /* STM specific definition */
__Main_Stack_Size = 1024 ;
PROVIDE ( _Main_Stack_Size = __Main_Stack_Size ) ;
__Main_Stack_Limit = __stack - __Main_Stack_Size ;
PROVIDE ( _Main_Stack_Limit = __Main_Stack_Limit ) ;
_Minimum_Stack_Size = 256 ;
PROVIDE ( _Heap_Begin = _end_noinit ) ;
PROVIDE ( _Heap_Limit = __stack - __Main_Stack_Size ) ;
ENTRY(_start)
SECTIONS
{
.isr_vector : ALIGN(4)
{
FILL(0xFF)
__vectors_start = ABSOLUTE(.) ;
__vectors_start__ = ABSOLUTE(.) ; /* STM specific definition */
KEEP(*(.isr_vector)) /* Interrupt vectors */
KEEP(*(.cfmconfig)) /* Freescale configuration words */
*(.after_vectors .after_vectors.*) /* Startup code and ISR */
} >FLASH
.inits : ALIGN(4)
{ .........bulabulabula}.....
在这里,我只想说我确实将闪光灯放在闪光灯的开头......但二进制文件告诉我不要。
Envirement:
System : Ubuntu14.04.1(4.10.0)
Toolchain : arm-none-eabi-gcc 6.3.1
Debuger : Jlink 6.14b + Jlink Debugger 9.20
IDE : Clion 2017
Other : Cmake 3.8, uCos II,my ldscript, OZone.