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

📄 os_flag.lis

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