📄 os_flag.ls1
字号:
307 ;
308 ; OS_FLAG_GRP *OSFlagCreate (OS_FLAGS flags, INT8U *err)LG_REENTRANT
309 ; {
310 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status re
gister */
311 ; OS_CPU_SR cpu_sr;
312 ; #endif
313 ; OS_FLAG_GRP *pgrp;
314 ;
315 ;
316 ; if (OSIntNesting > 0) { /* See if called from ISR ...
*/
317 ; *err = OS_ERR_CREATE_ISR; /* ... can't CREATE from an ISR
*/
318 ; return ((OS_FLAG_GRP *)0);
319 ; }
320 ; OS_ENTER_CRITICAL();
321 ; pgrp = OSFlagFreeList; /* Get next free event flag
*/
322 ; if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups a
vailable */
323 ; /* Adjust free list
*/
A51 MACRO ASSEMBLER OS_FLAG 05/17/2005 11:19:52 PAGE 7
324 ; OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
325 ; pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type
*/
326 ; pgrp->OSFlagFlags = flags; /* Set to desired initial value
*/
327 ; pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on fla
gs */
328 ; OS_EXIT_CRITICAL();
329 ; *err = OS_NO_ERR;
330 ; } else {
331 ; OS_EXIT_CRITICAL();
332 ; *err = OS_FLAG_GRP_DEPLETED;
333 ; }
334 ; return (pgrp); /* Return pointer to event flag group
*/
335 ; }
336 ;
337 ; /*$PAGE*/
338 ; /*
339 ; *****************************************************************************************
****************
340 ; * DELETE AN EVENT FLAG GROUP
341 ; *
342 ; * Description: This function deletes an event flag group and readies all tasks pending on
the event flag
343 ; * group.
344 ; *
345 ; * Arguments : pgrp is a pointer to the desired event flag group.
346 ; *
347 ; * opt determines delete options as follows:
348 ; * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if
no task pending
349 ; * opt == OS_DEL_ALWAYS Deletes the event flag group even if
tasks are
350 ; * waiting. In this case, all the task
s pending will be
351 ; * readied.
352 ; *
353 ; * err is a pointer to an error code that can contain one of the fo
llowing values:
354 ; * OS_NO_ERR The call was successful and the even
t flag group was
355 ; * deleted
356 ; * OS_ERR_DEL_ISR If you attempted to delete the event
flag group from
357 ; * an ISR
358 ; * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
359 ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an e
vent flag group
360 ; * OS_ERR_INVALID_OPT An invalid option was specified
361 ; * OS_ERR_TASK_WAITING One or more tasks were waiting on th
e event flag
362 ; * group.
363 ; *
364 ; * Returns : pevent upon error
365 ; * (OS_EVENT *)0 if the semaphore was successfully deleted.
366 ; *
367 ; * Note(s) : 1) This function must be used with care. Tasks that would normally expect
the presence of
368 ; * the event flag group MUST check the return code of OSFlagAccept() and O
SFlagPend().
369 ; * 2) This call can potentially disable interrupts for a long time. The inte
rrupt disable
370 ; * time is directly proportional to the number of tasks waiting on the eve
nt flag group.
371 ; *****************************************************************************************
A51 MACRO ASSEMBLER OS_FLAG 05/17/2005 11:19:52 PAGE 8
****************
372 ; */
373 ;
374 ; #if OS_FLAG_DEL_EN > 0
375 ; OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)LG_REENTRANT
376 ; {
377 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU st
atus register */
378 ; OS_CPU_SR cpu_sr;
379 ; #endif
380 ; BOOLEAN tasks_waiting;
381 ; OS_FLAG_NODE *pnode;
382 ;
383 ;
384 ; if (OSIntNesting > 0) { /* See if called from ISR ...
*/
385 ; *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an IS
R */
386 ; return (pgrp);
387 ; }
388 ; #if OS_ARG_CHK_EN > 0
389 ; if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp'
*/
390 ; *err = OS_FLAG_INVALID_PGRP;
391 ; return (pgrp);
392 ; }
393 ; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type
*/
394 ; *err = OS_ERR_EVENT_TYPE;
395 ; return (pgrp);
396 ; }
397 ; #endif
398 ; OS_ENTER_CRITICAL();
399 ; if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on
event flags */
400 ; tasks_waiting = TRUE; /* Yes
*/
401 ; } else {
402 ; tasks_waiting = FALSE; /* No
*/
403 ; }
404 ; switch (opt) {
405 ; case OS_DEL_NO_PEND: /* Delete group if no task wai
ting */
406 ; if (tasks_waiting == FALSE) {
407 ; pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
408 ; pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free l
ist */
409 ; OSFlagFreeList = pgrp;
410 ; OS_EXIT_CRITICAL();
411 ; *err = OS_NO_ERR;
412 ; return ((OS_FLAG_GRP *)0); /* Event Flag Group has been d
eleted */
413 ; } else {
414 ; OS_EXIT_CRITICAL();
415 ; *err = OS_ERR_TASK_WAITING;
416 ; return (pgrp);
417 ; }
418 ;
419 ; case OS_DEL_ALWAYS: /* Always delete the event fla
g group */
420 ; pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
421 ; while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for
flags */
422 ; OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
423 ; pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
A51 MACRO ASSEMBLER OS_FLAG 05/17/2005 11:19:52 PAGE 9
424 ; }
425 ; pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
426 ; pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list
*/
427 ; OSFlagFreeList = pgrp;
428 ; OS_EXIT_CRITICAL();
429 ; if (tasks_waiting == TRUE) { /* Reschedule only if task(s)
were waiting */
430 ; OS_Sched(); /* Find highest priority task
ready to run */
431 ; }
432 ; *err = OS_NO_ERR;
433 ; return ((OS_FLAG_GRP *)0); /* Event Flag Group has been d
eleted */
434 ;
435 ; default:
436 ; OS_EXIT_CRITICAL();
437 ; *err = OS_ERR_INVALID_OPT;
438 ; return (pgrp);
439 ; }
440 ; }
441 ; #endif
442 ; /*$PAGE*/
443 ; /*
444 ; *****************************************************************************************
****************
445 ; * WAIT ON AN EVENT FLAG GROUP
446 ; *
447 ; * Description: This function is called to wait for a combination of bits to be set in an
event flag
448 ; * group. Your application can wait for ANY bit to be set or ALL bits to be
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -