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

📄 os_task.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;789        if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended                */
;;;790            ptcb->OSTCBStat &= ~(INT8U)OS_STAT_SUSPEND;           /* Remove suspension                     */
;;;791            if (ptcb->OSTCBStat == OS_STAT_RDY) {                 /* See if task is now ready              */
;;;792                if (ptcb->OSTCBDly == 0) {
;;;793                    OSRdyGrp               |= ptcb->OSTCBBitY;    /* Yes, Make task ready to run           */
;;;794                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;795                    OS_EXIT_CRITICAL();
;;;796                    if (OSRunning == OS_TRUE) {
;;;797                        OS_Sched();                               /* Find new highest priority task        */
;;;798                    }
;;;799                } else {
;;;800                    OS_EXIT_CRITICAL();
;;;801                }
;;;802            } else {                                              /* Must be pending on event              */
;;;803                OS_EXIT_CRITICAL();
;;;804            }
;;;805            return (OS_ERR_NONE);
;;;806        }
;;;807        OS_EXIT_CRITICAL();
;;;808        return (OS_ERR_TASK_NOT_SUSPENDED);
;;;809    }
0005a0  bd10              POP      {r4,pc}
                  |L1.1442|
0005a2  f7fff7ff          BL       OS_CPU_SR_Save
0005a6  4985              LDR      r1,|L1.1980|
0005a8  f851f851          LDR      r1,[r1,r4,LSL #2]
0005ac  b919              CBNZ     r1,|L1.1462|
0005ae  f7fff7ff          BL       OS_CPU_SR_Restore
0005b2  2046              MOVS     r0,#0x46
0005b4  bd10              POP      {r4,pc}
                  |L1.1462|
0005b6  2901              CMP      r1,#1
0005b8  d103              BNE      |L1.1474|
0005ba  f7fff7ff          BL       OS_CPU_SR_Restore
0005be  2043              MOVS     r0,#0x43
0005c0  bd10              POP      {r4,pc}
                  |L1.1474|
0005c2  f891f891          LDRB     r2,[r1,#0x2c]
0005c6  f012f012          TST      r2,#8
0005ca  d02a              BEQ      |L1.1570|
0005cc  f022f022          BIC      r2,r2,#8
0005d0  f881f881          STRB     r2,[r1,#0x2c]
0005d4  f891f891          LDRB     r2,[r1,#0x2c]
0005d8  b9fa              CBNZ     r2,|L1.1562|
0005da  8d4a              LDRH     r2,[r1,#0x2a]
0005dc  b9d2              CBNZ     r2,|L1.1556|
0005de  4a78              LDR      r2,|L1.1984|
0005e0  f891f891          LDRB     r3,[r1,#0x32]
0005e4  f892f892          LDRB     r12,[r2,#0]  ; OSRdyGrp
0005e8  ea43ea43          ORR      r3,r3,r12
0005ec  7013              STRB     r3,[r2,#0]  ; OSRdyGrp
0005ee  f891f891          LDRB     r2,[r1,#0x30]
0005f2  4b74              LDR      r3,|L1.1988|
0005f4  f891f891          LDRB     r1,[r1,#0x31]
0005f8  f813f813          LDRB     r12,[r3,r2]
0005fc  ea4cea4c          ORR      r1,r12,r1
000600  5499              STRB     r1,[r3,r2]
000602  f7fff7ff          BL       OS_CPU_SR_Restore
000606  4870              LDR      r0,|L1.1992|
000608  7800              LDRB     r0,[r0,#0]  ; OSRunning
00060a  2801              CMP      r0,#1
00060c  d107              BNE      |L1.1566|
00060e  f7fff7ff          BL       OS_Sched
000612  e004              B        |L1.1566|
                  |L1.1556|
000614  f7fff7ff          BL       OS_CPU_SR_Restore
000618  e001              B        |L1.1566|
                  |L1.1562|
00061a  f7fff7ff          BL       OS_CPU_SR_Restore
                  |L1.1566|
00061e  2000              MOVS     r0,#0
000620  bd10              POP      {r4,pc}
                  |L1.1570|
000622  f7fff7ff          BL       OS_CPU_SR_Restore
000626  2044              MOVS     r0,#0x44
000628  bd10              POP      {r4,pc}
;;;810    #endif
                          ENDP

                  OSTaskStkChk PROC
;;;832    INT8U  OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
;;;833    {
00062a  e92de92d          PUSH     {r4-r8,lr}
00062e  4604              MOV      r4,r0
000630  460d              MOV      r5,r1
;;;834        OS_TCB    *ptcb;
;;;835        OS_STK    *pchk;
;;;836        INT32U     free;
;;;837        INT32U     size;
;;;838    #if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
;;;839        OS_CPU_SR  cpu_sr = 0;
;;;840    #endif
;;;841    
;;;842    
;;;843    
;;;844    #if OS_ARG_CHK_EN > 0
;;;845        if (prio > OS_LOWEST_PRIO) {                       /* Make sure task priority is valid             */
000632  2c1f              CMP      r4,#0x1f
000634  d904              BLS      |L1.1600|
;;;846            if (prio != OS_PRIO_SELF) {
000636  2cff              CMP      r4,#0xff
000638  d002              BEQ      |L1.1600|
;;;847                return (OS_ERR_PRIO_INVALID);
00063a  202a              MOVS     r0,#0x2a
00063c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1600|
;;;848            }
;;;849        }
;;;850        if (p_stk_data == (OS_STK_DATA *)0) {              /* Validate 'p_stk_data'                        */
000640  b915              CBNZ     r5,|L1.1608|
;;;851            return (OS_ERR_PDATA_NULL);
000642  2009              MOVS     r0,#9
000644  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1608|
;;;852        }
;;;853    #endif
;;;854        p_stk_data->OSFree = 0;                            /* Assume failure, set to 0 size                */
000648  2000              MOVS     r0,#0
00064a  6028              STR      r0,[r5,#0]
;;;855        p_stk_data->OSUsed = 0;
00064c  6068              STR      r0,[r5,#4]
;;;856        OS_ENTER_CRITICAL();
00064e  f7fff7ff          BL       OS_CPU_SR_Save
;;;857        if (prio == OS_PRIO_SELF) {                        /* See if check for SELF                        */
000652  2cff              CMP      r4,#0xff
000654  d103              BNE      |L1.1630|
;;;858            prio = OSTCBCur->OSTCBPrio;
000656  4958              LDR      r1,|L1.1976|
000658  6809              LDR      r1,[r1,#0]  ; OSTCBCur
00065a  f891f891          LDRB     r4,[r1,#0x2e]
                  |L1.1630|
;;;859        }
;;;860        ptcb = OSTCBPrioTbl[prio];
00065e  4957              LDR      r1,|L1.1980|
000660  f851f851          LDR      r1,[r1,r4,LSL #2]
;;;861        if (ptcb == (OS_TCB *)0) {                         /* Make sure task exist                         */
000664  b921              CBNZ     r1,|L1.1648|
;;;862            OS_EXIT_CRITICAL();
000666  f7fff7ff          BL       OS_CPU_SR_Restore
;;;863            return (OS_ERR_TASK_NOT_EXIST);
00066a  2043              MOVS     r0,#0x43
00066c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1648|
;;;864        }
;;;865        if (ptcb == OS_TCB_RESERVED) {
000670  2901              CMP      r1,#1
000672  d104              BNE      |L1.1662|
;;;866            OS_EXIT_CRITICAL();
000674  f7fff7ff          BL       OS_CPU_SR_Restore
;;;867            return (OS_ERR_TASK_NOT_EXIST);
000678  2043              MOVS     r0,#0x43
00067a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1662|
;;;868        }
;;;869        if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set       */
00067e  8a0a              LDRH     r2,[r1,#0x10]
000680  f012f012          TST      r2,#1
000684  d104              BNE      |L1.1680|
;;;870            OS_EXIT_CRITICAL();
000686  f7fff7ff          BL       OS_CPU_SR_Restore
;;;871            return (OS_ERR_TASK_OPT);
00068a  2045              MOVS     r0,#0x45
00068c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1680|
;;;872        }
;;;873        free = 0;
000690  2400              MOVS     r4,#0
;;;874        size = ptcb->OSTCBStkSize;
000692  68ce              LDR      r6,[r1,#0xc]
;;;875        pchk = ptcb->OSTCBStkBottom;
000694  688f              LDR      r7,[r1,#8]
;;;876        OS_EXIT_CRITICAL();
000696  f7fff7ff          BL       OS_CPU_SR_Restore
;;;877    #if OS_STK_GROWTH == 1
;;;878        while (*pchk++ == (OS_STK)0) {                    /* Compute the number of zero entries on the stk */
00069a  6839              LDR      r1,[r7,#0]
00069c  1d38              ADDS     r0,r7,#4
00069e  b921              CBNZ     r1,|L1.1706|
                  |L1.1696|
;;;879            free++;
0006a0  1c64              ADDS     r4,r4,#1
0006a2  f850f850          LDR      r1,[r0],#4
0006a6  2900              CMP      r1,#0
0006a8  d0fa              BEQ      |L1.1696|
                  |L1.1706|
;;;880        }
;;;881    #else
;;;882        while (*pchk-- == (OS_STK)0) {
;;;883            free++;
;;;884        }
;;;885    #endif
;;;886        p_stk_data->OSFree = free * sizeof(OS_STK);           /* Compute number of free bytes on the stack */
0006aa  00a0              LSLS     r0,r4,#2
0006ac  6028              STR      r0,[r5,#0]
;;;887        p_stk_data->OSUsed = (size - free) * sizeof(OS_STK);  /* Compute number of bytes used on the stack */
0006ae  1b30              SUBS     r0,r6,r4
0006b0  0080              LSLS     r0,r0,#2
0006b2  6068              STR      r0,[r5,#4]
;;;888        return (OS_ERR_NONE);
0006b4  2000              MOVS     r0,#0
;;;889    }
0006b6  e8bde8bd          POP      {r4-r8,pc}
;;;890    #endif
                          ENDP

                  OSTaskSuspend PROC
;;;916    INT8U  OSTaskSuspend (INT8U prio)
;;;917    {
0006ba  b570              PUSH     {r4-r6,lr}
0006bc  4604              MOV      r4,r0
;;;918        BOOLEAN    self;
;;;919        OS_TCB    *ptcb;
;;;920        INT8U      y;
;;;921    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;922        OS_CPU_SR  cpu_sr = 0;
;;;923    #endif
;;;924    
;;;925    
;;;926    
;;;927    #if OS_ARG_CHK_EN > 0
;;;928        if (prio == OS_TASK_IDLE_PRIO) {                            /* Not allowed to suspend idle task    */
0006be  2c1f              CMP      r4,#0x1f
0006c0  d101              BNE      |L1.1734|
;;;929            return (OS_ERR_TASK_SUSPEND_IDLE);
0006c2  2047              MOVS     r0,#0x47
;;;930        }
;;;931        if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */
;;;932            if (prio != OS_PRIO_SELF) {
;;;933                return (OS_ERR_PRIO_INVALID);
;;;934            }
;;;935        }
;;;936    #endif
;;;937        OS_ENTER_CRITICAL();
;;;938        if (prio == OS_PRIO_SELF) {                                 /* See if suspend SELF                 */
;;;939            prio = OSTCBCur->OSTCBPrio;
;;;940            self = OS_TRUE;
;;;941        } else if (prio == OSTCBCur->OSTCBPrio) {                   /* See if suspending self              */
;;;942            self = OS_TRUE;
;;;943        } else {
;;;944            self = OS_FALSE;                                        /* No suspending another task          */
;;;945        }
;;;946        ptcb = OSTCBPrioTbl[prio];
;;;947        if (ptcb == (OS_TCB *)0) {                                  /* Task to suspend must exist          */
;;;948            OS_EXIT_CRITICAL();
;;;949            return (OS_ERR_TASK_SUSPEND_PRIO);
;;;950        }
;;;951        if (ptcb == OS_TCB_RESERVED) {                              /* See if assigned to Mutex            */
;;;952            OS_EXIT_CRITICAL();
;;;953            return (OS_ERR_TASK_NOT_EXIST);
;;;954        }
;;;955        y            = ptcb->OSTCBY;
;;;956        OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                            /* Make task not ready                 */
;;;957        if (OSRdyTbl[y] == 0) {
;;;958            OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;959        }
;;;960        ptcb->OSTCBStat |= OS_STAT_SUSPEND;                         /* Status of task is 'SUSPENDED'       */
;;;961        OS_EXIT_CRITICAL();
;;;962        if (self == OS_TRUE) {                                      /* Context switch only if SELF         */
;;;963            OS_Sched();                                             /* Find new highest priority task      */
;;;964        }
;;;965        return (OS_ERR_NONE);
;;;966    }
0006c4  bd70              POP      {r4-r6,pc}
                  |L1.1734|
0006c6  d303              BCC      |L1.1744|
0006c8  2cff              CMP      r4,#0xff
0006ca  d001              BEQ      |L1.1744|
0006cc  202a              MOVS     r0,#0x2a
0006ce  bd70              POP      {r4-r6,pc}
                  |L1.1744|
0006d0  f7fff7ff          BL       OS_CPU_SR_Save
0006d4  4938              LDR      r1,|L1.197

⌨️ 快捷键说明

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