📄 os_q.lst
字号:
283 0098 8093 0000 sts OSQFreeList,r24
284 .L9:
114:os/source/os_q.c **** }
115:os/source/os_q.c **** OS_EXIT_CRITICAL();
286 .LM25:
287 /* #APP */
288 009c 7894 sei
116:os/source/os_q.c **** if (pq != (OS_Q *)0) { /* See if we were able to get a queue control bloc
290 .LM26:
291 /* #NOAPP */
292 009e 3097 sbiw r30,0
293 00a0 C9F0 breq .L10
117:os/source/os_q.c **** pq->OSQStart = start; /* Yes, initialize the queue
295 .LM27:
296 00a2 3383 std Z+3,r19
297 00a4 2283 std Z+2,r18
118:os/source/os_q.c **** pq->OSQEnd = &start[size];
299 .LM28:
300 00a6 CB01 movw r24,r22
301 00a8 860F add r24,r22
302 00aa 971F adc r25,r23
303 00ac 820F add r24,r18
304 00ae 931F adc r25,r19
305 00b0 9583 std Z+5,r25
306 00b2 8483 std Z+4,r24
119:os/source/os_q.c **** pq->OSQIn = start;
308 .LM29:
309 00b4 3783 std Z+7,r19
310 00b6 2683 std Z+6,r18
120:os/source/os_q.c **** pq->OSQOut = start;
312 .LM30:
313 00b8 3187 std Z+9,r19
314 00ba 2087 std Z+8,r18
121:os/source/os_q.c **** pq->OSQSize = size;
316 .LM31:
317 00bc 7387 std Z+11,r23
318 00be 6287 std Z+10,r22
122:os/source/os_q.c **** pq->OSQEntries = 0;
320 .LM32:
321 00c0 1586 std Z+13,__zero_reg__
322 00c2 1486 std Z+12,__zero_reg__
123:os/source/os_q.c **** pevent->OSEventType = OS_EVENT_TYPE_Q;
324 .LM33:
325 00c4 82E0 ldi r24,lo8(2)
326 00c6 8883 st Y,r24
124:os/source/os_q.c **** pevent->OSEventPtr = pq;
328 .LM34:
329 00c8 FD83 std Y+5,r31
330 00ca EC83 std Y+4,r30
125:os/source/os_q.c **** OS_EventWaitListInit(pevent);
332 .LM35:
333 00cc CE01 movw r24,r28
334 00ce 0E94 0000 call OS_EventWaitListInit
335 00d2 0DC0 rjmp .L8
336 .L10:
126:os/source/os_q.c **** } else { /* No, since we couldn't get a queue control bloc
127:os/source/os_q.c **** OS_ENTER_CRITICAL(); /* Return event control block on error
338 .LM36:
339 /* #APP */
340 00d4 F894 cli
128:os/source/os_q.c **** pevent->OSEventPtr = (void *)OSEventFreeList;
342 .LM37:
343 /* #NOAPP */
344 00d6 8091 0000 lds r24,OSEventFreeList
345 00da 9091 0000 lds r25,(OSEventFreeList)+1
346 00de 9D83 std Y+5,r25
347 00e0 8C83 std Y+4,r24
129:os/source/os_q.c **** OSEventFreeList = pevent;
349 .LM38:
350 00e2 D093 0000 sts (OSEventFreeList)+1,r29
351 00e6 C093 0000 sts OSEventFreeList,r28
130:os/source/os_q.c **** OS_EXIT_CRITICAL();
353 .LM39:
354 /* #APP */
355 00ea 7894 sei
131:os/source/os_q.c **** pevent = (OS_EVENT *)0;
357 .LM40:
358 /* #NOAPP */
359 00ec EF01 movw r28,r30
360 .L8:
132:os/source/os_q.c **** }
133:os/source/os_q.c **** }
134:os/source/os_q.c **** return (pevent);
362 .LM41:
363 00ee CE01 movw r24,r28
364 .L5:
365 /* epilogue: frame size=0 */
366 00f0 DF91 pop r29
367 00f2 CF91 pop r28
368 00f4 0895 ret
369 /* epilogue end (size=3) */
370 /* function OSQCreate size 90 (85) */
376 .Lscope1:
379 .global OSQFlush
381 OSQFlush:
135:os/source/os_q.c **** }
136:os/source/os_q.c **** /*$PAGE*/
137:os/source/os_q.c **** /*
138:os/source/os_q.c **** ***************************************************************************************************
139:os/source/os_q.c **** * DELETE A MESSAGE QUEUE
140:os/source/os_q.c **** *
141:os/source/os_q.c **** * Description: This function deletes a message queue and readies all tasks pending on the queue.
142:os/source/os_q.c **** *
143:os/source/os_q.c **** * Arguments : pevent is a pointer to the event control block associated with the desired
144:os/source/os_q.c **** * queue.
145:os/source/os_q.c **** *
146:os/source/os_q.c **** * opt determines delete options as follows:
147:os/source/os_q.c **** * opt == OS_DEL_NO_PEND Delete the queue ONLY if no task pending
148:os/source/os_q.c **** * opt == OS_DEL_ALWAYS Deletes the queue even if tasks are waiting.
149:os/source/os_q.c **** * In this case, all the tasks pending will be re
150:os/source/os_q.c **** *
151:os/source/os_q.c **** * err is a pointer to an error code that can contain one of the following va
152:os/source/os_q.c **** * OS_NO_ERR The call was successful and the queue was dele
153:os/source/os_q.c **** * OS_ERR_DEL_ISR If you tried to delete the queue from an ISR
154:os/source/os_q.c **** * OS_ERR_INVALID_OPT An invalid option was specified
155:os/source/os_q.c **** * OS_ERR_TASK_WAITING One or more tasks were waiting on the queue
156:os/source/os_q.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a queue
157:os/source/os_q.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
158:os/source/os_q.c **** *
159:os/source/os_q.c **** * Returns : pevent upon error
160:os/source/os_q.c **** * (OS_EVENT *)0 if the queue was successfully deleted.
161:os/source/os_q.c **** *
162:os/source/os_q.c **** * Note(s) : 1) This function must be used with care. Tasks that would normally expect the prese
163:os/source/os_q.c **** * the queue MUST check the return code of OSQPend().
164:os/source/os_q.c **** * 2) OSQAccept() callers will not know that the intended queue has been deleted unless
165:os/source/os_q.c **** * they check 'pevent' to see that it's a NULL pointer.
166:os/source/os_q.c **** * 3) This call can potentially disable interrupts for a long time. The interrupt disa
167:os/source/os_q.c **** * time is directly proportional to the number of tasks waiting on the queue.
168:os/source/os_q.c **** * 4) Because ALL tasks pending on the queue will be readied, you MUST be careful in
169:os/source/os_q.c **** * applications where the queue is used for mutual exclusion because the resource(s)
170:os/source/os_q.c **** * will no longer be guarded by the queue.
171:os/source/os_q.c **** * 5) If the storage for the message queue was allocated dynamically (i.e. using a mall
172:os/source/os_q.c **** * type call) then your application MUST release the memory storage by call the coun
173:os/source/os_q.c **** * call of the dynamic allocation scheme used. If the queue storage was created sta
174:os/source/os_q.c **** * then, the storage can be reused.
175:os/source/os_q.c **** ***************************************************************************************************
176:os/source/os_q.c **** */
177:os/source/os_q.c ****
178:os/source/os_q.c **** #if OS_Q_DEL_EN > 0
179:os/source/os_q.c **** OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
180:os/source/os_q.c **** {
181:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
182:os/source/os_q.c **** OS_CPU_SR cpu_sr;
183:os/source/os_q.c **** #endif
184:os/source/os_q.c **** BOOLEAN tasks_waiting;
185:os/source/os_q.c **** OS_Q *pq;
186:os/source/os_q.c ****
187:os/source/os_q.c ****
188:os/source/os_q.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
189:os/source/os_q.c **** *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR
190:os/source/os_q.c **** return ((OS_EVENT *)0);
191:os/source/os_q.c **** }
192:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
193:os/source/os_q.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
194:os/source/os_q.c **** *err = OS_ERR_PEVENT_NULL;
195:os/source/os_q.c **** return (pevent);
196:os/source/os_q.c **** }
197:os/source/os_q.c **** if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type
198:os/source/os_q.c **** *err = OS_ERR_EVENT_TYPE;
199:os/source/os_q.c **** return (pevent);
200:os/source/os_q.c **** }
201:os/source/os_q.c **** #endif
202:os/source/os_q.c **** OS_ENTER_CRITICAL();
203:os/source/os_q.c **** if (pevent->OSEventGrp != 0x00) { /* See if any tasks waiting on queue
204:os/source/os_q.c **** tasks_waiting = TRUE; /* Yes
205:os/source/os_q.c **** } else {
206:os/source/os_q.c **** tasks_waiting = FALSE; /* No
207:os/source/os_q.c **** }
208:os/source/os_q.c **** switch (opt) {
209:os/source/os_q.c **** case OS_DEL_NO_PEND: /* Delete queue only if no task waiting
210:os/source/os_q.c **** if (tasks_waiting == FALSE) {
211:os/source/os_q.c **** pq = pevent->OSEventPtr; /* Return OS_Q to free list
212:os/source/os_q.c **** pq->OSQPtr = OSQFreeList;
213:os/source/os_q.c **** OSQFreeList = pq;
214:os/source/os_q.c **** pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
215:os/source/os_q.c **** pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free li
216:os/source/os_q.c **** OSEventFreeList = pevent; /* Get next free event control block
217:os/source/os_q.c **** OS_EXIT_CRITICAL();
218:os/source/os_q.c **** *err = OS_NO_ERR;
219:os/source/os_q.c **** return ((OS_EVENT *)0); /* Queue has been deleted
220:os/source/os_q.c **** } else {
221:os/source/os_q.c **** OS_EXIT_CRITICAL();
222:os/source/os_q.c **** *err = OS_ERR_TASK_WAITING;
223:os/source/os_q.c **** return (pevent);
224:os/source/os_q.c **** }
225:os/source/os_q.c ****
226:os/source/os_q.c **** case OS_DEL_ALWAYS: /* Always delete the queue
227:os/source/os_q.c **** while (pevent->OSEventGrp != 0x00) { /* Ready ALL tasks waiting for queue
228:os/source/os_q.c **** OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
229:os/source/os_q.c **** }
230:os/source/os_q.c **** pq = pevent->OSEventPtr; /* Return OS_Q to free list
231:os/source/os_q.c **** pq->OSQPtr = OSQFreeList;
232:os/source/os_q.c **** OSQFreeList = pq;
233:os/source/os_q.c **** pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
234:os/source/os_q.c **** pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free li
235:os/source/os_q.c **** OSEventFreeList = pevent; /* Get next free event control block
236:os/source/os_q.c **** OS_EXIT_CRITICAL();
237:os/source/os_q.c **** if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiti
238:os/source/os_q.c **** OS_Sched(); /* Find highest priority task ready to r
239:os/source/os_q.c **** }
240:os/source/os_q.c **** *err = OS_NO_ERR;
241:os/source/os_q.c **** return ((OS_EVENT *)0); /* Queue has been deleted
242:os/source/os_q.c ****
243:os/source/os_q.c **** default:
244:os/source/os_q.c **** OS_EXIT_CRITICAL();
245:os/source/os_q.c **** *err = OS_ERR_INVALID_OPT;
246:os/source/os_q.c **** return (pevent);
247:os/source/os_q.c **** }
248:os/source/os_q.c **** }
249:os/source/os_q.c **** #endif
250:os/source/os_q.c ****
251:os/source/os_q.c **** /*$PAGE*/
252:os/source/os_q.c **** /*
253:os/source/os_q.c **** ***************************************************************************************************
254:os/source/os_q.c **** * FLUSH QUEUE
255:os/source/os_q.c **** *
256:os/source/os_q.c **** * Description : This function is used to flush the contents of the message queue.
257:os/source/os_q.c **** *
258:os/source/os_q.c **** * Arguments : none
259:os/source/os_q.c **** *
260:os/source/os_q.c **** * Returns : OS_NO_ERR upon success
261:os/source/os_q.c **** * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a queue
262:os/source/os_q.c **** * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
263:os/source/os_q.c **** ***************************************************************************************************
264:os/source/os_q.c **** */
265:os/source/os_q.c ****
266:os/source/os_q.c **** #if OS_Q_FLUSH_EN > 0
267:os/source/os_q.c **** INT8U OSQFlush (OS_EVENT *pevent)
268:os/source/os_q.c **** {
383 .LM42:
384 /* prologue: frame size=0 */
385 /* prologue end (size=0) */
386 00f6 FC01 movw r30,r24
269:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
270:os/source/os_q.c **** OS_CPU_SR cpu_sr;
271:os/source/os_q.c **** #endif
272:os/source/os_q.c **** OS_Q *pq;
273:os/source/os_q.c ****
274:os/source/os_q.c ****
275:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
276:os/source/os_q.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
277:os/source/os_q.c **** return (OS_ERR_PEVENT_NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -