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

📄 os_flag.lis

📁 ucos如何移植到单片机mega128
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module OS_FLAG.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\study\ucos_ii\ucos2_iccavr\iccavr\ucos2_without_cpu\OS_FLAG.C
 0000                   .dbfunc e OSFlagAccept _OSFlagAccept fc
 0000                   .dbstruct 0 4 .1
 0000                   .dbfield 0 OSFlagType c
 0000                   .dbfield 1 OSFlagWaitList pV
 0000                   .dbfield 3 OSFlagFlags c
 0000                   .dbend
 0000           ;      flags_rdy -> R10
 0000           ;        consume -> R12
 0000           ;      flags_cur -> R20
 0000           ;            err -> R22,R23
 0000           ;      wait_type -> R20
 0000           ;          flags -> R18
 0000           ;           pgrp -> R16,R17
                        .even
 0000           _OSFlagAccept::
 0000 0E940000          xcall push_gset4
 0004 4885              ldd R20,y+8
 0006 6A85              ldd R22,y+10
 0008 7B85              ldd R23,y+11
 000A                   .dbline -1
 000A                   .dbline 79
 000A           ; /*
 000A           ; *********************************************************************************************************
 000A           ; *                                                uC/OS-II
 000A           ; *                                          The Real-Time Kernel
 000A           ; *                                         EVENT FLAG  MANAGEMENT
 000A           ; *
 000A           ; *                          (c) Copyright 2001-2002, Jean J. Labrosse, Weston, FL
 000A           ; *                                           All Rights Reserved
 000A           ; *
 000A           ; * File : OS_FLAG.C
 000A           ; * By   : Jean J. Labrosse
 000A           ; *********************************************************************************************************
 000A           ; */
 000A           ; 
 000A           ; #ifndef  OS_MASTER_FILE
 000A           ; #include "..\ucos2_application\INCLUDES.H"
 000A           ; #endif
 000A           ; 
 000A           ; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
 000A           ; /*
 000A           ; *********************************************************************************************************
 000A           ; *                                            LOCAL PROTOTYPES
 000A           ; *********************************************************************************************************
 000A           ; */
 000A           ; 
 000A           ; static  void     OS_FlagBlock(OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout);
 000A           ; static  BOOLEAN  OS_FlagTaskRdy(OS_FLAG_NODE *pnode, OS_FLAGS flags_rdy);
 000A           ; 
 000A           ; /*$PAGE*/
 000A           ; /*
 000A           ; *********************************************************************************************************
 000A           ; *                              CHECK THE STATUS OF FLAGS IN AN EVENT FLAG GROUP
 000A           ; *
 000A           ; * Description: This function is called to check the status of a combination of bits to be set or cleared
 000A           ; *              in an event flag group.  Your application can check for ANY bit to be set/cleared or ALL
 000A           ; *              bits to be set/cleared.
 000A           ; *
 000A           ; *              This call does not block if the desired flags are not present.
 000A           ; *
 000A           ; * Arguments  : pgrp          is a pointer to the desired event flag group.
 000A           ; *
 000A           ; *              flags         Is a bit pattern indicating which bit(s) (i.e. flags) you wish to check.
 000A           ; *                            The bits you want are specified by setting the corresponding bits in
 000A           ; *                            'flags'.  e.g. if your application wants to wait for bits 0 and 1 then
 000A           ; *                            'flags' would contain 0x03.
 000A           ; *
 000A           ; *              wait_type     specifies whether you want ALL bits to be set/cleared or ANY of the bits
 000A           ; *                            to be set/cleared.
 000A           ; *                            You can specify the following argument:
 000A           ; *
 000A           ; *                            OS_FLAG_WAIT_CLR_ALL   You will check ALL bits in 'flags' to be clear (0)
 000A           ; *                            OS_FLAG_WAIT_CLR_ANY   You will check ANY bit  in 'flags' to be clear (0)
 000A           ; *                            OS_FLAG_WAIT_SET_ALL   You will check ALL bits in 'flags' to be set   (1)
 000A           ; *                            OS_FLAG_WAIT_SET_ANY   You will check ANY bit  in 'flags' to be set   (1)
 000A           ; *
 000A           ; *                            NOTE: Add OS_FLAG_CONSUME if you want the event flag to be 'consumed' by
 000A           ; *                                  the call.  Example, to wait for any flag in a group AND then clear
 000A           ; *                                  the flags that are present, set 'wait_type' to:
 000A           ; *
 000A           ; *                                  OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME
 000A           ; *
 000A           ; *              err           is a pointer to an error code and can be:
 000A           ; *                            OS_NO_ERR              No error
 000A           ; *                            OS_ERR_EVENT_TYPE      You are not pointing to an event flag group
 000A           ; *                            OS_FLAG_ERR_WAIT_TYPE  You didn't specify a proper 'wait_type' argument.
 000A           ; *                            OS_FLAG_INVALID_PGRP   You passed a NULL pointer instead of the event flag
 000A           ; *                                                   group handle.
 000A           ; *                            OS_FLAG_ERR_NOT_RDY    The desired flags you are waiting for are not
 000A           ; *                                                   available.
 000A           ; *
 000A           ; * Returns    : The state of the flags in the event flag group.
 000A           ; *
 000A           ; * Called from: Task or ISR
 000A           ; *********************************************************************************************************
 000A           ; */
 000A           ; 
 000A           ; #if OS_FLAG_ACCEPT_EN > 0
 000A           ; OS_FLAGS  OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err)
 000A           ; {
 000A                   .dbline 89
 000A           ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 000A           ;     OS_CPU_SR     cpu_sr;
 000A           ; #endif
 000A           ;     OS_FLAGS      flags_cur;
 000A           ;     OS_FLAGS      flags_rdy;
 000A           ;     BOOLEAN       consume;
 000A           ; 
 000A           ; 
 000A           ; #if OS_ARG_CHK_EN > 0
 000A           ;     if (pgrp == (OS_FLAG_GRP *)0) {                        /* Validate 'pgrp'                          */
 000A 0030              cpi R16,0
 000C 0107              cpc R16,R17
 000E 29F4              brne L4
 0010           X0:
 0010                   .dbline 89
 0010                   .dbline 90
 0010           ;         *err = OS_FLAG_INVALID_PGRP;
 0010 86E9              ldi R24,150
 0012 FB01              movw R30,R22
 0014 8083              std z+0,R24
 0016                   .dbline 91
 0016           ;         return ((OS_FLAGS)0);
 0016 0027              clr R16
 0018 9CC0              xjmp L3
 001A           L4:
 001A                   .dbline 93
 001A           ;     }
 001A           ;     if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {          /* Validate event block type                */
 001A F801              movw R30,R16
 001C 8081              ldd R24,z+0
 001E 8530              cpi R24,5
 0020 29F0              breq L6
 0022                   .dbline 93
 0022                   .dbline 94
 0022           ;         *err = OS_ERR_EVENT_TYPE;
 0022 81E0              ldi R24,1
 0024 FB01              movw R30,R22
 0026 8083              std z+0,R24
 0028                   .dbline 95
 0028           ;         return ((OS_FLAGS)0);
 0028 0027              clr R16
 002A 93C0              xjmp L3
 002C           L6:
 002C                   .dbline 98
 002C           ;     }
 002C           ; #endif
 002C           ;     if (wait_type & OS_FLAG_CONSUME) {                     /* See if we need to consume the flags      */
 002C 47FF              sbrs R20,7
 002E 04C0              rjmp L8
 0030                   .dbline 98
 0030                   .dbline 99
 0030           ;         wait_type &= ~OS_FLAG_CONSUME;
 0030 4F77              andi R20,127
 0032                   .dbline 100
 0032           ;         consume    = TRUE;
 0032 CC24              clr R12
 0034 C394              inc R12
 0036                   .dbline 101
 0036 01C0              xjmp L9
 0038           L8:
 0038                   .dbline 101
 0038           ;     } else {
 0038                   .dbline 102
 0038           ;         consume    = FALSE;
 0038 CC24              clr R12
 003A                   .dbline 103
 003A           ;     }
 003A           L9:
 003A                   .dbline 105
 003A           ; /*$PAGE*/
 003A           ;     *err = OS_NO_ERR;                                      /* Assume NO error until proven otherwise.  */
 003A 2224              clr R2
 003C FB01              movw R30,R22
 003E 2082              std z+0,R2
 0040                   .dbline 106
 0040           ;     OS_ENTER_CRITICAL();
 0040 0A93              st -y,r16
 0042 0FB7              in r16,0x3F
 0044 F894              cli
 0046 0F93              push r16
 0048 0991              ld r16,y+
 004A                   .dbline 106
 004A                   .dbline 107
 004A 5527              clr R21
 004C 4030              cpi R20,0
 004E 4507              cpc R20,R21
 0050 09F4              brne X3
 0052 43C0              xjmp L23
 0054           X3:
 0054           X1:
 0054 4130              cpi R20,1
 0056 E0E0              ldi R30,0
 0058 5E07              cpc R21,R30
 005A 09F4              brne X4
 005C 58C0              xjmp L28
 005E           X4:
 005E 4230              cpi R20,2
 0060 E0E0              ldi R30,0
 0062 5E07              cpc R21,R30
 0064 29F0              breq L13
 0066 4330              cpi R20,3
 0068 E0E0              ldi R30,0
 006A 5E07              cpc R21,R30
 006C E1F0              breq L18
 006E 68C0              xjmp L10
 0070           X2:
 0070                   .dbline 107
 0070           ;     switch (wait_type) {
 0070           L13:
 0070                   .dbline 109
 0070           ;         case OS_FLAG_WAIT_SET_ALL:                         /* See if all required flags are set        */
 0070           ;              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
 0070 F801              movw R30,R16
 0072 A380              ldd R10,z+3
 0074 A222              and R10,R18
 0076                   .dbline 110
 0076           ;              if (flags_rdy == flags) {                     /* Must match ALL the bits that we want     */
 0076 A216              cp R10,R18
 0078 61F4              brne L14
 007A                   .dbline 110
 007A                   .dbline 111
 007A           ;                  if (consume == TRUE) {                    /* See if we need to consume the flags      */
 007A 8C2D              mov R24,R12
 007C 8130              cpi R24,1
 007E 61F4              brne L15
 0080                   .dbline 111
 0080                   .dbline 112
 0080           ;                      pgrp->OSFlagFlags &= ~flags_rdy;      /* Clear ONLY the flags that we wanted      */
 0080 C801              movw R24,R16
 0082 0396              adiw R24,3
 0084 4A2C              mov R4,R10
 0086 4094              com R4
 0088 FC01              movw R30,R24
 008A 5080              ldd R5,z+0
 008C 5420              and R5,R4
 008E 5082              std z+0,R5
 0090                   .dbline 113
 0090           ;                  }
 0090                   .dbline 114
 0090 03C0              xjmp L15
 0092           L14:
 0092                   .dbline 114
 0092           ;              } else {
 0092                   .dbline 115
 0092           ;                  *err  = OS_FLAG_ERR_NOT_RDY;
 0092 88E9              ldi R24,152
 0094 FB01              movw R30,R22
 0096 8083              std z+0,R24
 0098                   .dbline 116
 0098           ;              }
 0098           L15:
 0098                   .dbline 117
 0098           ;              flags_cur = pgrp->OSFlagFlags;                /* Will return the state of the group       */
 0098 F801              movw R30,R16
 009A 4381              ldd R20,z+3
 009C                   .dbline 118
 009C           ;              OS_EXIT_CRITICAL();
 009C 0A93              st -y,r16
 009E 0F91              pop r16
 00A0 0FBF              out 0x3F,r16
 00A2 0991              ld r16,y+
 00A4                   .dbline 118
 00A4                   .dbline 119
 00A4           ;              break;
 00A4 55C0              xjmp L11
 00A6           L18:
 00A6                   .dbline 122
 00A6           ; 
 00A6           ;         case OS_FLAG_WAIT_SET_ANY:
 00A6           ;              flags_rdy = pgrp->OSFlagFlags & flags;        /* Extract only the bits we want            */
 00A6 F801              movw R30,R16
 00A8 A380              ldd R10,z+3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -