📄 os_mbox.lst
字号:
238 void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
239 {
\ 011A 0A12 PUSH R10
\ 011C 0B12 PUSH R11
\ 011E 0A4C MOV R12,R10
\ 0120 1B410600 MOV 6(SP),R11
240 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
241 OS_CPU_SR cpu_sr;
242 #endif
243 void *msg;
244
245
246 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ 0124 C2930000 CMP.B #0,&OSIntNesting
\ 0128 0424 JEQ (?0090)
247 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 012A EB430000 MOV.B #2,0(R11)
248 return ((void *)0);
\ 012E 0C43 MOV #0,R12
249 }
\ 0130 453C JMP (?0099)
\ 0132 ?0090:
250 #if OS_ARG_CHK_EN > 0
251 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 0132 0A93 CMP #0,R10
\ 0134 0420 JNE (?0092)
252 *err = OS_ERR_PEVENT_NULL;
\ 0136 EB420000 MOV.B #4,0(R11)
253 return ((void *)0);
\ 013A 0C43 MOV #0,R12
254 }
\ 013C 3F3C JMP (?0099)
\ 013E ?0092:
255 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
\ 013E 5C43 MOV.B #1,R12
\ 0140 6C9A CMP.B @R10,R12
\ 0142 0424 JEQ (?0094)
256 *err = OS_ERR_EVENT_TYPE;
\ 0144 DB430000 MOV.B #1,0(R11)
257 return ((void *)0);
\ 0148 0C43 MOV #0,R12
258 }
\ 014A 383C JMP (?0099)
\ 014C ?0094:
259 #endif
260 OS_ENTER_CRITICAL();
\ 014C 32C2 DINT
261 msg = pevent->OSEventPtr;
\ 014E 1C4A0400 MOV 4(R10),R12
262 if (msg != (void *)0) { /* See if there is already a message */
\ 0152 0C93 CMP #0,R12
\ 0154 0624 JEQ (?0096)
263 pevent->OSEventPtr = (void *)0; /* Clear the mailbox */
\ 0156 8A430400 MOV #0,4(R10)
264 OS_EXIT_CRITICAL();
\ 015A 32D2 EINT
265 *err = OS_NO_ERR;
\ 015C CB430000 MOV.B #0,0(R11)
266 return (msg); /* Return the message received (or NULL) */
267 }
\ 0160 2D3C JMP (?0099)
\ 0162 ?0096:
268 OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will pend */
\ 0162 1C420000 MOV &OSTCBCur,R12
\ 0166 ECD31C00 BIS.B #2,28(R12)
269 OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB */
\ 016A 1C420000 MOV &OSTCBCur,R12
\ 016E 8C4E1A00 MOV R14,26(R12)
270 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
\ 0172 0C4A MOV R10,R12
\ 0174 B0120000 CALL #OS_EventTaskWait
271 OS_EXIT_CRITICAL();
\ 0178 32D2 EINT
272 OS_Sched(); /* Find next highest priority task ready to run */
\ 017A B0120000 CALL #OS_Sched
273 OS_ENTER_CRITICAL();
\ 017E 32C2 DINT
274 msg = OSTCBCur->OSTCBMsg;
\ 0180 1D420000 MOV &OSTCBCur,R13
\ 0184 1C4D1400 MOV 20(R13),R12
275 if (msg != (void *)0) { /* See if we were given the message */
\ 0188 0C93 CMP #0,R12
\ 018A 1024 JEQ (?0098)
276 OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received */
\ 018C 1D420000 MOV &OSTCBCur,R13
\ 0190 8D431400 MOV #0,20(R13)
277 OSTCBCur->OSTCBStat = OS_STAT_RDY;
\ 0194 1D420000 MOV &OSTCBCur,R13
\ 0198 CD431C00 MOV.B #0,28(R13)
278 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
\ 019C 1D420000 MOV &OSTCBCur,R13
\ 01A0 8D431200 MOV #0,18(R13)
279 OS_EXIT_CRITICAL();
\ 01A4 32D2 EINT
280 *err = OS_NO_ERR;
\ 01A6 CB430000 MOV.B #0,0(R11)
281 return (msg); /* Return the message received */
282 }
\ 01AA 083C JMP (?0099)
\ 01AC ?0098:
283 OS_EventTO(pevent); /* Timed out, Make task ready */
\ 01AC 0C4A MOV R10,R12
\ 01AE B0120000 CALL #OS_EventTO
284 OS_EXIT_CRITICAL();
\ 01B2 32D2 EINT
285 *err = OS_TIMEOUT; /* Indicate that a timeout occured */
\ 01B4 FB400A00 MOV.B #10,0(R11)
\ 01B8 0000
286 return ((void *)0); /* Return a NULL message */
\ 01BA 0C43 MOV #0,R12
287 }
\ 01BC ?0099:
\ 01BC 3B41 POP R11
\ 01BE 3A41 POP R10
\ 01C0 3041 RET
\ 01C2 OSMboxPost:
288 /*$PAGE*/
289 /*
290 *********************************************************************************************************
291 * POST MESSAGE TO A MAILBOX
292 *
293 * Description: This function sends a message to a mailbox
294 *
295 * Arguments : pevent is a pointer to the event control block associated with the desired mailbox
296 *
297 * msg is a pointer to the message to send. You MUST NOT send a NULL pointer.
298 *
299 * Returns : OS_NO_ERR The call was successful and the message was sent
300 * OS_MBOX_FULL If the mailbox already contains a message. You can can only send one
301 * message at a time and thus, the message MUST be consumed before you
302 * are allowed to send another one.
303 * OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
304 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer
305 * OS_ERR_POST_NULL_PTR If you are attempting to post a NULL pointer
306 *********************************************************************************************************
307 */
308
309 #if OS_MBOX_POST_EN > 0
310 INT8U OSMboxPost (OS_EVENT *pevent, void *msg)
311 {
312 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
313 OS_CPU_SR cpu_sr;
314 #endif
315
316
317 #if OS_ARG_CHK_EN > 0
318 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 01C2 0C93 CMP #0,R12
\ 01C4 0220 JNE (?0101)
319 return (OS_ERR_PEVENT_NULL);
\ 01C6 6C42 MOV.B #4,R12
320 }
\ 01C8 3041 RET
\ 01CA ?0101:
321 if (msg == (void *)0) { /* Make sure we are not posting a NULL pointer */
\ 01CA 0E93 CMP #0,R14
\ 01CC 0320 JNE (?0103)
322 return (OS_ERR_POST_NULL_PTR);
\ 01CE 7C400300 MOV.B #3,R12
323 }
\ 01D2 3041 RET
\ 01D4 ?0103:
324 if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type */
\ 01D4 5D43 MOV.B #1,R13
\ 01D6 6D9C CMP.B @R12,R13
\ 01D8 0224 JEQ (?0105)
325 return (OS_ERR_EVENT_TYPE);
\ 01DA 5C43 MOV.B #1,R12
326 }
\ 01DC 3041 RET
\ 01DE ?0105:
327 #endif
328 OS_ENTER_CRITICAL();
\ 01DE 32C2 DINT
329 if (pevent->OSEventGrp != 0x00) { /* See if any task pending on mailbox */
\ 01E0 CC930100 CMP.B #0,1(R12)
\ 01E4 0924 JEQ (?0107)
330 OS_EventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task waiting on event */
\ 01E6 6312 PUSH.B #2
\ 01E8 B0120000 CALL #OS_EventTaskRdy
\ 01EC 2153 ADD #2,SP
331 OS_EXIT_CRITICAL();
\ 01EE 32D2 EINT
332 OS_Sched(); /* Find highest priority task ready to run */
\ 01F0 B0120000 CALL #OS_Sched
333 return (OS_NO_ERR);
\ 01F4 4C43 MOV.B #0,R12
334 }
\ 01F6 3041 RET
\ 01F8 ?0107:
335 if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't already have a msg */
\ 01F8 8C930400 CMP #0,4(R12)
\ 01FC 0424 JEQ (?0109)
336 OS_EXIT_CRITICAL();
\ 01FE 32D2 EINT
337 return (OS_MBOX_FULL);
\ 0200 7C401400 MOV.B #20,R12
338 }
\ 0204 3041 RET
\ 0206 ?0109:
339 pevent->OSEventPtr = msg; /* Place message in mailbox */
\ 0206 8C4E0400 MOV R14,4(R12)
340 OS_EXIT_CRITICAL();
\ 020A 32D2 EINT
341 return (OS_NO_ERR);
\ 020C 4C43 MOV.B #0,R12
342 }
\ 020E 3041 RET
\ 0210 OSMboxPostOpt:
343 #endif
344
345 /*$PAGE*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -