📄 sosos.lst
字号:
1 .file "sosos.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
85 .global SososInitIntSp
87 SososInitIntSp:
1:sosos.c **** /*=========================================================================================
2:sosos.c **** 项目名称: 小型开源实时操作系统
3:sosos.c **** 软件版本: VER 1.0
4:sosos.c **** 目标平台: AVR系列单片机
5:sosos.c **** 工具链 : AVR-GCC(V4.1.2) WINAVR-20070525
6:sosos.c **** 开发人员: 韩骁
7:sosos.c **** 开发时间: 2007-07-05
8:sosos.c **** 版权 : GPL(GNU General Public License)
9:sosos.c **** 文件名称: sosos.c
10:sosos.c **** 文件说明:
11:sosos.c **** 小型开源实时操作系统的主c文件
12:sosos.c **** 本次测试采用ARMEL公司的MEGA8进行
13:sosos.c **** =========================================================================================*/
14:sosos.c **** #include <avr/io.h>
15:sosos.c **** #include <avr/wdt.h>
16:sosos.c **** #include <avr/interrupt.h>
17:sosos.c ****
18:sosos.c **** #include "MYBIT.H"
19:sosos.c **** #include "sosos.h"
20:sosos.c ****
21:sosos.c **** #if SOSOS_TASK_ENALBE == 1
22:sosos.c **** void SososInitIntSp(void) __attribute__ ((constructor));//定义中断嵌套堆栈指针
23:sosos.c **** void SososInitIntSp(void)
24:sosos.c **** //本函数在main()之前运行,将系统堆栈指针保存在r15:r14中
25:sosos.c **** {
88 (size=0) */
90 .LM1:
91 /* #APP */
26:sosos.c **** __asm__ __volatile__("PUSH r16 \n\t");
92 H r16
93
95 0000 0F93 .LM2:
96 IN r14 ,__SP_L__
27:sosos.c **** __asm__ __volatile__("IN r14 ,__SP_L__ \n\t");
97 tabn 68,0,28,.LM3-SososInitIntSp
98 .LM3:
99 0002 EDB6 LDI r16 ,3
100
28:sosos.c **** __asm__ __volatile__("LDI r16 ,3 \n\t");
101 abn 68,0,29,.LM4-SososInitIntSp
102 .LM4:
103 0004 03E0 ADD r14 ,r16
104
29:sosos.c **** __asm__ __volatile__("ADD r14 ,r16 \n\t");
105 abn 68,0,30,.LM5-SososInitIntSp
106 .LM5:
107 0006 E00E IN r15 ,__SP_H__
108
30:sosos.c **** __asm__ __volatile__("IN r15 ,__SP_H__ \n\t");
109 abn 68,0,31,.LM6-SososInitIntSp
110 .LM6:
111 0008 FEB6 CLR r16
112
31:sosos.c **** __asm__ __volatile__("CLR r16 \n\t");
113 abn 68,0,32,.LM7-SososInitIntSp
114 .LM7:
115 000a 0027 ADC r15 ,r16
116
32:sosos.c **** __asm__ __volatile__("ADC r15 ,r16 \n\t");
117 abn 68,0,33,.LM8-SososInitIntSp
118 .LM8:
119 000c F01E POP r16
120
33:sosos.c **** __asm__ __volatile__("POP r16 \n\t");
121 NOAPP */
122 /* epilogue: frame size=0 */
123 000e 0F91 ret
124 /* epilogue end (size=1) */
125 /* function SososInitIntSp size 33 (32) */
127 0010 0895 .Lscope0:
128 .global __do_global_ctors
129 .section .ctors,"a",@progbits
130 .word gs(SososInitIntSp)
131 .text
135 .global SOSOS_TASK_STACK_CASE
137 SOSOS_TASK_STACK_CASE:
139 .LM9:
140 /* prologue: frame size=0 */
141 /* prologue end (size=0) */
34:sosos.c **** }
35:sosos.c **** #endif
36:sosos.c ****
37:sosos.c **** #if STACK_SIZE_REPORT_ENABLE == 1
38:sosos.c **** unsigned int SOSOS_TASK_STACK_CASE(unsigned char pri,unsigned char id)//堆栈情况报告
39:sosos.c **** //本函数用于返回指定任务的堆栈占用情况,单位:字节
40:sosos.c **** //pri和id是要报告的任务优先级和ID
41:sosos.c **** {
142 -SOSOS_TASK_STACK_CASE
143 .LM10:
144 mov r30,r24
145 clr r31
42:sosos.c **** unsigned int i;
43:sosos.c ****
44:sosos.c **** for(i=(TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TASK_STACK_BUTTON-TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TAS
146 r30
147 rol r31
148 0012 E82F add r30,r22
149 0014 FF27 adc r31,__zero_reg__
150 0016 EE0F movw r24,r30
151 0018 FF1F ldi r19,3
152 001a E60F 1: lsl r24
153 001c F11D rol r25
154 001e CF01 dec r19
155 0020 33E0 brne 1b
156 0022 880F lsl r30
157 0024 991F rol r31
158 0026 3A95 add r30,r24
159 0028 01F4 adc r31,r25
160 002a EE0F subi r30,lo8(-(TCB))
161 002c FF1F sbci r31,hi8(-(TCB))
162 002e E80F ldd r18,Z+2
163 0030 F91F ldd r19,Z+3
164 0032 E050 ldd r24,Z+4
165 0034 F040 ldd r25,Z+5
166 0036 2281 movw r30,r18
167 0038 3381 sub r30,r24
168 003a 8481 sbc r31,r25
169 003c 9581 rjmp .L9
170 003e F901 .L5:
172 0042 F90B .LM11:
173 0044 00C0 ld r24,Z
174 cpi r24,lo8(-86)
45:sosos.c **** if(*((unsigned char *)i)!=INIT_STACK_FILL_BYTES)
175 4,.LM12-SOSOS_TASK_STACK_CASE
176 .LM12:
177 0046 8081 adiw r30,1
178 0048 8A3A cp r30,r18
179 004a 01F4 cpc r31,r19
180 brlo .L5
181 .L6:
182 sub r18,r30
183 004c 3196 sbc r19,r31
185 0050 F307 .LM13:
186 0052 00F0 movw r24,r18
187 sbiw r24,1
188 0054 2E1B /* epilogue: frame size=0 */
189 0056 3F0B ret
46:sosos.c **** break;
47:sosos.c **** }
48:sosos.c ****
49:sosos.c **** i=TCB[pri*SOSOS_MAX_TASK_PER_PRI+id].TASK_STACK_BUTTON-1-i;
50:sosos.c ****
51:sosos.c **** return i;
52:sosos.c **** }
190 (size=1) */
191 /* function SOSOS_TASK_STACK_CASE size 38 (37) */
196 .Lscope1:
198 .global SososInitOs
200 SososInitOs:
202 .LM14:
203 /* prologue: frame size=0 */
204 /* prologue end (size=0) */
206 .LM15:
53:sosos.c **** #endif
54:sosos.c ****
55:sosos.c **** #if SOSOS_TASK_ENALBE == 1
56:sosos.c **** void SososInitOs(void)//初始化SOSOS系统
57:sosos.c **** //本函数用于初始化SOSOS系统,应在调用任何系统函数前调用一次
58:sosos.c **** {
207 8,0,63,.LM16-SososInitOs
208 .LM16:
209 clr r8
59:sosos.c **** #if ERROR_DETECT_ENABLE == 1
60:sosos.c **** unsigned char i;
61:sosos.c ****
62:sosos.c **** SOSOS_WAIT_TASK=0;
211 7:
212 clr r13
63:sosos.c **** SOSOS_TIMESLICE=0;
214 18:
215 clr r7
64:sosos.c **** SOSOS_INT_NEST=0;
217 19:
218 ldi r17,lo8(0)
65:sosos.c **** SOSOS_TICKS=0;
220 20:
221 sts (SOSOS_MUTEX_POINT)+1,__zero_reg__
222 0064 7724 sts SOSOS_MUTEX_POINT,__zero_reg__
66:sosos.c **** SOSOS_STATE=0;
223 tabn 68,0,72,.LM21-SososInitOs
224 .LM21:
225 0066 10E0 sts SOSOS_TASK_READY,__zero_reg__
67:sosos.c **** #if SOSOS_MUTEX_ENABLE == 1
68:sosos.c **** SOSOS_MUTEX_POINT=0;
226 s SOSOS_TASK_READY+1,__zero_reg__
227 sts SOSOS_TASK_READY+2,__zero_reg__
229 006c 1092 0000 .LM22:
69:sosos.c **** #endif
70:sosos.c ****
71:sosos.c **** for(i=0;i<SOSOS_PRI_MAX;i++){
72:sosos.c **** SOSOS_TASK_READY[i]=0;
230 (TCB)+1,__zero_reg__
231 sts TCB,__zero_reg__
232 0070 1092 0000 sts (TCB+10)+1,__zero_reg__
233 0074 1092 0000 sts TCB+10,__zero_reg__
234 0078 1092 0000 sts (TCB+20)+1,__zero_reg__
73:sosos.c **** }
74:sosos.c **** for(i=0;i<SOSOS_PRI_MAX*SOSOS_MAX_TASK_PER_PRI;i++){
75:sosos.c **** TCB[i].TASK_STACK_POINT=0;
235 TCB+20,__zero_reg__
236 sts (TCB+30)+1,__zero_reg__
237 007c 1092 0000 sts TCB+30,__zero_reg__
238 0080 1092 0000 sts (TCB+40)+1,__zero_reg__
239 0084 1092 0000 sts TCB+40,__zero_reg__
240 0088 1092 0000 sts (TCB+50)+1,__zero_reg__
241 008c 1092 0000 sts TCB+50,__zero_reg__
242 0090 1092 0000 ldi r30,lo8(SOSOS_TASK_STACK)
243 0094 1092 0000 ldi r31,hi8(SOSOS_TASK_STACK)
244 0098 1092 0000 ldi r24,lo8(-86)
245 009c 1092 0000 .L11:
247 00a4 1092 0000 .LM23:
248 00a8 1092 0000 st Z+,r24
250 00ae F0E0 .LM24:
251 00b0 8AEA ldi r25,hi8(SOSOS_TASK_STACK+200)
252 cpi r30,lo8(SOSOS_TASK_STACK+200)
76:sosos.c **** }
77:sosos.c **** #endif
78:sosos.c **** #if STACK_SIZE_REPORT_ENABLE == 1
79:sosos.c **** unsigned int fill;
80:sosos.c **** for(fill=0;fill<SOSOS_TASK_STACK_SIZE;fill++)
81:sosos.c **** SOSOS_TASK_STACK[fill]=INIT_STACK_FILL_BYTES;
253 .L11
255 00b2 8193 .LM25:
256 sbiw r30,1
257 sts (SOSOS_TASK_STACK_TOP)+1,r31
258 00b4 90E0 sts SOSOS_TASK_STACK_TOP,r30
259 00b6 E030 /* epilogue: frame size=0 */
260 00b8 F907 ret
261 00ba 01F4 /* epilogue end (size=1) */
82:sosos.c **** #endif
83:sosos.c **** SOSOS_TASK_STACK_TOP=(SOSOS_ADDRESS)SOSOS_TASK_STACK+SOSOS_TASK_STACK_SIZE-1;
262 on SososInitOs size 53 (52) */
264 00bc 3197 .Lscope2:
266 00c2 E093 0000 .global SososTimer0
268 00c6 0895 SososTimer0:
270 .LM26:
271 /* prologue: frame size=6 */
272 push r16
273 push r28
274 push r29
275 in r28,__SP_L__
276 in r29,__SP_H__
84:sosos.c **** }
85:sosos.c **** #endif
86:sosos.c ****
87:sosos.c **** #if SOSOS_TASK_ENALBE == 1
88:sosos.c **** void SososTimer0(void)//延时和超时处理
89:sosos.c **** //本函数在定时器0的中断函数中调用,调用时中断时开着的
90:sosos.c **** //用于出来处理时间片轮换和所有的延时操作
91:sosos.c **** {
277 __tmp_reg__,__SREG__
278 cli
279 out __SP_H__,r29
280 00c8 0F93 out __SREG__,__tmp_reg__
281 00ca CF93 out __SP_L__,r28
282 00cc DF93 /* prologue end (size=11) */
284 00d0 DEB7 .LM27:
285 00d2 2697 /* #APP */
286 00d4 0FB6 CLI
287 00d6 F894
288 00d8 DEBF /* #NOAPP */
289 00da 0FBE mov r18,r9
291 .LM28:
92:sosos.c **** unsigned char i,j,tmpi,tmpj;
93:sosos.c **** SOSOS_TCB *point;
94:sosos.c **** //超时处理
95:sosos.c **** point=TCB;
96:sosos.c **** tmpi=1;
97:sosos.c **** DISABLE_INTERRUPT();
292 i r19,lo8(1)
293 ldi r20,lo8(TCB)
294 ldi r21,hi8(TCB)
295 00de F894 ldi r22,lo8(0)
296 ldi r23,hi8(0)
297 ldi r24,lo8(SOSOS_TASK_READY)
298 00e0 292D ldi r25,hi8(SOSOS_TASK_READY)
98:sosos.c **** for(i=0;i<SOSOS_PRI_MAX;i++){
99:sosos.c **** if((SOSOS_WAIT_TASK&tmpi)==0){
100:sosos.c **** point=point+SOSOS_MAX_TASK_PER_PRI;//指向下一优先级
101:sosos.c **** tmpi=tmpi<<1;
102:sosos.c **** continue;
103:sosos.c **** }
104:sosos.c **** tmpj=1;
105:sosos.c **** SOSOS_WAIT_TASK=SOSOS_WAIT_TASK&(~tmpi);
106:sosos.c **** for(j=0;j<SOSOS_MAX_TASK_PER_PRI;j++){
107:sosos.c **** if((point->TASK_STATE>=TASK_STATE_DELAY)&&(point->TASK_STATE<TASK_STATE_SEM_TIMEOUT)){
108:sosos.c **** if(point->TASK_TIMEOUT>0){
109:sosos.c **** point->TASK_TIMEOUT--;
110:sosos.c **** if(point->TASK_TIMEOUT==0){
111:sosos.c **** SOSOS_TASK_READY[i]=SOSOS_TASK_READY[i]|tmpj;
112:sosos.c **** if(point->TASK_STATE>TASK_STATE_DELAY)
113:sosos.c **** point->TASK_STATE=point->TASK_STATE+TASK_STATE_TIMEOUT_OFFSET;
114:sosos.c **** else
115:sosos.c **** point->TASK_STATE=TASK_STATE_OK;
116:sosos.c **** #if SOSOS_MUTEX_ENABLE == 1
117:sosos.c **** if(SOSOS_RUNNING_INHERIT_PRI>i){
299 6,r25
300 std Y+5,r24
301 00e2 062D .L17:
303 00e6 40E0 .LM29:
304 00e8 50E0 mov r24,r18
305 00ea 60E0 and r24,r19
306 00ec 70E0 breq .L31
308 00f0 90E0 .LM30:
309 00f2 9E83 mov r24,r19
310 00f4 8D83 com r24
311 and r18,r24
312 movw r26,r20
313 std Y+2,__zero_reg__
314 00f6 822F ldi r25,lo8(1)
315 00f8 8323 std Y+1,r25
316 00fa 01F0 ldd r30,Y+5
317 ldd r31,Y+6
318 std Y+4,r31
319 00fc 832F std Y+3,r30
320 00fe 8095 .L21:
322 0102 DA01 .LM31:
323 0104 1A82 movw r30,r26
324 0106 91E0 ldd r25,Z+6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -