Никак не пойму в чем дело. Имеется простейший проект из двух файлов crt0.S (стартовый код) и Main.c
crt0.S
CODE

.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
CODE

#include "opora.h"



main()
{
return 0;
}


скрипт для линкера
CODE

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