os_mbox.ls1
来自「在51单片机上移植成功的UCOS-II操作系统源代码,包括源代码及相关注释」· LS1 代码 · 共 498 行 · 第 1/2 页
LS1
498 行
198 ; return ((void *)0);
199 ; }
200 ; msg = pevent->OSEventPtr;
201 ; if (msg != (void *)0) { /* See if there is already a messag
e */
202 ; pevent->OSEventPtr = (void *)0; /* Clear the mailbox
*/
203 ; OS_EXIT_CRITICAL();
204 ; *err = OS_NO_ERR;
205 ; } else if (OSIntNesting > 0) { /* See if called from ISR ...
*/
206 ; OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR
*/
207 ; *err = OS_ERR_PEND_ISR;
208 ; } else {
209 ; OSTCBCur->OSTCBStat |= OS_STAT_MBOX; /* Message not available, task will
pend */
210 ; OSTCBCur->OSTCBDly = timeout; /* Load timeout in TCB
*/
211 ; OSEventTaskWait(pevent); /* Suspend task until event or time
out occurs */
212 ; OS_EXIT_CRITICAL();
A51 MACRO ASSEMBLER OS_MBOX 09/09/2007 21:12:36 PAGE 5
213 ; OSSched(); /* Find next highest priority task
ready to run */
214 ; OS_ENTER_CRITICAL();
215 ; if ((msg = OSTCBCur->OSTCBMsg) != (void *)0) { /* See if we were given the me
ssage */
216 ; OSTCBCur->OSTCBMsg = (void *)0; /* Yes, clear message received
*/
217 ; OSTCBCur->OSTCBStat = OS_STAT_RDY;
218 ; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event
*/
219 ; OS_EXIT_CRITICAL();
220 ; *err = OS_NO_ERR;
221 ; } else if (OSTCBCur->OSTCBStat & OS_STAT_MBOX) { /* If status is not OS_STAT_RD
Y, timed out */
222 ; OSEventTO(pevent); /* Make task ready
*/
223 ; OS_EXIT_CRITICAL();
224 ; msg = (void *)0; /* Set message contents to NUL
L */
225 ; *err = OS_TIMEOUT; /* Indicate that a timeout occ
ured */
226 ; } else {
227 ; msg = pevent->OSEventPtr; /* Message received
*/
228 ; pevent->OSEventPtr = (void *)0; /* Clear the mailbox
*/
229 ; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
230 ; OS_EXIT_CRITICAL();
231 ; *err = OS_NO_ERR;
232 ; }
233 ; }
234 ; return (msg); /* Return the message received
(or NULL) */
235 ; }
236 ; /*$PAGE*/
237 ; /*
238 ; *****************************************************************************************
****************
239 ; * POST MESSAGE TO A MAILBOX
240 ; *
241 ; * Description: This function sends a message to a mailbox
242 ; *
243 ; * Arguments : pevent is a pointer to the event control block associated with the
desired mailbox
244 ; *
245 ; * msg is a pointer to the message to send. You MUST NOT send a NU
LL pointer.
246 ; *
247 ; * Returns : OS_NO_ERR The call was successful and the message was sent
248 ; * OS_MBOX_FULL If the mailbox already contains a message. You can can
only send one
249 ; * message at a time and thus, the message MUST be consume
d before you are
250 ; * allowed to send another one.
251 ; * OS_ERR_EVENT_TYPE If you are attempting to post to a non mailbox.
252 ; *****************************************************************************************
****************
253 ; */
254 ;
255 ; INT8U OSMboxPost (OS_EVENT *pevent, void *msg) reentrant
256 ; {
257 ; OS_ENTER_CRITICAL();
258 ; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type
*/
259 ; OS_EXIT_CRITICAL();
260 ; return (OS_ERR_EVENT_TYPE);
A51 MACRO ASSEMBLER OS_MBOX 09/09/2007 21:12:36 PAGE 6
261 ; }
262 ; if (pevent->OSEventGrp) { /* See if any task pending on mailb
ox */
263 ; OSEventTaskRdy(pevent, msg, OS_STAT_MBOX); /* Ready highest priority task wait
ing on event */
264 ; OS_EXIT_CRITICAL();
265 ; OSSched(); /* Find highest priority task ready
to run */
266 ; return (OS_NO_ERR);
267 ; } else {
268 ; if (pevent->OSEventPtr != (void *)0) { /* Make sure mailbox doesn't alread
y have a msg */
269 ; OS_EXIT_CRITICAL();
270 ; return (OS_MBOX_FULL);
271 ; } else {
272 ; pevent->OSEventPtr = msg; /* Place message in mailbox
*/
273 ; OS_EXIT_CRITICAL();
274 ; return (OS_NO_ERR);
275 ; }
276 ; }
277 ; }
278 ; /*$PAGE*/
279 ; /*
280 ; *****************************************************************************************
****************
281 ; * QUERY A MESSAGE MAILBOX
282 ; *
283 ; * Description: This function obtains information about a message mailbox.
284 ; *
285 ; * Arguments : pevent is a pointer to the event control block associated with the
desired mailbox
286 ; *
287 ; * pdata is a pointer to a structure that will contain information ab
out the message
288 ; * mailbox.
289 ; *
290 ; * Returns : OS_NO_ERR The call was successful and the message was sent
291 ; * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non mailbox
.
292 ; *****************************************************************************************
****************
293 ; */
294 ;
295 ; INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *ppdata) reentrant
296 ; {
297 ; INT8U i;
298 ; INT8U *psrc;
299 ; INT8U *pdest;
300 ;
301 ;
302 ; OS_ENTER_CRITICAL();
303 ; if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) { /* Validate event block type
*/
304 ; OS_EXIT_CRITICAL();
305 ; return (OS_ERR_EVENT_TYPE);
306 ; }
307 ; ppdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait
list */
308 ; psrc = &pevent->OSEventTbl[0];
309 ; pdest = &ppdata->OSEventTbl[0];
310 ; for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
311 ; *pdest++ = *psrc++;
312 ; }
313 ; ppdata->OSMsg = pevent->OSEventPtr; /* Get message from mailbox
*/
A51 MACRO ASSEMBLER OS_MBOX 09/09/2007 21:12:36 PAGE 7
314 ; OS_EXIT_CRITICAL();
315 ; return (OS_NO_ERR);
316 ; }
317 ; #endif
318 ; *** sync lost ***
319 ; *** sync lost ***
320 ; *** sync lost ***
321 END
A51 MACRO ASSEMBLER OS_MBOX 09/09/2007 21:12:36 PAGE 8
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
AC . . . . . . . . B ADDR 00D0H.6 A
ACC. . . . . . . . D ADDR 00E0H A
B. . . . . . . . . D ADDR 00F0H A
CY . . . . . . . . B ADDR 00D0H.7 A
DPH. . . . . . . . D ADDR 0083H A
DPL. . . . . . . . D ADDR 0082H A
EA . . . . . . . . B ADDR 00A8H.7 A
ES . . . . . . . . B ADDR 00A8H.4 A
ET0. . . . . . . . B ADDR 00A8H.1 A
ET1. . . . . . . . B ADDR 00A8H.3 A
EX0. . . . . . . . B ADDR 00A8H.0 A
EX1. . . . . . . . B ADDR 00A8H.2 A
F0 . . . . . . . . B ADDR 00D0H.5 A
IE . . . . . . . . D ADDR 00A8H A
IE0. . . . . . . . B ADDR 0088H.1 A
IE1. . . . . . . . B ADDR 0088H.3 A
INT0 . . . . . . . B ADDR 00B0H.2 A
INT1 . . . . . . . B ADDR 00B0H.3 A
IP . . . . . . . . D ADDR 00B8H A
IT0. . . . . . . . B ADDR 0088H.0 A
IT1. . . . . . . . B ADDR 0088H.2 A
OS_MBOX. . . . . . N NUMB -----
OV . . . . . . . . B ADDR 00D0H.2 A
P. . . . . . . . . B ADDR 00D0H.0 A
P0 . . . . . . . . D ADDR 0080H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
P3 . . . . . . . . D ADDR 00B0H A
PCON . . . . . . . D ADDR 0087H A
PS . . . . . . . . B ADDR 00B8H.4 A
PSW. . . . . . . . D ADDR 00D0H A
PT0. . . . . . . . B ADDR 00B8H.1 A
PT1. . . . . . . . B ADDR 00B8H.3 A
PX0. . . . . . . . B ADDR 00B8H.0 A
PX1. . . . . . . . B ADDR 00B8H.2 A
RB8. . . . . . . . B ADDR 0098H.2 A
RD . . . . . . . . B ADDR 00B0H.7 A
REN. . . . . . . . B ADDR 0098H.4 A
RI . . . . . . . . B ADDR 0098H.0 A
RS0. . . . . . . . B ADDR 00D0H.3 A
RS1. . . . . . . . B ADDR 00D0H.4 A
RXD. . . . . . . . B ADDR 00B0H.0 A
SBUF . . . . . . . D ADDR 0099H A
SCON . . . . . . . D ADDR 0098H A
SM0. . . . . . . . B ADDR 0098H.7 A
SM1. . . . . . . . B ADDR 0098H.6 A
SM2. . . . . . . . B ADDR 0098H.5 A
SP . . . . . . . . D ADDR 0081H A
T0 . . . . . . . . B ADDR 00B0H.4 A
T1 . . . . . . . . B ADDR 00B0H.5 A
TB8. . . . . . . . B ADDR 0098H.3 A
TCON . . . . . . . D ADDR 0088H A
TF0. . . . . . . . B ADDR 0088H.5 A
TF1. . . . . . . . B ADDR 0088H.7 A
TH0. . . . . . . . D ADDR 008CH A
TH1. . . . . . . . D ADDR 008DH A
TI . . . . . . . . B ADDR 0098H.1 A
TL0. . . . . . . . D ADDR 008AH A
TL1. . . . . . . . D ADDR 008BH A
TMOD . . . . . . . D ADDR 0089H A
A51 MACRO ASSEMBLER OS_MBOX 09/09/2007 21:12:36 PAGE 9
TR0. . . . . . . . B ADDR 0088H.4 A
TR1. . . . . . . . B ADDR 0088H.6 A
TXD. . . . . . . . B ADDR 00B0H.1 A
WR . . . . . . . . B ADDR 00B0H.6 A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?