📄 os_flag.lis
字号:
026C 0F91 pop r16
026E 0FBF out 0x3F,r16
0270 0991 ld r16,y+
0272 .dbline 295
0272 .dbline 296
0272 ; *err = OS_NO_ERR;
0272 2224 clr R2
0274 FB01 movw R30,R22
0276 2082 std z+0,R2
0278 .dbline 297
0278 ; return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
0278 0027 clr R16
027A 1127 clr R17
027C 3BC0 xjmp L38
027E L51:
027E .dbline 298
027E ; } else {
027E .dbline 299
027E ; OS_EXIT_CRITICAL();
027E 0A93 st -y,r16
0280 0F91 pop r16
0282 0FBF out 0x3F,r16
0284 0991 ld r16,y+
0286 .dbline 299
0286 .dbline 300
0286 ; *err = OS_ERR_TASK_WAITING;
0286 88E0 ldi R24,8
0288 FB01 movw R30,R22
028A 8083 std z+0,R24
028C .dbline 301
028C ; return (pgrp);
028C 8A01 movw R16,R20
028E 32C0 xjmp L38
0290 L53:
0290 .dbline 305
0290 ; }
0290 ;
0290 ; case OS_DEL_ALWAYS: /* Always delete the event flag group */
0290 ; pnode = (OS_FLAG_NODE *)pgrp->OSFlagWaitList;
0290 FA01 movw R30,R20
0292 C180 ldd R12,z+1
0294 D280 ldd R13,z+2
0296 06C0 xjmp L55
0298 L54:
0298 .dbline 306
0298 .dbline 307
0298 2227 clr R18
029A 8601 movw R16,R12
029C 1ED3 xcall _OS_FlagTaskRdy
029E .dbline 308
029E F601 movw R30,R12
02A0 C080 ldd R12,z+0
02A2 D180 ldd R13,z+1
02A4 .dbline 309
02A4 L55:
02A4 .dbline 306
02A4 ; while (pnode != (OS_FLAG_NODE *)0) { /* Ready ALL tasks waiting for flags */
02A4 CC20 tst R12
02A6 C1F7 brne L54
02A8 DD20 tst R13
02AA B1F7 brne L54
02AC X10:
02AC .dbline 310
02AC ; OS_FlagTaskRdy(pnode, (OS_FLAGS)0);
02AC ; pnode = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
02AC ; }
02AC ; pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
02AC 2224 clr R2
02AE FA01 movw R30,R20
02B0 2082 std z+0,R2
02B2 .dbline 311
02B2 ; pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list */
02B2 20900000 lds R2,_OSFlagFreeList
02B6 30900100 lds R3,_OSFlagFreeList+1
02BA 3282 std z+2,R3
02BC 2182 std z+1,R2
02BE .dbline 312
02BE ; OSFlagFreeList = pgrp;
02BE 50930100 sts _OSFlagFreeList+1,R21
02C2 40930000 sts _OSFlagFreeList,R20
02C6 .dbline 313
02C6 ; OS_EXIT_CRITICAL();
02C6 0A93 st -y,r16
02C8 0F91 pop r16
02CA 0FBF out 0x3F,r16
02CC 0991 ld r16,y+
02CE .dbline 313
02CE .dbline 314
02CE ; if (tasks_waiting == TRUE) { /* Reschedule only if task(s) were waiting */
02CE 8A2D mov R24,R10
02D0 8130 cpi R24,1
02D2 11F4 brne L57
02D4 .dbline 314
02D4 .dbline 315
02D4 ; OS_Sched(); /* Find highest priority task ready to run */
02D4 0E940000 xcall _OS_Sched
02D8 .dbline 316
02D8 ; }
02D8 L57:
02D8 .dbline 317
02D8 ; *err = OS_NO_ERR;
02D8 2224 clr R2
02DA FB01 movw R30,R22
02DC 2082 std z+0,R2
02DE .dbline 318
02DE ; return ((OS_FLAG_GRP *)0); /* Event Flag Group has been deleted */
02DE 0027 clr R16
02E0 1127 clr R17
02E2 08C0 xjmp L38
02E4 L47:
02E4 .dbline 321
02E4 ;
02E4 ; default:
02E4 ; OS_EXIT_CRITICAL();
02E4 0A93 st -y,r16
02E6 0F91 pop r16
02E8 0FBF out 0x3F,r16
02EA 0991 ld r16,y+
02EC .dbline 321
02EC .dbline 322
02EC ; *err = OS_ERR_INVALID_OPT;
02EC 87E0 ldi R24,7
02EE FB01 movw R30,R22
02F0 8083 std z+0,R24
02F2 .dbline 323
02F2 ; return (pgrp);
02F2 8A01 movw R16,R20
02F4 .dbline -2
02F4 L38:
02F4 0E940000 xcall pop_gset4
02F8 .dbline 0 ; func end
02F8 0895 ret
02FA .dbsym r tasks_waiting 10 c
02FA .dbsym r pnode 12 pS[.2]
02FA .dbsym r err 22 pc
02FA .dbsym r opt 12 c
02FA .dbsym r pgrp 20 pS[.1]
02FA .dbend
02FA .dbfunc e OSFlagPend _OSFlagPend fc
02FA ; node -> y+6
02FA ; flags_rdy -> R10
02FA ; consume -> R14
02FA ; flags_cur -> R20
02FA ; err -> R22,R23
02FA ; timeout -> y+30
02FA ; wait_type -> R12
02FA ; flags -> y+26
02FA ; pgrp -> R6,R7
.even
02FA _OSFlagPend::
02FA 3A93 st -y,r19
02FC 2A93 st -y,r18
02FE 0E940000 xcall push_gset5
0302 3801 movw R6,R16
0304 6097 sbiw R28,16
0306 CC8C ldd R12,y+28
0308 68A1 ldd R22,y+32
030A 79A1 ldd R23,y+33
030C .dbline -1
030C .dbline 378
030C ; }
030C ; }
030C ; #endif
030C ; /*$PAGE*/
030C ; /*
030C ; *********************************************************************************************************
030C ; * WAIT ON AN EVENT FLAG GROUP
030C ; *
030C ; * Description: This function is called to wait for a combination of bits to be set in an event flag
030C ; * group. Your application can wait for ANY bit to be set or ALL bits to be set.
030C ; *
030C ; * Arguments : pgrp is a pointer to the desired event flag group.
030C ; *
030C ; * flags Is a bit pattern indicating which bit(s) (i.e. flags) you wish to wait for.
030C ; * The bits you want are specified by setting the corresponding bits in
030C ; * 'flags'. e.g. if your application wants to wait for bits 0 and 1 then
030C ; * 'flags' would contain 0x03.
030C ; *
030C ; * wait_type specifies whether you want ALL bits to be set or ANY of the bits to be set.
030C ; * You can specify the following argument:
030C ; *
030C ; * OS_FLAG_WAIT_CLR_ALL You will wait for ALL bits in 'mask' to be clear (0)
030C ; * OS_FLAG_WAIT_SET_ALL You will wait for ALL bits in 'mask' to be set (1)
030C ; * OS_FLAG_WAIT_CLR_ANY You will wait for ANY bit in 'mask' to be clear (0)
030C ; * OS_FLAG_WAIT_SET_ANY You will wait for ANY bit in 'mask' to be set (1)
030C ; *
030C ; * NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
030C ; * the call. Example, to wait for any flag in a group AND then clear
030C ; * the flags that are present, set 'wait_type' to:
030C ; *
030C ; * OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
030C ; *
030C ; * timeout is an optional timeout (in clock ticks) that your task will wait for the
030C ; * desired bit combination. If you specify 0, however, your task will wait
030C ; * forever at the specified event flag group or, until a message arrives.
030C ; *
030C ; * err is a pointer to an error code and can be:
030C ; * OS_NO_ERR The desired bits have been set within the specified
030C ; * 'timeout'.
030C ; * OS_ERR_PEND_ISR If you tried to PEND from an ISR
030C ; * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
030C ; * OS_ERR_EVENT_TYPE You are not pointing to an event flag group
030C ; * OS_TIMEOUT The bit(s) have not been set in the specified
030C ; * 'timeout'.
030C ; * OS_FLAG_ERR_WAIT_TYPE You didn't specify a proper 'wait_type' argument.
030C ; *
030C ; * Returns : The new state of the flags in the event flag group when the task is resumed or,
030C ; * 0 if a timeout or an error occurred.
030C ; *
030C ; * Called from: Task ONLY
030C ; *********************************************************************************************************
030C ; */
030C ;
030C ; OS_FLAGS OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err)
030C ; {
030C .dbline 388
030C ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
030C ; OS_CPU_SR cpu_sr;
030C ; #endif
030C ; OS_FLAG_NODE node;
030C ; OS_FLAGS flags_cur;
030C ; OS_FLAGS flags_rdy;
030C ; BOOLEAN consume;
030C ;
030C ;
030C ; if (OSIntNesting > 0) { /* See if called from ISR ... */
030C 2224 clr R2
030E 30900000 lds R3,_OSIntNesting
0312 2314 cp R2,R3
0314 28F4 brsh L60
0316 .dbline 388
0316 .dbline 389
0316 ; *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
0316 82E0 ldi R24,2
0318 FB01 movw R30,R22
031A 8083 std z+0,R24
031C .dbline 390
031C ; return ((OS_FLAGS)0);
031C 0027 clr R16
031E 61C1 xjmp L59
0320 L60:
0320 .dbline 393
0320 ; }
0320 ; #if OS_ARG_CHK_EN > 0
0320 ; if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
0320 6620 tst R6
0322 39F4 brne L62
0324 7720 tst R7
0326 29F4 brne L62
0328 X11:
0328 .dbline 393
0328 .dbline 394
0328 ; *err = OS_FLAG_INVALID_PGRP;
0328 86E9 ldi R24,150
032A FB01 movw R30,R22
032C 8083 std z+0,R24
032E .dbline 395
032E ; return ((OS_FLAGS)0);
032E 0027 clr R16
0330 58C1 xjmp L59
0332 L62:
0332 .dbline 397
0332 ; }
0332 ; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event block type */
0332 F301 movw R30,R6
0334 8081 ldd R24,z+0
0336 8530 cpi R24,5
0338 29F0 breq L64
033A .dbline 397
033A .dbline 398
033A ; *err = OS_ERR_EVENT_TYPE;
033A 81E0 ldi R24,1
033C FB01 movw R30,R22
033E 8083 std z+0,R24
0340 .dbline 399
0340 ; return ((OS_FLAGS)0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -