📄 os_q.lst
字号:
1 .file "os_q.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:
131 .global OSQAccept
133 OSQAccept:
1:os/source/os_q.c **** /*
2:os/source/os_q.c **** ***************************************************************************************************
3:os/source/os_q.c **** * uC/OS-II
4:os/source/os_q.c **** * The Real-Time Kernel
5:os/source/os_q.c **** * MESSAGE QUEUE MANAGEMENT
6:os/source/os_q.c **** *
7:os/source/os_q.c **** * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
8:os/source/os_q.c **** * All Rights Reserved
9:os/source/os_q.c **** *
10:os/source/os_q.c **** * File : OS_Q.C
11:os/source/os_q.c **** * By : Jean J. Labrosse
12:os/source/os_q.c **** ***************************************************************************************************
13:os/source/os_q.c **** */
14:os/source/os_q.c ****
15:os/source/os_q.c **** #ifndef OS_MASTER_FILE
16:os/source/os_q.c **** #include <include.h>
17:os/source/os_q.c **** #endif
18:os/source/os_q.c ****
19:os/source/os_q.c **** #if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
20:os/source/os_q.c **** /*
21:os/source/os_q.c **** ***************************************************************************************************
22:os/source/os_q.c **** * ACCEPT MESSAGE FROM QUEUE
23:os/source/os_q.c **** *
24:os/source/os_q.c **** * Description: This function checks the queue to see if a message is available. Unlike OSQPend(),
25:os/source/os_q.c **** * OSQAccept() does not suspend the calling task if a message is not available.
26:os/source/os_q.c **** *
27:os/source/os_q.c **** * Arguments : pevent is a pointer to the event control block
28:os/source/os_q.c **** *
29:os/source/os_q.c **** * Returns : != (void *)0 is the message in the queue if one is available. The message is remov
30:os/source/os_q.c **** * from the so the next time OSQAccept() is called, the queue will contai
31:os/source/os_q.c **** * one less entry.
32:os/source/os_q.c **** * == (void *)0 if the queue is empty or,
33:os/source/os_q.c **** * if 'pevent' is a NULL pointer or,
34:os/source/os_q.c **** * if you passed an invalid event type
35:os/source/os_q.c **** ***************************************************************************************************
36:os/source/os_q.c **** */
37:os/source/os_q.c ****
38:os/source/os_q.c **** #if OS_Q_ACCEPT_EN > 0
39:os/source/os_q.c **** void *OSQAccept (OS_EVENT *pevent)
40:os/source/os_q.c **** {
135 .LM1:
136 /* prologue: frame size=0 */
137 0000 CF93 push r28
138 0002 DF93 push r29
139 /* prologue end (size=2) */
140 0004 FC01 movw r30,r24
41:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
42:os/source/os_q.c **** OS_CPU_SR cpu_sr;
43:os/source/os_q.c **** #endif
44:os/source/os_q.c **** void *msg;
45:os/source/os_q.c **** OS_Q *pq;
46:os/source/os_q.c ****
47:os/source/os_q.c ****
48:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
49:os/source/os_q.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
50:os/source/os_q.c **** return ((void *)0);
51:os/source/os_q.c **** }
52:os/source/os_q.c **** if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type
53:os/source/os_q.c **** return ((void *)0);
54:os/source/os_q.c **** }
55:os/source/os_q.c **** #endif
56:os/source/os_q.c **** OS_ENTER_CRITICAL();
142 .LM2:
143 /* #APP */
144 0006 F894 cli
57:os/source/os_q.c **** pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block
146 .LM3:
147 /* #NOAPP */
148 0008 A481 ldd r26,Z+4
149 000a B581 ldd r27,Z+5
58:os/source/os_q.c **** if (pq->OSQEntries != 0) { /* See if any messages in the queue
151 .LM4:
152 000c ED01 movw r28,r26
153 000e 2C85 ldd r18,Y+12
154 0010 3D85 ldd r19,Y+13
155 0012 2115 cp r18,__zero_reg__
156 0014 3105 cpc r19,__zero_reg__
157 0016 A9F0 breq .L2
59:os/source/os_q.c **** msg = *pq->OSQOut++; /* Yes, extract oldest message from the queue
159 .LM5:
160 0018 E885 ldd r30,Y+8
161 001a F985 ldd r31,Y+9
162 001c 8191 ld r24,Z+
163 001e 9191 ld r25,Z+
164 0020 F987 std Y+9,r31
165 0022 E887 std Y+8,r30
166 0024 AC01 movw r20,r24
60:os/source/os_q.c **** pq->OSQEntries--; /* Update the number of entries in the queue
168 .LM6:
169 0026 2150 subi r18,lo8(-(-1))
170 0028 3040 sbci r19,hi8(-(-1))
171 002a 3D87 std Y+13,r19
172 002c 2C87 std Y+12,r18
61:os/source/os_q.c **** if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the qu
174 .LM7:
175 002e 8C81 ldd r24,Y+4
176 0030 9D81 ldd r25,Y+5
177 0032 E817 cp r30,r24
178 0034 F907 cpc r31,r25
179 0036 31F4 brne .L4
62:os/source/os_q.c **** pq->OSQOut = pq->OSQStart;
181 .LM8:
182 0038 8A81 ldd r24,Y+2
183 003a 9B81 ldd r25,Y+3
184 003c 9987 std Y+9,r25
185 003e 8887 std Y+8,r24
186 0040 01C0 rjmp .L4
187 .L2:
63:os/source/os_q.c **** }
64:os/source/os_q.c **** } else {
65:os/source/os_q.c **** msg = (void *)0; /* Queue is empty
189 .LM9:
190 0042 A901 movw r20,r18
191 .L4:
66:os/source/os_q.c **** }
67:os/source/os_q.c **** OS_EXIT_CRITICAL();
193 .LM10:
194 /* #APP */
195 0044 7894 sei
68:os/source/os_q.c **** return (msg); /* Return message received (or NULL)
69:os/source/os_q.c **** }
197 .LM11:
198 /* #NOAPP */
199 0046 CA01 movw r24,r20
200 /* epilogue: frame size=0 */
201 0048 DF91 pop r29
202 004a CF91 pop r28
203 004c 0895 ret
204 /* epilogue end (size=3) */
205 /* function OSQAccept size 41 (36) */
211 .Lscope0:
215 .global OSQCreate
217 OSQCreate:
70:os/source/os_q.c **** #endif
71:os/source/os_q.c **** /*$PAGE*/
72:os/source/os_q.c **** /*
73:os/source/os_q.c **** ***************************************************************************************************
74:os/source/os_q.c **** * CREATE A MESSAGE QUEUE
75:os/source/os_q.c **** *
76:os/source/os_q.c **** * Description: This function creates a message queue if free event control blocks are available.
77:os/source/os_q.c **** *
78:os/source/os_q.c **** * Arguments : start is a pointer to the base address of the message queue storage area. T
79:os/source/os_q.c **** * storage area MUST be declared as an array of pointers to 'void' as fol
80:os/source/os_q.c **** *
81:os/source/os_q.c **** * void *MessageStorage[size]
82:os/source/os_q.c **** *
83:os/source/os_q.c **** * size is the number of elements in the storage area
84:os/source/os_q.c **** *
85:os/source/os_q.c **** * Returns : != (OS_EVENT *)0 is a pointer to the event control clock (OS_EVENT) associated with
86:os/source/os_q.c **** * created queue
87:os/source/os_q.c **** * == (OS_EVENT *)0 if no event control blocks were available or an error was detected
88:os/source/os_q.c **** ***************************************************************************************************
89:os/source/os_q.c **** */
90:os/source/os_q.c ****
91:os/source/os_q.c **** OS_EVENT *OSQCreate (void **start, INT16U size)
92:os/source/os_q.c **** {
219 .LM12:
220 /* prologue: frame size=0 */
221 004e CF93 push r28
222 0050 DF93 push r29
223 /* prologue end (size=2) */
224 0052 9C01 movw r18,r24
93:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
94:os/source/os_q.c **** OS_CPU_SR cpu_sr;
95:os/source/os_q.c **** #endif
96:os/source/os_q.c **** OS_EVENT *pevent;
97:os/source/os_q.c **** OS_Q *pq;
98:os/source/os_q.c ****
99:os/source/os_q.c ****
100:os/source/os_q.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
226 .LM13:
227 0054 8091 0000 lds r24,OSIntNesting
228 0058 8823 tst r24
229 005a 19F0 breq .L6
101:os/source/os_q.c **** return ((OS_EVENT *)0); /* ... can't CREATE from an ISR
231 .LM14:
232 005c 80E0 ldi r24,lo8(0)
233 005e 90E0 ldi r25,hi8(0)
234 0060 47C0 rjmp .L5
235 .L6:
102:os/source/os_q.c **** }
103:os/source/os_q.c **** OS_ENTER_CRITICAL();
237 .LM15:
238 /* #APP */
239 0062 F894 cli
104:os/source/os_q.c **** pevent = OSEventFreeList; /* Get next free event control block
241 .LM16:
242 /* #NOAPP */
243 0064 C091 0000 lds r28,OSEventFreeList
244 0068 D091 0000 lds r29,(OSEventFreeList)+1
105:os/source/os_q.c **** if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty
246 .LM17:
247 006c 2097 sbiw r28,0
248 006e 31F0 breq .L7
106:os/source/os_q.c **** OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
250 .LM18:
251 0070 8C81 ldd r24,Y+4
252 0072 9D81 ldd r25,Y+5
253 0074 9093 0000 sts (OSEventFreeList)+1,r25
254 0078 8093 0000 sts OSEventFreeList,r24
255 .L7:
107:os/source/os_q.c **** }
108:os/source/os_q.c **** OS_EXIT_CRITICAL();
257 .LM19:
258 /* #APP */
259 007c 7894 sei
109:os/source/os_q.c **** if (pevent != (OS_EVENT *)0) { /* See if we have an event control block
261 .LM20:
262 /* #NOAPP */
263 007e 2097 sbiw r28,0
264 0080 B1F1 breq .L8
110:os/source/os_q.c **** OS_ENTER_CRITICAL(); /* Get a free queue control block
266 .LM21:
267 /* #APP */
268 0082 F894 cli
111:os/source/os_q.c **** pq = OSQFreeList;
270 .LM22:
271 /* #NOAPP */
272 0084 E091 0000 lds r30,OSQFreeList
273 0088 F091 0000 lds r31,(OSQFreeList)+1
112:os/source/os_q.c **** if (OSQFreeList != (OS_Q *)0) {
275 .LM23:
276 008c 3097 sbiw r30,0
277 008e 31F0 breq .L9
113:os/source/os_q.c **** OSQFreeList = OSQFreeList->OSQPtr;
279 .LM24:
280 0090 8081 ld r24,Z
281 0092 9181 ldd r25,Z+1
282 0094 9093 0000 sts (OSQFreeList)+1,r25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -