gnuk/regnual/sys.c
2012-05-25 15:20:08 +09:00

68 lines
1.4 KiB
C

#include "types.h"
static void fatal (void)
{
for (;;);
}
static void none (void)
{
}
/* Note: it is not reset */
static __attribute__ ((naked))
void entry (void)
{
asm volatile ("ldr r0, =__ram_end__\n\t"
"ldr r1, =__main_stack_size__\n\t"
"subs r0, r0, r1\n\t"
"msr PSP, r0\n\t" /* Process (main routine) stack */
"movs r0, #0\n\t"
"ldr r1, =_bss_start\n\t"
"ldr r2, =_bss_start\n"
"0:\n\t"
"cmp r1, r2\n\t"
"bge 1f\n\t"
"str r0, [r1]\n\t"
"adds r1, r1, #4\n\t"
"b 0b\n"
"1:\n\t"
"movs r0, #2\n\t" /* Switch to PSP */
"msr CONTROL, r0\n\t"
"isb\n\t"
"movs r0, #0\n\t"
"msr BASEPRI, r0\n\t" /* Enable interrupts */
"cpsie i\n\t"
"mov r1, r0\n\t"
"bl main\n"
"2:\n\t"
"b 2b\n"
: /* 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__,
entry,
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,
};