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

📄 os_task.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;432        if (ptcb == OS_TCB_RESERVED) {                              /* Must not be assigned to Mutex       */
0002e6  2c01              CMP      r4,#1
0002e8  d105              BNE      |L1.758|
;;;433            OS_EXIT_CRITICAL();
0002ea  4638              MOV      r0,r7
0002ec  f7fff7ff          BL       OS_CPU_SR_Restore
;;;434            return (OS_ERR_TASK_DEL);
0002f0  203d              MOVS     r0,#0x3d
0002f2  e8bde8bd          POP      {r4-r10,pc}
                  |L1.758|
;;;435        }
;;;436        y            =  ptcb->OSTCBY;
0002f6  f894f894          LDRB     r2,[r4,#0x30]
;;;437        OSRdyTbl[y] &= ~ptcb->OSTCBBitX;
0002fa  4849              LDR      r0,|L1.1056|
0002fc  f894f894          LDRB     r3,[r4,#0x31]
000300  5c81              LDRB     r1,[r0,r2]
000302  4399              BICS     r1,r1,r3
000304  5481              STRB     r1,[r0,r2]
;;;438        if (OSRdyTbl[y] == 0) {                                     /* Make task not ready                 */
000306  5c80              LDRB     r0,[r0,r2]
000308  b930              CBNZ     r0,|L1.792|
;;;439            OSRdyGrp &= ~ptcb->OSTCBBitY;
00030a  4846              LDR      r0,|L1.1060|
00030c  f894f894          LDRB     r1,[r4,#0x32]
000310  7803              LDRB     r3,[r0,#0]  ; OSRdyGrp
000312  ea23ea23          BIC      r1,r3,r1
000316  7001              STRB     r1,[r0,#0]  ; OSRdyGrp
                  |L1.792|
;;;440        }
;;;441        
;;;442    #if OS_EVENT_EN
;;;443        pevent = ptcb->OSTCBEventPtr;
000318  69e1              LDR      r1,[r4,#0x1c]
;;;444        if (pevent != (OS_EVENT *)0) {                              /* If task is waiting on event         */
00031a  b161              CBZ      r1,|L1.822|
;;;445            pevent->OSEventTbl[y] &= ~ptcb->OSTCBBitX;
00031c  440a              ADD      r2,r2,r1
00031e  7ad0              LDRB     r0,[r2,#0xb]
000320  f894f894          LDRB     r3,[r4,#0x31]
000324  4398              BICS     r0,r0,r3
000326  72d0              STRB     r0,[r2,#0xb]
;;;446            if (pevent->OSEventTbl[y] == 0) {                       /* ... remove task from ...            */
000328  7ad0              LDRB     r0,[r2,#0xb]
00032a  b920              CBNZ     r0,|L1.822|
;;;447                pevent->OSEventGrp &= ~ptcb->OSTCBBitY;             /* ... event ctrl block                */
00032c  7a88              LDRB     r0,[r1,#0xa]
00032e  f894f894          LDRB     r2,[r4,#0x32]
000332  4390              BICS     r0,r0,r2
000334  7288              STRB     r0,[r1,#0xa]
                  |L1.822|
;;;448            }
;;;449        }
;;;450    #endif
;;;451    
;;;452    #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;453        pnode = ptcb->OSTCBFlagNode;
000336  6a60              LDR      r0,[r4,#0x24]
;;;454        if (pnode != (OS_FLAG_NODE *)0) {                           /* If task is waiting on event flag    */
000338  b108              CBZ      r0,|L1.830|
;;;455            OS_FlagUnlink(pnode);                                   /* Remove from wait list               */
00033a  f7fff7ff          BL       OS_FlagUnlink
                  |L1.830|
;;;456        }
;;;457    #endif
;;;458    
;;;459        ptcb->OSTCBDly      = 0;                                    /* Prevent OSTimeTick() from updating  */
00033e  f04ff04f          MOV      r8,#0
000342  f8a4f8a4          STRH     r8,[r4,#0x2a]
;;;460        ptcb->OSTCBStat     = OS_STAT_RDY;                          /* Prevent task from being resumed     */
000346  f884f884          STRB     r8,[r4,#0x2c]
;;;461        ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
00034a  f884f884          STRB     r8,[r4,#0x2d]
;;;462        if (OSLockNesting < 255u) {                                 /* Make sure we don't context switch   */
00034e  f8dff8df          LDR      r9,|L1.1072|
000352  f899f899          LDRB     r0,[r9,#0]  ; OSLockNesting
000356  28ff              CMP      r0,#0xff
000358  d202              BCS      |L1.864|
;;;463            OSLockNesting++;
00035a  1c40              ADDS     r0,r0,#1
00035c  f889f889          STRB     r0,[r9,#0]  ; OSLockNesting
                  |L1.864|
;;;464        }
;;;465        OS_EXIT_CRITICAL();                                         /* Enabling INT. ignores next instruc. */
000360  4638              MOV      r0,r7
000362  f7fff7ff          BL       OS_CPU_SR_Restore
;;;466        OS_Dummy();                                                 /* ... Dummy ensures that INTs will be */
000366  f7fff7ff          BL       OS_Dummy
;;;467        OS_ENTER_CRITICAL();                                        /* ... disabled HERE!                  */
00036a  f7fff7ff          BL       OS_CPU_SR_Save
00036e  4607              MOV      r7,r0
;;;468        if (OSLockNesting > 0) {                                    /* Remove context switch lock          */
000370  f899f899          LDRB     r1,[r9,#0]  ; OSLockNesting
000374  b111              CBZ      r1,|L1.892|
;;;469            OSLockNesting--;
000376  1e48              SUBS     r0,r1,#1
000378  f889f889          STRB     r0,[r9,#0]  ; OSLockNesting
                  |L1.892|
;;;470        }
;;;471        OSTaskDelHook(ptcb);                                        /* Call user defined hook              */
00037c  4620              MOV      r0,r4
00037e  f7fff7ff          BL       OSTaskDelHook
;;;472        OSTaskCtr--;                                                /* One less task being managed         */
000382  492c              LDR      r1,|L1.1076|
000384  7808              LDRB     r0,[r1,#0]  ; OSTaskCtr
000386  1e40              SUBS     r0,r0,#1
000388  7008              STRB     r0,[r1,#0]  ; OSTaskCtr
;;;473        OSTCBPrioTbl[prio] = (OS_TCB *)0;                           /* Clear old priority entry            */
00038a  f846f846          STR      r8,[r6,r5,LSL #2]
;;;474        if (ptcb->OSTCBPrev == (OS_TCB *)0) {                       /* Remove from TCB chain               */
00038e  69a1              LDR      r1,[r4,#0x18]
000390  b931              CBNZ     r1,|L1.928|
;;;475            ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
000392  6960              LDR      r0,[r4,#0x14]
000394  f8c0f8c0          STR      r8,[r0,#0x18]
;;;476            OSTCBList                  = ptcb->OSTCBNext;
000398  4927              LDR      r1,|L1.1080|
00039a  6960              LDR      r0,[r4,#0x14]
00039c  6008              STR      r0,[r1,#0]  ; OSTCBList
00039e  e004              B        |L1.938|
                  |L1.928|
;;;477        } else {
;;;478            ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
0003a0  6960              LDR      r0,[r4,#0x14]
0003a2  6148              STR      r0,[r1,#0x14]
;;;479            ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
0003a4  6961              LDR      r1,[r4,#0x14]
0003a6  69a0              LDR      r0,[r4,#0x18]
0003a8  6188              STR      r0,[r1,#0x18]
                  |L1.938|
;;;480        }
;;;481        ptcb->OSTCBNext   = OSTCBFreeList;                          /* Return TCB to free TCB list         */
0003aa  4824              LDR      r0,|L1.1084|
0003ac  6801              LDR      r1,[r0,#0]  ; OSTCBFreeList
0003ae  6161              STR      r1,[r4,#0x14]
;;;482        OSTCBFreeList     = ptcb;
0003b0  6004              STR      r4,[r0,#0]  ; OSTCBFreeList
;;;483    #if OS_TASK_NAME_SIZE > 1
;;;484        ptcb->OSTCBTaskName[0] = '?';                               /* Unknown name                        */
0003b2  203f              MOVS     r0,#0x3f
0003b4  f884f884          STRB     r0,[r4,#0x48]
;;;485        ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
0003b8  f884f884          STRB     r8,[r4,#0x49]
;;;486    #endif
;;;487        OS_EXIT_CRITICAL();
0003bc  4638              MOV      r0,r7
0003be  f7fff7ff          BL       OS_CPU_SR_Restore
;;;488        if (OSRunning == OS_TRUE) {
0003c2  4819              LDR      r0,|L1.1064|
0003c4  7800              LDRB     r0,[r0,#0]  ; OSRunning
0003c6  2801              CMP      r0,#1
0003c8  d101              BNE      |L1.974|
;;;489            OS_Sched();                                             /* Find new highest priority task      */
0003ca  f7fff7ff          BL       OS_Sched
                  |L1.974|
;;;490        }
;;;491        return (OS_ERR_NONE);
0003ce  2000              MOVS     r0,#0
;;;492    }
0003d0  e8bde8bd          POP      {r4-r10,pc}
;;;493    #endif
                          ENDP

                  OSTaskDelReq PROC
;;;542    INT8U  OSTaskDelReq (INT8U prio)
;;;543    {
0003d4  b510              PUSH     {r4,lr}
0003d6  4604              MOV      r4,r0
;;;544        INT8U      stat;
;;;545        OS_TCB    *ptcb;
;;;546    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;547        OS_CPU_SR  cpu_sr = 0;
;;;548    #endif
;;;549    
;;;550    
;;;551    
;;;552        if (prio == OS_TASK_IDLE_PRIO) {                            /* Not allowed to delete idle task     */
0003d8  2c1f              CMP      r4,#0x1f
0003da  d101              BNE      |L1.992|
;;;553            return (OS_ERR_TASK_DEL_IDLE);
0003dc  203e              MOVS     r0,#0x3e
;;;554        }
;;;555    #if OS_ARG_CHK_EN > 0
;;;556        if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */
;;;557            if (prio != OS_PRIO_SELF) {
;;;558                return (OS_ERR_PRIO_INVALID);
;;;559            }
;;;560        }
;;;561    #endif
;;;562        if (prio == OS_PRIO_SELF) {                                 /* See if a task is requesting to ...  */
;;;563            OS_ENTER_CRITICAL();                                    /* ... this task to delete itself      */
;;;564            stat = OSTCBCur->OSTCBDelReq;                           /* Return request status to caller     */
;;;565            OS_EXIT_CRITICAL();
;;;566            return (stat);
;;;567        }
;;;568        OS_ENTER_CRITICAL();
;;;569        ptcb = OSTCBPrioTbl[prio];
;;;570        if (ptcb == (OS_TCB *)0) {                                  /* Task to delete must exist           */
;;;571            OS_EXIT_CRITICAL();
;;;572            return (OS_ERR_TASK_NOT_EXIST);                         /* Task must already be deleted        */
;;;573        }
;;;574        if (ptcb == OS_TCB_RESERVED) {                              /* Must NOT be assigned to a Mutex     */
;;;575            OS_EXIT_CRITICAL();
;;;576            return (OS_ERR_TASK_DEL);
;;;577        }
;;;578        ptcb->OSTCBDelReq = OS_ERR_TASK_DEL_REQ;                    /* Set flag indicating task to be DEL. */
;;;579        OS_EXIT_CRITICAL();
;;;580        return (OS_ERR_NONE);
;;;581    }
0003de  bd10              POP      {r4,pc}
                  |L1.992|
0003e0  d303              BCC      |L1.1002|
0003e2  2cff              CMP      r4,#0xff
0003e4  d001              BEQ      |L1.1002|
0003e6  202a              MOVS     r0,#0x2a
0003e8  bd10              POP      {r4,pc}
                  |L1.1002|
0003ea  2cff              CMP      r4,#0xff
0003ec  d109              BNE      |L1.1026|
0003ee  f7fff7ff          BL       OS_CPU_SR_Save
0003f2  490a              LDR      r1,|L1.1052|
0003f4  6809              LDR      r1,[r1,#0]  ; OSTCBCur
0003f6  f891f891          LDRB     r4,[r1,#0x33]
0003fa  f7fff7ff          BL       OS_CPU_SR_Restore
0003fe  4620              MOV      r0,r4
000400  bd10              POP      {r4,pc}
                  |L1.1026|
000402  f7fff7ff          BL       OS_CPU_SR_Save
000406  4904              LDR      r1,|L1.1048|
000408  f851f851          LDR      r1,[r1,r4,LSL #2]
00040c  b9c1              CBNZ     r1,|L1.1088|
00040e  f7fff7ff          BL       OS_CPU_SR_Restore
000412  2043              MOVS     r0,#0x43
                  |L1.1044|
000414  bd10              POP      {r4,pc}
000416  0000              DCW      0x0000
                  |L1.1048|
000418  00000000          DCD      OSTCBPrioTbl
                  |L1.1052|
00041c  00000000          DCD      OSTCBCur
                  |L1.1056|
000420  00000000          DCD      OSRdyTbl
                  |L1.1060|
000424  00000000          DCD      OSRdyGrp
                  |L1.1064|
000428  00000000          DCD      OSRunning
                  |L1.1068|
00042c  00000000          DCD      OSIntNesting
                  |L1.1072|
000430  00000000          DCD      OSLockNesting
                  |L1.1076|
000434  00000000          DCD      OSTaskCtr
                  |L1.1080|
000438  00000000          DCD      OSTCBList
                  |L1.1084|
00043c  00000000          DCD      OSTCBFreeList
                  |L1.1088|
000440  2901              CMP      r1,#1
000442  d103              BNE      |L1.1100|
000444  f7fff7ff          BL       OS_CPU_SR_Restore
000448  203d              MOVS     r0,#0x3d
00044a  e7e3              B        |L1.1044|
                  |L1.1100|
00044c  223f              MOVS     r2,#0x3f
00044e  f881f881          STRB     r2,[r1,#0x33]
000452  f7fff7ff          BL       OS_CPU_SR_Restore
000456  2000              MOVS     r0,#0
000458  e7dc              B        |L1.1044|
;;;582    #endif
                          ENDP

                  OSTaskNameGet PROC
;;;610    INT8U  OSTaskNameGet (INT8U prio, INT8U *pname, INT8U *perr)
;;;611    {

⌨️ 快捷键说明

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