某些stm32二进制文件无法运行,因为二进制文件的前8个字节(isr_vector和入口点)不正确。但不知道如何解决

时间:2017-12-05 08:39:33

标签: arm stm32 bootloader isr

当我编译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.

0 个答案:

没有答案