⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_flag.lis

📁 ucos如何移植到单片机mega128
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -