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

📄 os_task.txt

📁 ucos2 is a file system for embedded applications which can be used on any media, for which you can p
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                  |L1.1888|
000760  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.1892|
000764  e3a00000          MOV      r0,#0                 ;805
000768  eaffffdb          B        |L1.1756|
                  |L1.1900|
00076c  ebfffffe          BL       OS_CPU_SR_Restore
000770  e3a00044          MOV      r0,#0x44              ;808
000774  eaffffd8          B        |L1.1756|
;;;810    #endif
                          ENDP

                  OSTaskStkChk PROC
;;;832    INT8U  OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
;;;833    {
000778  e92d41f0          PUSH     {r4-r8,lr}
00077c  e1a04000          MOV      r4,r0
;;;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             */
;;;846            if (prio != OS_PRIO_SELF) {
;;;847                return (OS_ERR_PRIO_INVALID);
;;;848            }
;;;849        }
;;;850        if (p_stk_data == (OS_STK_DATA *)0) {              /* Validate 'p_stk_data'                        */
;;;851            return (OS_ERR_PDATA_NULL);
;;;852        }
;;;853    #endif
;;;854        p_stk_data->OSFree = 0;                            /* Assume failure, set to 0 size                */
000780  e3a00000          MOV      r0,#0
;;;855        p_stk_data->OSUsed = 0;
000784  e5810000          STR      r0,[r1,#0]
000788  e1a06001          MOV      r6,r1                 ;833
00078c  e5810004          STR      r0,[r1,#4]
;;;856        OS_ENTER_CRITICAL();
000790  ebfffffe          BL       OS_CPU_SR_Save
;;;857        if (prio == OS_PRIO_SELF) {                        /* See if check for SELF                        */
000794  e35400ff          CMP      r4,#0xff
;;;858            prio = OSTCBCur->OSTCBPrio;
000798  059f11b8          LDREQ    r1,|L1.2392|
00079c  05911000          LDREQ    r1,[r1,#0]  ; OSTCBCur
0007a0  05d1402e          LDRBEQ   r4,[r1,#0x2e]
;;;859        }
;;;860        ptcb = OSTCBPrioTbl[prio];
0007a4  e59f11a8          LDR      r1,|L1.2388|
0007a8  e7911104          LDR      r1,[r1,r4,LSL #2]
;;;861        if (ptcb == (OS_TCB *)0) {                         /* Make sure task exist                         */
0007ac  e3510000          CMP      r1,#0
;;;862            OS_EXIT_CRITICAL();
;;;863            return (OS_ERR_TASK_NOT_EXIST);
;;;864        }
;;;865        if (ptcb == OS_TCB_RESERVED) {
0007b0  13510001          CMPNE    r1,#1
0007b4  1a000003          BNE      |L1.1992|
;;;866            OS_EXIT_CRITICAL();
0007b8  ebfffffe          BL       OS_CPU_SR_Restore
;;;867            return (OS_ERR_TASK_NOT_EXIST);
0007bc  e3a00043          MOV      r0,#0x43
                  |L1.1984|
0007c0  e8bd41f0          POP      {r4-r8,lr}
;;;868        }
;;;869        if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set       */
;;;870            OS_EXIT_CRITICAL();
;;;871            return (OS_ERR_TASK_OPT);
;;;872        }
;;;873        free = 0;
;;;874        size = ptcb->OSTCBStkSize;
;;;875        pchk = ptcb->OSTCBStkBottom;
;;;876        OS_EXIT_CRITICAL();
;;;877    #if OS_STK_GROWTH == 1
;;;878        while (*pchk++ == (OS_STK)0) {                    /* Compute the number of zero entries on the stk */
;;;879            free++;
;;;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 */
;;;887        p_stk_data->OSUsed = (size - free) * sizeof(OS_STK);  /* Compute number of bytes used on the stack */
;;;888        return (OS_ERR_NONE);
;;;889    }
0007c4  e12fff1e          BX       lr
                  |L1.1992|
0007c8  e1d121b0          LDRH     r2,[r1,#0x10]         ;869
0007cc  e3120001          TST      r2,#1                 ;869
0007d0  1a000002          BNE      |L1.2016|
0007d4  ebfffffe          BL       OS_CPU_SR_Restore
0007d8  e3a00045          MOV      r0,#0x45              ;871
0007dc  eafffff7          B        |L1.1984|
                  |L1.2016|
0007e0  e2817008          ADD      r7,r1,#8              ;875
0007e4  e89700a0          LDM      r7,{r5,r7}            ;875
0007e8  e3a04000          MOV      r4,#0                 ;873
0007ec  ebfffffe          BL       OS_CPU_SR_Restore
                  |L1.2032|
0007f0  e4950004          LDR      r0,[r5],#4            ;878
0007f4  e3500000          CMP      r0,#0                 ;878
0007f8  02844001          ADDEQ    r4,r4,#1              ;879
0007fc  0afffffb          BEQ      |L1.2032|
000800  e1a00104          LSL      r0,r4,#2              ;886
000804  e5860000          STR      r0,[r6,#0]            ;886
000808  e0470004          SUB      r0,r7,r4              ;887
00080c  e1a00100          LSL      r0,r0,#2              ;887
000810  e5860004          STR      r0,[r6,#4]            ;887
000814  e3a00000          MOV      r0,#0                 ;888
000818  eaffffe8          B        |L1.1984|
;;;890    #endif
                          ENDP

                  OSTaskSuspend PROC
;;;916    INT8U  OSTaskSuspend (INT8U prio)
;;;917    {
00081c  e92d4070          PUSH     {r4-r6,lr}
000820  e1a05000          MOV      r5,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    */
;;;929            return (OS_ERR_TASK_SUSPEND_IDLE);
;;;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();
000824  ebfffffe          BL       OS_CPU_SR_Save
000828  e59f1128          LDR      r1,|L1.2392|
;;;938        if (prio == OS_PRIO_SELF) {                                 /* See if suspend SELF                 */
00082c  e35500ff          CMP      r5,#0xff
;;;939            prio = OSTCBCur->OSTCBPrio;
000830  e5911000          LDR      r1,[r1,#0]  ; OSTCBCur
000834  05d1502e          LDRBEQ   r5,[r1,#0x2e]
;;;940            self = OS_TRUE;
000838  0a000003          BEQ      |L1.2124|
;;;941        } else if (prio == OSTCBCur->OSTCBPrio) {                   /* See if suspending self              */
00083c  e5d1102e          LDRB     r1,[r1,#0x2e]
000840  e1510005          CMP      r1,r5
;;;942            self = OS_TRUE;
;;;943        } else {
;;;944            self = OS_FALSE;                                        /* No suspending another task          */
000844  13a04000          MOVNE    r4,#0
000848  1a000000          BNE      |L1.2128|
                  |L1.2124|
00084c  e3a04001          MOV      r4,#1                 ;942
                  |L1.2128|
;;;945        }
;;;946        ptcb = OSTCBPrioTbl[prio];
000850  e59f10fc          LDR      r1,|L1.2388|
000854  e7911105          LDR      r1,[r1,r5,LSL #2]
;;;947        if (ptcb == (OS_TCB *)0) {                                  /* Task to suspend must exist          */
000858  e3510000          CMP      r1,#0
00085c  1a000003          BNE      |L1.2160|
;;;948            OS_EXIT_CRITICAL();
000860  ebfffffe          BL       OS_CPU_SR_Restore
;;;949            return (OS_ERR_TASK_SUSPEND_PRIO);
000864  e3a00048          MOV      r0,#0x48
                  |L1.2152|
000868  e8bd4070          POP      {r4-r6,lr}
;;;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    }
00086c  e12fff1e          BX       lr
                  |L1.2160|
000870  e3510001          CMP      r1,#1                 ;951
000874  1a000002          BNE      |L1.2180|
000878  ebfffffe          BL       OS_CPU_SR_Restore
00087c  e3a00043          MOV      r0,#0x43              ;953
000880  eafffff8          B        |L1.2152|
                  |L1.2180|
000884  e5d12030          LDRB     r2,[r1,#0x30]         ;955
000888  e59f30cc          LDR      r3,|L1.2396|
00088c  e5d1e031          LDRB     lr,[r1,#0x31]         ;956
000890  e7d3c002          LDRB     r12,[r3,r2]           ;956
000894  e1ccc00e          BIC      r12,r12,lr            ;956
000898  e7c3c002          STRB     r12,[r3,r2]           ;956
00089c  e7d32002          LDRB     r2,[r3,r2]            ;957
0008a0  e3520000          CMP      r2,#0                 ;957
0008a4  059f20b4          LDREQ    r2,|L1.2400|
0008a8  05d13032          LDRBEQ   r3,[r1,#0x32]         ;958
0008ac  05d2c000          LDRBEQ   r12,[r2,#0]           ;958  ; OSRdyGrp
0008b0  01cc3003          BICEQ    r3,r12,r3             ;958
0008b4  05c23000          STRBEQ   r3,[r2,#0]            ;958  ; OSRdyGrp
0008b8  e5d1202c          LDRB     r2,[r1,#0x2c]         ;960
0008bc  e3822008          ORR      r2,r2,#8              ;960
0008c0  e5c1202c          STRB     r2,[r1,#0x2c]         ;960
0008c4  ebfffffe          BL       OS_CPU_SR_Restore
0008c8  e3540001          CMP      r4,#1                 ;962
0008cc  0bfffffe          BLEQ     OS_Sched
0008d0  e3a00000          MOV      r0,#0                 ;965
0008d4  eaffffe3          B        |L1.2152|
;;;967    #endif
                          ENDP

                  OSTaskQuery PROC
;;;989    INT8U  OSTaskQuery (INT8U prio, OS_TCB *p_task_data)
;;;990    {
0008d8  e92d4070          PUSH     {r4-r6,lr}
0008dc  e1a05000          MOV      r5,r0
0008e0  e1a06001          MOV      r6,r1
;;;991        OS_TCB    *ptcb;
;;;992    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;993        OS_CPU_SR  cpu_sr = 0;
;;;994    #endif
;;;995    
;;;996    
;;;997    
;;;998    #if OS_ARG_CHK_EN > 0
;;;999        if (prio > OS_LOWEST_PRIO) {                 /* Task priority valid ?                              */
;;;1000           if (prio != OS_PRIO_SELF) {
;;;1001               return (OS_ERR_PRIO_INVALID);
;;;1002           }
;;;1003       }
;;;1004       if (p_task_data == (OS_TCB *)0) {            /* Validate 'p_task_data'                             */
;;;1005           return (OS_ERR_PDATA_NULL);
;;;1006       }
;;;1007   #endif
;;;1008       OS_ENTER_CRITICAL();
0008e4  ebfffffe          BL       OS_CPU_SR_Save
;;;1009       if (prio == OS_PRIO_SELF) {                  /* See if suspend SELF                        

⌨️ 快捷键说明

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