gnuk/regnual/sys.c

61 lines
1.2 KiB
C
Raw Normal View History

2012-05-22 01:44:37 +00:00
#include "types.h"
2012-05-24 12:59:11 +00:00
2012-05-22 01:44:37 +00:00
static void fatal (void)
{
for (;;);
}
static void none (void)
{
}
2012-05-25 00:12:37 +00:00
/* Note: it is not reset */
2012-05-22 01:44:37 +00:00
static __attribute__ ((naked))
2012-05-25 00:12:37 +00:00
void entry (void)
2012-05-22 01:44:37 +00:00
{
2012-05-25 06:20:08 +00:00
asm volatile ("ldr r0, =__ram_end__\n\t"
2012-05-22 01:44:37 +00:00
"ldr r1, =__main_stack_size__\n\t"
2012-05-28 02:03:26 +00:00
"sub r0, r0, r1\n\t"
"mov sp, r0\n\t"
"mov r0, #0\n\t"
2012-05-22 01:44:37 +00:00
"ldr r1, =_bss_start\n\t"
2012-05-28 02:03:26 +00:00
"ldr r2, =_bss_end\n"
2012-05-22 01:44:37 +00:00
"0:\n\t"
2012-05-28 02:03:26 +00:00
"str r0, [r1], #4\n\t"
"cmp r2, r1\n\t"
"bhi 0b\n\t"
"cpsie i\n\t" /* Enable interrupts */
"mov r0, #0\n\t"
2012-05-22 01:44:37 +00:00
"mov r1, r0\n\t"
"bl main\n"
2012-05-28 02:03:26 +00:00
"1:\n\t"
"b 1b\n"
2012-05-22 01:44:37 +00:00
: /* no output */ : /* no input */ : "memory");
}
typedef void (*handler)(void);
extern uint8_t __ram_end__;
extern void usb_interrupt_handler (void);
handler vector_table[] __attribute__ ((section(".vectors"))) = {
(handler)&__ram_end__,
2012-05-25 00:12:37 +00:00
entry,
2012-05-22 01:44:37 +00:00
fatal, /* nmi */
fatal, /* hard fault */
/* 10 */
fatal, /* mem manage */
fatal, /* bus fault */
fatal, /* usage fault */
none,
/* 20 */
none, none, none, none, none, none, none, none,
/* 40 */
none, none, none, none, none, none, none, none,
/* 60 */
none, none, none, none, none, none, none, none,
/* 80 */
none, none, none, none,
/* 90 */
usb_interrupt_handler,
};