00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <avr/io.h>
00023 #include <avr/sfr_defs.h>
00024
00025 #include "os.h"
00026
00027
00028 #define zero_reg "r1"
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #define vector(name) asm(\
00045 ".weak " name "\n\t"\
00046 ".set " name " , __vector_not_set\n\t"\
00047 "jmp " name "\n\t"::);
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 void __vectors (void) __attribute__ ((naked)) __attribute__ ((section (".vectors")));
00062 void __vectors (void)
00063 {
00064 asm("jmp __init\n"::);
00065
00066 vector("__vector_1");
00067 vector("__vector_2");
00068 vector("__vector_3");
00069 vector("__vector_4");
00070 vector("__vector_5");
00071 vector("__vector_6");
00072 vector("__vector_7");
00073 vector("__vector_8");
00074 vector("__vector_9");
00075 vector("__vector_10");
00076 vector("__vector_11");
00077 vector("__vector_12");
00078 vector("__vector_13");
00079 vector("__vector_14");
00080 vector("__vector_15");
00081 vector("__vector_16");
00082 vector("__vector_17");
00083 vector("__vector_18");
00084 vector("__vector_19");
00085 vector("__vector_20");
00086 vector("__vector_21");
00087 vector("__vector_22");
00088 vector("__vector_23");
00089 vector("__vector_24");
00090 vector("__vector_25");
00091 vector("__vector_26");
00092 vector("__vector_27");
00093 vector("__vector_28");
00094 vector("__vector_29");
00095 vector("__vector_30");
00096 vector("__vector_31");
00097 vector("__vector_32");
00098 vector("__vector_33");
00099 vector("__vector_34");
00100 vector("__vector_35");
00101 vector("__vector_36");
00102 vector("__vector_37");
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 void __vector_not_set (void) __attribute__ ((naked)) __attribute__ ((section (".text")));
00116 void __vector_not_set (void)
00117 {
00118 asm("jmp __vectors\n\t"::);
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128 void __init (void) __attribute__ ((naked)) __attribute__ ((section (".init0")));
00129 void __init (void)
00130 {
00131 asm(".weak __init\n\t"
00132 "__init:\n\t"
00133 ".weak __heap_end\n\t"
00134 ".set __heap_end, 0\n\t"::);
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 void init2 (void) __attribute__ ((naked)) __attribute__ ((section (".init2")));
00146 void init2 (void)
00147 {
00148 asm("clr " zero_reg "\n\t"::);
00149
00150 SREG = 0;
00151 SP = RAMEND;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 void __do_copy_data (void) __attribute__ ((naked)) __attribute__ ((section (".init4")));
00164 void __do_copy_data (void)
00165 {
00166 asm(
00167 "ldi r17, hi8(__data_end) \n"
00168 "ldi r26, lo8(__data_start) \n"
00169 "ldi r27, hi8(__data_start) \n"
00170 "ldi r30, lo8(__data_load_start) \n"
00171 "ldi r31, hi8(__data_load_start) \n"
00172 "ldi r16, hh8(__data_load_start) \n"
00173 "out %0, r16 \n"
00174 "rjmp .L__do_copy_data_start \n"
00175 ".L__do_copy_data_loop: \n"
00176 "elpm r0, Z+ \n"
00177 "st X+, r0 \n"
00178 ".L__do_copy_data_start: \n"
00179 "cpi r26, lo8(__data_end) \n"
00180 "cpc r27, r17 \n"
00181 "brne .L__do_copy_data_loop \n"::"I" (_SFR_IO_ADDR(RAMPZ)));
00182
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 void init9 (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
00208 void init9 (void)
00209 {
00210 OS_Init();
00211
00212 for(;;);
00213
00214
00215
00216
00217
00218
00219
00220
00221 }