📄 dataqueue.lst
字号:
1 .file "dataqueue.c"
2 .arch atmega128
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:
93 .global QueueInit
95 QueueInit:
1:dataqueue.c **** /*
2:dataqueue.c **** ****************************************************************************
3:dataqueue.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
4:dataqueue.c **** * http:\\www.nbicc.com
5:dataqueue.c **** *文件名: dataqueue.c
6:dataqueue.c **** *程序员: 蒋文丰
7:dataqueue.c **** *主要内容:数据包缓存的队列管理
8:dataqueue.c **** *
9:dataqueue.c **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
10:dataqueue.c **** ****************************************************************************
11:dataqueue.c **** */
12:dataqueue.c **** /////
13:dataqueue.c **** #include "led.h"
14:dataqueue.c **** #include "type.h"
15:dataqueue.c **** #include "message.h"
16:dataqueue.c **** #include "mac.h"
17:dataqueue.c **** #include "dataqueue.h"
18:dataqueue.c **** #include "os.h"
19:dataqueue.c **** #include "route.h"
20:dataqueue.c **** #include "app.h"
21:dataqueue.c **** #include "global.h"
22:dataqueue.c **** static void routeSendTask(void);
23:dataqueue.c **** static void routeSendBroadcast(void);
24:dataqueue.c **** static void routeSendLocalMsg(void);
25:dataqueue.c **** static uint8_t enqueue_next; //队列尾指针
26:dataqueue.c **** static uint8_t dequeue_next; //队列头指针
27:dataqueue.c **** static bool QueueIdle; //队列的互斥变量
28:dataqueue.c **** static uint8_t FreeAreaInQueue;//队列中的可用的空间数目
29:dataqueue.c ****
30:dataqueue.c **** extern uint8_t currentparent;
31:dataqueue.c **** static uint8_t TimeMask;
32:dataqueue.c **** static uint8_t nextAddr;
33:dataqueue.c **** static uint8_t QueueBroadcastState;
34:dataqueue.c **** static uint8_t QueueLocalMsgState;
35:dataqueue.c **** enum {IDLE,WRITE,USEFULL};
36:dataqueue.c **** void QueueInit(void){ //mac层的调用在mac.c中被调用
97 .LM1:
98 /* prologue: frame size=0 */
99 /* prologue end (size=0) */
37:dataqueue.c **** TimeMask = 0;
101 .LM2:
102 0000 1092 0000 sts TimeMask,__zero_reg__
38:dataqueue.c **** enqueue_next = 0;
104 .LM3:
105 0004 1092 0000 sts enqueue_next,__zero_reg__
106 0008 80E0 ldi r24,lo8(0)
107 000a E0E0 ldi r30,lo8(Queuemsgqueue)
108 000c F0E0 ldi r31,hi8(Queuemsgqueue)
109 .L5:
39:dataqueue.c **** for( ;enqueue_next < MESSAGE_QUEUE_SIZE ; enqueue_next ++ )
40:dataqueue.c **** Queuemsgqueue[enqueue_next].length = 0 ;
111 .LM4:
112 000e 1082 st Z,__zero_reg__
113 0010 FE96 adiw r30,62
115 .LM5:
116 0012 8F5F subi r24,lo8(-(1))
117 0014 8630 cpi r24,lo8(6)
118 0016 D8F3 brlo .L5
41:dataqueue.c **** enqueue_next = 0;
120 .LM6:
121 0018 1092 0000 sts enqueue_next,__zero_reg__
42:dataqueue.c **** dequeue_next = 0;
123 .LM7:
124 001c 1092 0000 sts dequeue_next,__zero_reg__
43:dataqueue.c **** FreeAreaInQueue = MESSAGE_QUEUE_SIZE;
126 .LM8:
127 0020 86E0 ldi r24,lo8(6)
128 0022 8093 0000 sts FreeAreaInQueue,r24
44:dataqueue.c **** QueueIdle = TRUE;
130 .LM9:
131 0026 81E0 ldi r24,lo8(1)
132 0028 8093 0000 sts QueueIdle,r24
45:dataqueue.c **** QueueBroadcastState = IDLE;
134 .LM10:
135 002c 1092 0000 sts QueueBroadcastState,__zero_reg__
46:dataqueue.c **** QueueLocalMsgState = IDLE;
137 .LM11:
138 0030 1092 0000 sts QueueLocalMsgState,__zero_reg__
139 /* epilogue: frame size=0 */
140 0034 0895 ret
141 /* epilogue end (size=1) */
142 /* function QueueInit size 27 (26) */
148 .global InQueue
150 InQueue:
47:dataqueue.c **** }
48:dataqueue.c **** /**************************************************************************
49:dataqueue.c **** *功能描述:数据入缓冲队列
50:dataqueue.c **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
51:dataqueue.c **** enum PACKETTYPE {
52:dataqueue.c **** BROADCAST = 4,
53:dataqueue.c **** SENSOR = 3
54:dataqueue.c **** };
55:dataqueue.c **** adress 表示下一调的地址还是广播地址,由type决定
56:dataqueue.c **** length 数据包的长度
57:dataqueue.c **** msg 数据包地址
58:dataqueue.c ****
59:dataqueue.c **** *返回值:
60:dataqueue.c **** **************************************************************************/
61:dataqueue.c **** result_t InQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg) {
152 .LM12:
153 /* prologue: frame size=0 */
154 0036 0F93 push r16
155 0038 1F93 push r17
156 003a CF93 push r28
157 003c DF93 push r29
158 /* prologue end (size=4) */
159 003e 082F mov r16,r24
160 0040 162F mov r17,r22
161 0042 EA01 movw r28,r20
62:dataqueue.c ****
63:dataqueue.c **** if ((enqueue_next + 1) % MESSAGE_QUEUE_SIZE == dequeue_next) {
163 .LM13:
164 0044 8091 0000 lds r24,enqueue_next
165 0048 E82F mov r30,r24
166 004a FF27 clr r31
167 004c CF01 movw r24,r30
168 004e 0196 adiw r24,1
169 0050 66E0 ldi r22,lo8(6)
170 0052 70E0 ldi r23,hi8(6)
171 0054 0E94 0000 call __divmodhi4
172 0058 2091 0000 lds r18,dequeue_next
173 005c 3327 clr r19
174 005e 8217 cp r24,r18
175 0060 9307 cpc r25,r19
176 0062 39F4 brne .L10
64:dataqueue.c **** OSPostTask(routeSendTask); //队列满,调用任务,加快传输
178 .LM14:
179 0064 80E0 ldi r24,lo8(pm(routeSendTask))
180 0066 90E0 ldi r25,hi8(pm(routeSendTask))
181 0068 0E94 0000 call OSPostTask
65:dataqueue.c **** return FAIL;
183 .LM15:
184 006c 80E0 ldi r24,lo8(0)
185 006e 90E0 ldi r25,hi8(0)
186 0070 2EC0 rjmp .L9
187 .L10:
66:dataqueue.c **** }
67:dataqueue.c **** if(QueueIdle == TRUE) {
189 .LM16:
190 0072 3091 0000 lds r19,QueueIdle
191 0076 3130 cpi r19,lo8(1)
192 0078 41F5 brne .L11
68:dataqueue.c **** QueueIdle = FALSE;
194 .LM17:
195 007a 1092 0000 sts QueueIdle,__zero_reg__
69:dataqueue.c **** //设置队列内容
70:dataqueue.c **** Queuemsgqueue[enqueue_next].length = length;
197 .LM18:
198 007e 8EE3 ldi r24,lo8(62)
199 0080 90E0 ldi r25,hi8(62)
200 0082 E89F mul r30,r24
201 0084 A001 movw r20,r0
202 0086 E99F mul r30,r25
203 0088 500D add r21,r0
204 008a F89F mul r31,r24
205 008c 500D add r21,r0
206 008e 1124 clr r1
207 0090 FA01 movw r30,r20
208 0092 E050 subi r30,lo8(-(Queuemsgqueue))
209 0094 F040 sbci r31,hi8(-(Queuemsgqueue))
210 0096 1083 st Z,r17
71:dataqueue.c **** Queuemsgqueue[enqueue_next].type = type;
212 .LM19:
213 0098 0183 std Z+1,r16
72:dataqueue.c **** Queuemsgqueue[enqueue_next].Msg = *msg;
215 .LM20:
216 009a 2CE3 ldi r18,lo8(60)
217 009c FA01 movw r30,r20
218 009e E050 subi r30,lo8(-(Queuemsgqueue+2))
219 00a0 F040 sbci r31,hi8(-(Queuemsgqueue+2))
220 00a2 DE01 movw r26,r28
221 00a4 0D90 ld __tmp_reg__,X+
222 00a6 0192 st Z+,__tmp_reg__
223 00a8 2A95 dec r18
224 00aa E1F7 brne .-8
73:dataqueue.c **** enqueue_next++; //进入队列数目加1
226 .LM21:
227 00ac 8091 0000 lds r24,enqueue_next
74:dataqueue.c **** enqueue_next %= MESSAGE_QUEUE_SIZE;
229 .LM22:
230 00b0 8F5F subi r24,lo8(-(1))
231 00b2 66E0 ldi r22,lo8(6)
232 00b4 0E94 0000 call __udivmodqi4
233 00b8 9093 0000 sts enqueue_next,r25
75:dataqueue.c **** FreeAreaInQueue = FreeAreaInQueue - 1;
235 .LM23:
236 00bc 8091 0000 lds r24,FreeAreaInQueue
237 00c0 8150 subi r24,lo8(-(-1))
238 00c2 8093 0000 sts FreeAreaInQueue,r24
76:dataqueue.c **** QueueIdle = TRUE;
240 .LM24:
241 00c6 3093 0000 sts QueueIdle,r19
242 .L11:
77:dataqueue.c **** }
78:dataqueue.c **** return SUCCESS;
244 .LM25:
245 00ca 81E0 ldi r24,lo8(1)
246 00cc 90E0 ldi r25,hi8(1)
247 .L9:
248 /* epilogue: frame size=0 */
249 00ce DF91 pop r29
250 00d0 CF91 pop r28
251 00d2 1F91 pop r17
252 00d4 0F91 pop r16
253 00d6 0895 ret
254 /* epilogue end (size=5) */
255 /* function InQueue size 81 (72) */
261 .global InBroadQueue
263 InBroadQueue:
79:dataqueue.c **** }
80:dataqueue.c ****
81:dataqueue.c **** /**************************************************************************
82:dataqueue.c **** *功能描述:广播包入缓冲区
83:dataqueue.c **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
84:dataqueue.c **** enum PACKETTYPE {
85:dataqueue.c **** BROADCAST = 4,
86:dataqueue.c **** SENSOR = 3
87:dataqueue.c **** };
88:dataqueue.c **** adress 表示下一调的地址还是广播地址,由type决定
89:dataqueue.c **** length 数据包的长度
90:dataqueue.c **** msg 数据包地址
91:dataqueue.c ****
92:dataqueue.c **** *返回值:
93:dataqueue.c **** **************************************************************************/
94:dataqueue.c **** result_t InBroadQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg) {
265 .LM26:
266 /* prologue: frame size=0 */
267 /* prologue end (size=0) */
268 00d8 982F mov r25,r24
95:dataqueue.c **** if(QueueBroadcastState == IDLE){
270 .LM27:
271 00da 8091 0000 lds r24,QueueBroadcastState
272 00de 8823 tst r24
273 00e0 A9F4 brne .L13
96:dataqueue.c **** QueueBroadcastState = WRITE;
275 .LM28:
276 00e2 81E0 ldi r24,lo8(1)
277 00e4 8093 0000 sts QueueBroadcastState,r24
97:dataqueue.c **** QueueBroadcast.length = length;
279 .LM29:
280 00e8 6093 0000 sts QueueBroadcast,r22
98:dataqueue.c **** QueueBroadcast.type = type;
282 .LM30:
283 00ec 9093 0000 sts QueueBroadcast+1,r25
99:dataqueue.c **** QueueBroadcast.Msg = *msg;
285 .LM31:
286 00f0 8CE3 ldi r24,lo8(60)
287 00f2 A0E0 ldi r26,lo8(QueueBroadcast+2)
288 00f4 B0E0 ldi r27,hi8(QueueBroadcast+2)
289 00f6 FA01 movw r30,r20
290 00f8 0190 ld __tmp_reg__,Z+
291 00fa 0D92 st X+,__tmp_reg__
292 00fc 8A95 dec r24
293 00fe E1F7 brne .-8
100:dataqueue.c **** QueueBroadcastState = USEFULL;
295 .LM32:
296 0100 82E0 ldi r24,lo8(2)
297 0102 8093 0000 sts QueueBroadcastState,r24
101:dataqueue.c **** return 1;
299 .LM33:
300 0106 81E0 ldi r24,lo8(1)
301 0108 90E0 ldi r25,hi8(1)
302 010a 0895 ret
303 .L13:
102:dataqueue.c **** }else{
103:dataqueue.c **** return 0;
305 .LM34:
306 010c 80E0 ldi r24,lo8(0)
307 010e 90E0 ldi r25,hi8(0)
104:dataqueue.c **** }
105:dataqueue.c **** }
309 .LM35:
310 0110 0895 ret
311 /* epilogue: frame size=0 */
312 0112 0895 ret
313 /* epilogue end (size=1) */
314 /* function InBroadQueue size 30 (29) */
320 .global InLocalMsgQueue
322 InLocalMsgQueue:
106:dataqueue.c ****
107:dataqueue.c **** /**************************************************************************
108:dataqueue.c **** *功能描述:本地数据包入缓冲区
109:dataqueue.c **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
110:dataqueue.c **** enum PACKETTYPE {
111:dataqueue.c **** BROADCAST = 4,
112:dataqueue.c **** SENSOR = 3
113:dataqueue.c **** };
114:dataqueue.c **** adress 表示下一调的地址还是广播地址,由type决定
115:dataqueue.c **** length 数据包的长度
116:dataqueue.c **** msg 数据包地址
117:dataqueue.c ****
118:dataqueue.c **** *返回值:
119:dataqueue.c **** **************************************************************************/
120:dataqueue.c **** result_t InLocalMsgQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg){
324 .LM36:
325 /* prologue: frame size=0 */
326 /* prologue end (size=0) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -