Некоторые двоичные файлы stm32 не могут быть запущены, потому что первые 8 байтов (isr_vector и точки входа) двоичных файлов неверны. но не знаю как решить

Когда я компилирую проекты stm32 (используя cmake), некоторые большие проекты не могут быть запущены, но другие маленькие могут (с точно такой же настройкой)! И после однодневной отладки я считаю, что проблема в первых двух словах (адрес isr_vector и адрес точки входа неверны)

Описание:

Сначала у меня есть один загрузчик (бинарный 11k) и один проект (130k), все может отлично работать с 5-ю keils (windows). И я пытаюсь перейти на Linux, я использую CMake, реконструирую проект, заменяю startup.s / asm на gnuc, давая gcc ldscript(разделы и память), теперь загрузчик может работать с 0x8000000. Но проект не может быть запущен с 0x8000000 или 0x80080000(конечно, я изменил сценарии isr, ldscripth и jlink в соответствии с адресом);

Проблема:

При компиляции загрузчика (или любой вещи, которая может быть запущена) первые слова двоичного кода выглядят так:

00 00 01 20  0d 1c 00 08 //0x20010000 & 0x08001c0d

это означает, что isr_vecotr помещается в оперативную память, а программы main в 0x08001c0d. и при отладке программа работает в 0x08001c0d.

Но когда я компилирую Project, первые слова выглядят так:

5c 84 02 08 00 00 00 20  //0x0800845c & 0x20000000  

И когда я отлаживаю с помощью Ozone, программа работает на 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: оба одинаковы:(я просто хочу сначала запустить без загрузчика, в 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}.....

Здесь я просто хочу сказать, что я помещаю isrvector в начало флэш-памяти.... но двоичный файл не говорит мне.

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 ответов

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