📄 os_flag.lis
字号:
0184 ; if (pgrp != (OS_FLAG_GRP *)0) { /* See if we have event flag groups available */
0184 4030 cpi R20,0
0186 4507 cpc R20,R21
0188 D1F0 breq L36
018A X5:
018A .dbline 207
018A .dbline 209
018A ; /* Adjust free list */
018A ; OSFlagFreeList = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;
018A E0910000 lds R30,_OSFlagFreeList
018E F0910100 lds R31,_OSFlagFreeList+1
0192 2180 ldd R2,z+1
0194 3280 ldd R3,z+2
0196 30920100 sts _OSFlagFreeList+1,R3
019A 20920000 sts _OSFlagFreeList,R2
019E .dbline 210
019E ; pgrp->OSFlagType = OS_EVENT_TYPE_FLAG; /* Set to event flag group type */
019E 85E0 ldi R24,5
01A0 FA01 movw R30,R20
01A2 8083 std z+0,R24
01A4 .dbline 211
01A4 ; pgrp->OSFlagFlags = flags; /* Set to desired initial value */
01A4 0383 std z+3,R16
01A6 .dbline 212
01A6 ; pgrp->OSFlagWaitList = (void *)0; /* Clear list of tasks waiting on flags */
01A6 2224 clr R2
01A8 3324 clr R3
01AA FA01 movw R30,R20
01AC 3282 std z+2,R3
01AE 2182 std z+1,R2
01B0 .dbline 213
01B0 ; OS_EXIT_CRITICAL();
01B0 0A93 st -y,r16
01B2 0F91 pop r16
01B4 0FBF out 0x3F,r16
01B6 0991 ld r16,y+
01B8 .dbline 213
01B8 .dbline 214
01B8 ; *err = OS_NO_ERR;
01B8 F901 movw R30,R18
01BA 2082 std z+0,R2
01BC .dbline 215
01BC 07C0 xjmp L37
01BE L36:
01BE .dbline 215
01BE ; } else {
01BE .dbline 216
01BE ; OS_EXIT_CRITICAL();
01BE 0A93 st -y,r16
01C0 0F91 pop r16
01C2 0FBF out 0x3F,r16
01C4 0991 ld r16,y+
01C6 .dbline 216
01C6 .dbline 217
01C6 ; *err = OS_FLAG_GRP_DEPLETED;
01C6 8AE9 ldi R24,154
01C8 F901 movw R30,R18
01CA 8083 std z+0,R24
01CC .dbline 218
01CC ; }
01CC L37:
01CC .dbline 219
01CC ; return (pgrp); /* Return pointer to event flag group */
01CC 8A01 movw R16,R20
01CE .dbline -2
01CE L33:
01CE 0E940000 xcall pop_gset1
01D2 .dbline 0 ; func end
01D2 0895 ret
01D4 .dbsym r pgrp 20 pS[.1]
01D4 .dbsym r err 18 pc
01D4 .dbsym r flags 16 c
01D4 .dbend
01D4 .dbfunc e OSFlagDel _OSFlagDel fpS[.1]
01D4 .dbstruct 0 10 .2
01D4 .dbfield 0 OSFlagNodeNext pV
01D4 .dbfield 2 OSFlagNodePrev pV
01D4 .dbfield 4 OSFlagNodeTCB pV
01D4 .dbfield 6 OSFlagNodeFlagGrp pV
01D4 .dbfield 8 OSFlagNodeFlags c
01D4 .dbfield 9 OSFlagNodeWaitType c
01D4 .dbend
01D4 ; tasks_waiting -> R10
01D4 ; pnode -> R12,R13
01D4 ; err -> R22,R23
01D4 ; opt -> R12
01D4 ; pgrp -> R20,R21
.even
01D4 _OSFlagDel::
01D4 0E940000 xcall push_gset4
01D8 C22E mov R12,R18
01DA A801 movw R20,R16
01DC 6885 ldd R22,y+8
01DE 7985 ldd R23,y+9
01E0 .dbline -1
01E0 .dbline 261
01E0 ; }
01E0 ;
01E0 ; /*$PAGE*/
01E0 ; /*
01E0 ; *********************************************************************************************************
01E0 ; * DELETE AN EVENT FLAG GROUP
01E0 ; *
01E0 ; * Description: This function deletes an event flag group and readies all tasks pending on the event flag
01E0 ; * group.
01E0 ; *
01E0 ; * Arguments : pgrp is a pointer to the desired event flag group.
01E0 ; *
01E0 ; * opt determines delete options as follows:
01E0 ; * opt == OS_DEL_NO_PEND Deletes the event flag group ONLY if no task pending
01E0 ; * opt == OS_DEL_ALWAYS Deletes the event flag group even if tasks are
01E0 ; * waiting. In this case, all the tasks pending will be
01E0 ; * readied.
01E0 ; *
01E0 ; * err is a pointer to an error code that can contain one of the following values:
01E0 ; * OS_NO_ERR The call was successful and the event flag group was
01E0 ; * deleted
01E0 ; * OS_ERR_DEL_ISR If you attempted to delete the event flag group from
01E0 ; * an ISR
01E0 ; * OS_FLAG_INVALID_PGRP If 'pgrp' is a NULL pointer.
01E0 ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to an event flag group
01E0 ; * OS_ERR_INVALID_OPT An invalid option was specified
01E0 ; * OS_ERR_TASK_WAITING One or more tasks were waiting on the event flag
01E0 ; * group.
01E0 ; *
01E0 ; * Returns : pevent upon error
01E0 ; * (OS_EVENT *)0 if the semaphore was successfully deleted.
01E0 ; *
01E0 ; * Note(s) : 1) This function must be used with care. Tasks that would normally expect the presence of
01E0 ; * the event flag group MUST check the return code of OSFlagAccept() and OSFlagPend().
01E0 ; * 2) This call can potentially disable interrupts for a long time. The interrupt disable
01E0 ; * time is directly proportional to the number of tasks waiting on the event flag group.
01E0 ; *********************************************************************************************************
01E0 ; */
01E0 ;
01E0 ; #if OS_FLAG_DEL_EN > 0
01E0 ; OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err)
01E0 ; {
01E0 .dbline 269
01E0 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01E0 ; OS_CPU_SR cpu_sr;
01E0 ; #endif
01E0 ; BOOLEAN tasks_waiting;
01E0 ; OS_FLAG_NODE *pnode;
01E0 ;
01E0 ;
01E0 ; if (OSIntNesting > 0) { /* See if called from ISR ... */
01E0 2224 clr R2
01E2 30900000 lds R3,_OSIntNesting
01E6 2314 cp R2,R3
01E8 28F4 brsh L39
01EA .dbline 269
01EA .dbline 270
01EA ; *err = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
01EA 8CE8 ldi R24,140
01EC FB01 movw R30,R22
01EE 8083 std z+0,R24
01F0 .dbline 271
01F0 ; return (pgrp);
01F0 8A01 movw R16,R20
01F2 80C0 xjmp L38
01F4 L39:
01F4 .dbline 274
01F4 ; }
01F4 ; #if OS_ARG_CHK_EN > 0
01F4 ; if (pgrp == (OS_FLAG_GRP *)0) { /* Validate 'pgrp' */
01F4 4030 cpi R20,0
01F6 4507 cpc R20,R21
01F8 29F4 brne L41
01FA X6:
01FA .dbline 274
01FA .dbline 275
01FA ; *err = OS_FLAG_INVALID_PGRP;
01FA 86E9 ldi R24,150
01FC FB01 movw R30,R22
01FE 8083 std z+0,R24
0200 .dbline 276
0200 ; return (pgrp);
0200 8A01 movw R16,R20
0202 78C0 xjmp L38
0204 L41:
0204 .dbline 278
0204 ; }
0204 ; if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) { /* Validate event group type */
0204 FA01 movw R30,R20
0206 8081 ldd R24,z+0
0208 8530 cpi R24,5
020A 29F0 breq L43
020C .dbline 278
020C .dbline 279
020C ; *err = OS_ERR_EVENT_TYPE;
020C 81E0 ldi R24,1
020E FB01 movw R30,R22
0210 8083 std z+0,R24
0212 .dbline 280
0212 ; return (pgrp);
0212 8A01 movw R16,R20
0214 6FC0 xjmp L38
0216 L43:
0216 .dbline 283
0216 ; }
0216 ; #endif
0216 ; OS_ENTER_CRITICAL();
0216 0A93 st -y,r16
0218 0FB7 in r16,0x3F
021A F894 cli
021C 0F93 push r16
021E 0991 ld r16,y+
0220 .dbline 283
0220 .dbline 284
0220 ; if (pgrp->OSFlagWaitList != (void *)0) { /* See if any tasks waiting on event flags */
0220 FA01 movw R30,R20
0222 2180 ldd R2,z+1
0224 3280 ldd R3,z+2
0226 2220 tst R2
0228 11F4 brne X7
022A 3320 tst R3
022C 19F0 breq L45
022E X7:
022E .dbline 284
022E .dbline 285
022E ; tasks_waiting = TRUE; /* Yes */
022E AA24 clr R10
0230 A394 inc R10
0232 .dbline 286
0232 01C0 xjmp L46
0234 L45:
0234 .dbline 286
0234 ; } else {
0234 .dbline 287
0234 ; tasks_waiting = FALSE; /* No */
0234 AA24 clr R10
0236 .dbline 288
0236 ; }
0236 L46:
0236 .dbline 289
0236 DD24 clr R13
0238 CC20 tst R12
023A 11F4 brne X8
023C DD20 tst R13
023E 31F0 breq L50
0240 X8:
0240 C601 movw R24,R12
0242 8130 cpi R24,1
0244 E0E0 ldi R30,0
0246 9E07 cpc R25,R30
0248 19F1 breq L53
024A 4CC0 xjmp L47
024C X9:
024C .dbline 289
024C ; switch (opt) {
024C L50:
024C .dbline 291
024C ; case OS_DEL_NO_PEND: /* Delete group if no task waiting */
024C ; if (tasks_waiting == FALSE) {
024C AA20 tst R10
024E B9F4 brne L51
0250 .dbline 291
0250 .dbline 292
0250 ; pgrp->OSFlagType = OS_EVENT_TYPE_UNUSED;
0250 2224 clr R2
0252 FA01 movw R30,R20
0254 2082 std z+0,R2
0256 .dbline 293
0256 ; pgrp->OSFlagWaitList = (void *)OSFlagFreeList; /* Return group to free list */
0256 20900000 lds R2,_OSFlagFreeList
025A 30900100 lds R3,_OSFlagFreeList+1
025E 3282 std z+2,R3
0260 2182 std z+1,R2
0262 .dbline 294
0262 ; OSFlagFreeList = pgrp;
0262 50930100 sts _OSFlagFreeList+1,R21
0266 40930000 sts _OSFlagFreeList,R20
026A .dbline 295
026A ; OS_EXIT_CRITICAL();
026A 0A93 st -y,r16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -