Никак не пойму в чем дело. Имеется простейший проект из двух файлов crt0.S (стартовый код) и Main.c crt0.S
.equ Stack_size, 0x00000080
.section ".stack", "ax"
Stack_mem:
.space Stack_size
__initial_sp:
.thumb
.section ".vec", "ax"
.global vectors
.global end_vectors
.global vectors_size
vectors:
.word __initial_sp
.word Reset_Handler
end_vectors:
.size vectors_size, . - vectors
.text
Reset_Handler: .func
.global Reset_Handler
.global main
LDR %r0, =vectors
LDR %r1, [r0]
MSR msp, %r1
LDR %r0, =main
BX %r0
.endfunc
.end
Main.c
#include "opora.h"
main()
{
return 0;
}
скрипт для линкера
MEMORY
{
flash(rx) : ORIGIN = 0x00000000, LENGTH = 128K
RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 32K
}
SECTIONS
{
.vec : {KEEP(*(.vec))} > RAM
.text : {KEEP(* (.text))} > RAM
.data : {KEEP(* (.text))} > RAM
.rodata : {KEEP(* (.text))} > RAM
.bss : {KEEP(*(.bss))} > RAM
.stack : {KEEP(* (.stack))} > RAM
}
Все собираю кросс компилятором arm-eabi-gcc. Ядро cortex m1. Прошиваю ядро с помощью JTag-адаптера JLink SEGGER, используя gdb (в качестве gdb-сервера использую JLinkGDBserver с сайта segger). Когда запускаю код, то программа вылетает на инструкции PUSH при вызове main (вылетает не только в реальном ядре, но и в симулятореsm.gif ), что вроде бы указывает на то, что стек не инициализирован.... Уже голову сломал...
Попутные вопросы. Не собирается openOCD 0.5.0, ругается на отсутствие usb.h (usblib установил) в чем может быть проблема?
Может кто-нибудь подскажет хороший симулятор для ARM на будущее sm.gif