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

📄 os_flag.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;351                 pgrp->OSFlagWaitList = (void *)OSFlagFreeList;/* Return group to free list                */
00025a  f8d9f8d9          LDR      r0,[r9,#0]  ; OSFlagFreeList
00025e  6060              STR      r0,[r4,#4]
;;;352                 pgrp->OSFlagFlags    = (OS_FLAGS)0;
000260  f8a4f8a4          STRH     r10,[r4,#8]
;;;353                 OSFlagFreeList       = pgrp;
000264  f8c9f8c9          STR      r4,[r9,#0]  ; OSFlagFreeList
;;;354                 OS_EXIT_CRITICAL();
000268  4658              MOV      r0,r11
00026a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;355                 if (tasks_waiting == OS_TRUE) {               /* Reschedule only if task(s) were waiting  */
00026e  2f01              CMP      r7,#1
000270  d101              BNE      |L1.630|
;;;356                     OS_Sched();                               /* Find highest priority task ready to run  */
000272  f7fff7ff          BL       OS_Sched
                  |L1.630|
;;;357                 }
;;;358                 *perr = OS_ERR_NONE;
000276  f885f885          STRB     r10,[r5,#0]
;;;359                 pgrp_return          = (OS_FLAG_GRP *)0;      /* Event Flag Group has been deleted        */
00027a  2000              MOVS     r0,#0
00027c  e8bde8bd          POP      {r4-r12,pc}
                  |L1.640|
;;;360                 break;
;;;361    
;;;362            default:
;;;363                 OS_EXIT_CRITICAL();
000280  4658              MOV      r0,r11
000282  f7fff7ff          BL       OS_CPU_SR_Restore
;;;364                 *perr                = OS_ERR_INVALID_OPT;
000286  2007              MOVS     r0,#7
000288  7028              STRB     r0,[r5,#0]
;;;365                 pgrp_return          = pgrp;
00028a  4620              MOV      r0,r4
;;;366                 break;
;;;367        }
;;;368        return (pgrp_return);
;;;369    }
00028c  e8bde8bd          POP      {r4-r12,pc}
;;;370    #endif
                          ENDP

                  OSFlagNameGet PROC
;;;396    INT8U  OSFlagNameGet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;397    {
000290  e92de92d          PUSH     {r4-r8,lr}
000294  4605              MOV      r5,r0
000296  460e              MOV      r6,r1
000298  4614              MOV      r4,r2
;;;398        INT8U      len;
;;;399    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;400        OS_CPU_SR  cpu_sr = 0;
;;;401    #endif
;;;402    
;;;403    
;;;404    
;;;405    #if OS_ARG_CHK_EN > 0
;;;406        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
00029a  b914              CBNZ     r4,|L1.674|
;;;407            return (0);
00029c  2000              MOVS     r0,#0
00029e  e8bde8bd          POP      {r4-r8,pc}
                  |L1.674|
;;;408        }
;;;409        if (pgrp == (OS_FLAG_GRP *)0) {              /* Is 'pgrp' a NULL pointer?                          */
0002a2  b925              CBNZ     r5,|L1.686|
;;;410            *perr = OS_ERR_FLAG_INVALID_PGRP;
0002a4  206e              MOVS     r0,#0x6e
0002a6  7020              STRB     r0,[r4,#0]
;;;411            return (0);
0002a8  2000              MOVS     r0,#0
0002aa  e8bde8bd          POP      {r4-r8,pc}
                  |L1.686|
;;;412        }
;;;413        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
0002ae  b926              CBNZ     r6,|L1.698|
;;;414            *perr = OS_ERR_PNAME_NULL;
0002b0  200c              MOVS     r0,#0xc
0002b2  7020              STRB     r0,[r4,#0]
;;;415            return (0);
0002b4  2000              MOVS     r0,#0
0002b6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.698|
;;;416        }
;;;417    #endif
;;;418        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
0002ba  4886              LDR      r0,|L1.1236|
0002bc  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0002be  b120              CBZ      r0,|L1.714|
;;;419            *perr = OS_ERR_NAME_GET_ISR;
0002c0  2011              MOVS     r0,#0x11
0002c2  7020              STRB     r0,[r4,#0]
;;;420            return (0);
0002c4  2000              MOVS     r0,#0
0002c6  e8bde8bd          POP      {r4-r8,pc}
                  |L1.714|
;;;421        }
;;;422        OS_ENTER_CRITICAL();
0002ca  f7fff7ff          BL       OS_CPU_SR_Save
0002ce  4607              MOV      r7,r0
;;;423        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
0002d0  7828              LDRB     r0,[r5,#0]
0002d2  2805              CMP      r0,#5
0002d4  d007              BEQ      |L1.742|
;;;424            OS_EXIT_CRITICAL();
0002d6  4638              MOV      r0,r7
0002d8  f7fff7ff          BL       OS_CPU_SR_Restore
;;;425            *perr = OS_ERR_EVENT_TYPE;
0002dc  2001              MOVS     r0,#1
0002de  7020              STRB     r0,[r4,#0]
;;;426            return (0);
0002e0  2000              MOVS     r0,#0
0002e2  e8bde8bd          POP      {r4-r8,pc}
                  |L1.742|
;;;427        }
;;;428        len   = OS_StrCopy(pname, pgrp->OSFlagName); /* Copy name from OS_FLAG_GRP                         */
0002e6  f105f105          ADD      r1,r5,#0xa
0002ea  4630              MOV      r0,r6
0002ec  f7fff7ff          BL       OS_StrCopy
0002f0  4605              MOV      r5,r0
;;;429        OS_EXIT_CRITICAL();
0002f2  4638              MOV      r0,r7
0002f4  f7fff7ff          BL       OS_CPU_SR_Restore
;;;430        *perr = OS_ERR_NONE;
0002f8  2000              MOVS     r0,#0
0002fa  7020              STRB     r0,[r4,#0]
;;;431        return (len);
0002fc  4628              MOV      r0,r5
;;;432    }
0002fe  e8bde8bd          POP      {r4-r8,pc}
;;;433    #endif
                          ENDP

                  OSFlagNameSet PROC
;;;460    void  OSFlagNameSet (OS_FLAG_GRP *pgrp, INT8U *pname, INT8U *perr)
;;;461    {
000302  e92de92d          PUSH     {r4-r8,lr}
000306  4605              MOV      r5,r0
000308  460e              MOV      r6,r1
00030a  4614              MOV      r4,r2
;;;462        INT8U      len;
;;;463    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;464        OS_CPU_SR  cpu_sr = 0;
;;;465    #endif
;;;466    
;;;467    
;;;468    
;;;469    #if OS_ARG_CHK_EN > 0
;;;470        if (perr == (INT8U *)0) {                    /* Validate 'perr'                                    */
00030c  2c00              CMP      r4,#0
00030e  d002              BEQ      |L1.790|
;;;471            return;
;;;472        }
;;;473        if (pgrp == (OS_FLAG_GRP *)0) {              /* Is 'pgrp' a NULL pointer?                          */
000310  b91d              CBNZ     r5,|L1.794|
;;;474            *perr = OS_ERR_FLAG_INVALID_PGRP;
000312  206e              MOVS     r0,#0x6e
000314  7020              STRB     r0,[r4,#0]
                  |L1.790|
000316  e8bde8bd          POP      {r4-r8,pc}
                  |L1.794|
;;;475            return;
;;;476        }
;;;477        if (pname == (INT8U *)0) {                   /* Is 'pname' a NULL pointer?                         */
00031a  b91e              CBNZ     r6,|L1.804|
;;;478            *perr = OS_ERR_PNAME_NULL;
00031c  200c              MOVS     r0,#0xc
00031e  7020              STRB     r0,[r4,#0]
000320  e8bde8bd          POP      {r4-r8,pc}
                  |L1.804|
;;;479            return;
;;;480        }
;;;481    #endif
;;;482        if (OSIntNesting > 0) {                      /* See if trying to call from an ISR                  */
000324  486b              LDR      r0,|L1.1236|
000326  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
000328  b118              CBZ      r0,|L1.818|
;;;483            *perr = OS_ERR_NAME_SET_ISR;
00032a  2012              MOVS     r0,#0x12
00032c  7020              STRB     r0,[r4,#0]
00032e  e8bde8bd          POP      {r4-r8,pc}
                  |L1.818|
;;;484            return;
;;;485        }
;;;486        OS_ENTER_CRITICAL();
000332  f7fff7ff          BL       OS_CPU_SR_Save
000336  4607              MOV      r7,r0
;;;487        if (pgrp->OSFlagType != OS_EVENT_TYPE_FLAG) {
000338  7828              LDRB     r0,[r5,#0]
00033a  2805              CMP      r0,#5
00033c  d006              BEQ      |L1.844|
;;;488            OS_EXIT_CRITICAL();
00033e  4638              MOV      r0,r7
000340  f7fff7ff          BL       OS_CPU_SR_Restore
;;;489            *perr = OS_ERR_EVENT_TYPE;
000344  2001              MOVS     r0,#1
000346  7020              STRB     r0,[r4,#0]
000348  e8bde8bd          POP      {r4-r8,pc}
                  |L1.844|
;;;490            return;
;;;491        }
;;;492        len = OS_StrLen(pname);                      /* Can we fit the string in the storage area?         */
00034c  4630              MOV      r0,r6
00034e  f7fff7ff          BL       OS_StrLen
;;;493        if (len > (OS_FLAG_NAME_SIZE - 1)) {         /* No                                                 */
000352  280f              CMP      r0,#0xf
000354  d906              BLS      |L1.868|
;;;494            OS_EXIT_CRITICAL();
000356  4638              MOV      r0,r7
000358  f7fff7ff          BL       OS_CPU_SR_Restore
;;;495            *perr = OS_ERR_FLAG_NAME_TOO_LONG;
00035c  2073              MOVS     r0,#0x73
00035e  7020              STRB     r0,[r4,#0]
000360  e8bde8bd          POP      {r4-r8,pc}
                  |L1.868|
;;;496            return;
;;;497        }
;;;498        (void)OS_StrCopy(pgrp->OSFlagName, pname);   /* Yes, copy name from OS_FLAG_GRP                    */
000364  4631              MOV      r1,r6
000366  f105f105          ADD      r0,r5,#0xa
00036a  f7fff7ff          BL       OS_StrCopy
;;;499        OS_EXIT_CRITICAL();
00036e  4638              MOV      r0,r7
000370  f7fff7ff          BL       OS_CPU_SR_Restore
;;;500        *perr = OS_ERR_NONE;
000374  2000              MOVS     r0,#0
000376  7020              STRB     r0,[r4,#0]
;;;501        return;
;;;502    }
000378  e8bde8bd          POP      {r4-r8,pc}
;;;503    #endif
                          ENDP

                  OS_FlagBlock PROC
;;;988    static  void  OS_FlagBlock (OS_FLAG_GRP *pgrp, OS_FLAG_NODE *pnode, OS_FLAGS flags, INT8U wait_type, INT16U timeout)
;;;989    {
00037c  b470              PUSH     {r4-r6}
00037e  9c03              LDR      r4,[sp,#0xc]
;;;990        OS_FLAG_NODE  *pnode_next;
;;;991        INT8U          y;
;;;992    
;;;993    
;;;994        OSTCBCur->OSTCBStat      |= OS_STAT_FLAG;
000380  4d58              LDR      r5,|L1.1252|
000382  f8d5f8d5          LDR      r12,[r5,#0]  ; OSTCBCur
000386  f89cf89c          LDRB     r6,[r12,#0x2c]
00038a  f046f046          ORR      r6,r6,#0x20
00038e  f88cf88c          STRB     r6,[r12,#0x2c]
;;;995        OSTCBCur->OSTCBStatPend   = OS_STAT_PEND_OK;
000392  2600              MOVS     r6,#0
000394  f88cf88c          STRB     r6,[r12,#0x2d]
;;;996        OSTCBCur->OSTCBDly        = timeout;              /* Store timeout in task's TCB                   */
000398  f8acf8ac          STRH     r4,[r12,#0x2a]
;;;997    #if OS_TASK_DEL_EN > 0
;;;998        OSTCBCur->OSTCBFlagNode   = pnode;                /* TCB to link to node                           */
00039c  f8ccf8cc          STR      r1,[r12,#0x24]
;;;999    #endif
;;;1000       pnode->OSFlagNodeFlags    = flags;                /* Save the flags that we need to wait for       */
0003a0  820a              STRH     r2,[r1,#0x10]
;;;1001       pnode->OSFlagNodeWaitType = wait_type;            /* Save the type of wait we are doing            */
0003a2  748b              STRB     r3,[r1,#0x12]
;;;1002       pnode->OSFlagNodeTCB      = (void *)OSTCBCur;     /* Link to task's TCB                            */
0003a4  f8c1f8c1          STR      r12,[r1,#8]
;;;1003       pnode->OSFlagNodeNext     = pgrp->OSFlagWaitList; /* Add node at beginning of event flag wait list */
0003a8  6842              LDR      r2,[r0,#4]
0003aa  600a              STR      r2,[r1,#0]
;;;1004       pnode->OSFlagNodePrev     = (void *)0;

⌨️ 快捷键说明

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