dRonin  adbada4
dRonin firmware
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
startup.c
Go to the documentation of this file.
1 // Startup code and interrupt vector table.
2 //
3 // Copyright (c) 2016, dRonin
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 //
9 // 1. Redistributions of source code must retain the above copyright notice, this
10 // list of conditions and the following disclaimer.
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19 // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 
26 #include <string.h>
27 #include <strings.h>
28 #include <stm32f0xx.h>
29 
30 extern char _sbss, _ebss, _sidata, _sdata, _edata, _stack_top /*, _sfast, _efast */;
31 
32 typedef const void (vector)(void);
33 
34 extern int main(void);
35 
36 void _start(void) __attribute__((noreturn, naked, no_instrument_function));
37 
38 void _start(void)
39 {
40  /* Copy data segment */
41  memcpy(&_sdata, &_sidata, &_edata - &_sdata);
42 
43  /* Zero BSS segment */
44  bzero(&_sbss, &_ebss - &_sbss);
45 
46  /* Invoke main. */
47  asm ("bl main");
48  __builtin_unreachable();
49 }
50 
51 /* This ends one early, so other code can provide systick handler */
52 const void *_vectors[] __attribute((section(".vectors"))) = {
53  &_stack_top,
54  _start,
55  0, /* 08: XXX: NMI_Handler */
56  0, /* 0c: XXX: HardFault_Handler */
57  0, /* 10 reserved */
58  0, /* 14 reserved */
59  0, /* 18 reserved */
60  0, /* 1c reserved */
61  0, /* 20 reserved */
62  0, /* 24 reserved */
63  0, /* 28 reserved */
64  0, /* 2c SVCall */
65  0, /* 30 reserved */
66  0, /* 34 reserved */
67  0, /* 38 PendSV */
68 };
char _ebss
const void( vector)(void)
Definition: startup.c:32
char _sidata
char _sbss
char _sdata
const void *_vectors[] __attribute((section(".vectors")))
int main(void)
Definition: chibi_main.c:69
void _start(void)
Definition: startup.c:36
char _edata
char _stack_top