Некоторые двоичные файлы 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.