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

📄 os_task.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
00045a  e92de92d          PUSH     {r4-r8,lr}
00045e  4605              MOV      r5,r0
000460  460e              MOV      r6,r1
000462  4614              MOV      r4,r2
;;;612        OS_TCB    *ptcb;
;;;613        INT8U      len;
;;;614    #if OS_CRITICAL_METHOD == 3                              /* Allocate storage for CPU status register   */
;;;615        OS_CPU_SR  cpu_sr = 0;
;;;616    #endif
;;;617    
;;;618    
;;;619    
;;;620    #if OS_ARG_CHK_EN > 0
;;;621        if (perr == (INT8U *)0) {                            /* Validate 'perr'                            */
000464  b914              CBNZ     r4,|L1.1132|
;;;622            return (0);
000466  2000              MOVS     r0,#0
000468  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1132|
;;;623        }
;;;624        if (prio > OS_LOWEST_PRIO) {                         /* Task priority valid ?                      */
00046c  2d1f              CMP      r5,#0x1f
00046e  d906              BLS      |L1.1150|
;;;625            if (prio != OS_PRIO_SELF) {
000470  2dff              CMP      r5,#0xff
000472  d004              BEQ      |L1.1150|
;;;626                *perr = OS_ERR_PRIO_INVALID;                 /* No                                         */
000474  202a              MOVS     r0,#0x2a
000476  7020              STRB     r0,[r4,#0]
;;;627                return (0);
000478  2000              MOVS     r0,#0
00047a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1150|
;;;628            }
;;;629        }
;;;630        if (pname == (INT8U *)0) {                           /* Is 'pname' a NULL pointer?                 */
00047e  b926              CBNZ     r6,|L1.1162|
;;;631            *perr = OS_ERR_PNAME_NULL;                       /* Yes                                        */
000480  200c              MOVS     r0,#0xc
000482  7020              STRB     r0,[r4,#0]
;;;632            return (0);
000484  2000              MOVS     r0,#0
000486  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1162|
;;;633        }
;;;634    #endif
;;;635        if (OSIntNesting > 0) {                              /* See if trying to call from an ISR          */
00048a  48ca              LDR      r0,|L1.1972|
00048c  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00048e  b120              CBZ      r0,|L1.1178|
;;;636            *perr = OS_ERR_NAME_GET_ISR;
000490  2011              MOVS     r0,#0x11
000492  7020              STRB     r0,[r4,#0]
;;;637            return (0);
000494  2000              MOVS     r0,#0
000496  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1178|
;;;638        }
;;;639        OS_ENTER_CRITICAL();
00049a  f7fff7ff          BL       OS_CPU_SR_Save
00049e  4607              MOV      r7,r0
;;;640        if (prio == OS_PRIO_SELF) {                          /* See if caller desires it's own name        */
0004a0  2dff              CMP      r5,#0xff
0004a2  d103              BNE      |L1.1196|
;;;641            prio = OSTCBCur->OSTCBPrio;
0004a4  48c4              LDR      r0,|L1.1976|
0004a6  6800              LDR      r0,[r0,#0]  ; OSTCBCur
0004a8  f890f890          LDRB     r5,[r0,#0x2e]
                  |L1.1196|
;;;642        }
;;;643        ptcb = OSTCBPrioTbl[prio];
0004ac  48c3              LDR      r0,|L1.1980|
0004ae  f850f850          LDR      r0,[r0,r5,LSL #2]
;;;644        if (ptcb == (OS_TCB *)0) {                           /* Does task exist?                           */
0004b2  2543              MOVS     r5,#0x43
0004b4  b930              CBNZ     r0,|L1.1220|
;;;645            OS_EXIT_CRITICAL();                              /* No                                         */
0004b6  4638              MOV      r0,r7
0004b8  f7fff7ff          BL       OS_CPU_SR_Restore
;;;646            *perr = OS_ERR_TASK_NOT_EXIST;
0004bc  7025              STRB     r5,[r4,#0]
;;;647            return (0);
0004be  2000              MOVS     r0,#0
0004c0  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1220|
;;;648        }
;;;649        if (ptcb == OS_TCB_RESERVED) {                       /* Task assigned to a Mutex?                  */
0004c4  2801              CMP      r0,#1
0004c6  d106              BNE      |L1.1238|
;;;650            OS_EXIT_CRITICAL();                              /* Yes                                        */
0004c8  4638              MOV      r0,r7
0004ca  f7fff7ff          BL       OS_CPU_SR_Restore
;;;651            *perr = OS_ERR_TASK_NOT_EXIST;
0004ce  7025              STRB     r5,[r4,#0]
;;;652            return (0);
0004d0  2000              MOVS     r0,#0
0004d2  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1238|
;;;653        }
;;;654        len   = OS_StrCopy(pname, ptcb->OSTCBTaskName);      /* Yes, copy name from TCB                    */
0004d6  f100f100          ADD      r1,r0,#0x48
0004da  4630              MOV      r0,r6
0004dc  f7fff7ff          BL       OS_StrCopy
0004e0  4605              MOV      r5,r0
;;;655        OS_EXIT_CRITICAL();
0004e2  4638              MOV      r0,r7
0004e4  f7fff7ff          BL       OS_CPU_SR_Restore
;;;656        *perr = OS_ERR_NONE;
0004e8  2000              MOVS     r0,#0
0004ea  7020              STRB     r0,[r4,#0]
;;;657        return (len);
0004ec  4628              MOV      r0,r5
;;;658    }
0004ee  e8bde8bd          POP      {r4-r8,pc}
;;;659    #endif
                          ENDP

                  OSTaskNameSet PROC
;;;689    void  OSTaskNameSet (INT8U prio, INT8U *pname, INT8U *perr)
;;;690    {
0004f2  e92de92d          PUSH     {r4-r8,lr}
0004f6  4605              MOV      r5,r0
0004f8  460e              MOV      r6,r1
0004fa  4614              MOV      r4,r2
;;;691        INT8U      len;
;;;692        OS_TCB    *ptcb;
;;;693    #if OS_CRITICAL_METHOD == 3                          /* Allocate storage for CPU status register       */
;;;694        OS_CPU_SR  cpu_sr = 0;
;;;695    #endif
;;;696    
;;;697    
;;;698    
;;;699    #if OS_ARG_CHK_EN > 0
;;;700        if (perr == (INT8U *)0) {                        /* Validate 'perr'                                */
0004fc  2c00              CMP      r4,#0
0004fe  d005              BEQ      |L1.1292|
;;;701            return;
;;;702        }
;;;703        if (prio > OS_LOWEST_PRIO) {                     /* Task priority valid ?                          */
000500  2d1f              CMP      r5,#0x1f
000502  d905              BLS      |L1.1296|
;;;704            if (prio != OS_PRIO_SELF) {
000504  2dff              CMP      r5,#0xff
000506  d003              BEQ      |L1.1296|
;;;705                *perr = OS_ERR_PRIO_INVALID;             /* No                                             */
000508  202a              MOVS     r0,#0x2a
00050a  7020              STRB     r0,[r4,#0]
                  |L1.1292|
00050c  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1296|
;;;706                return;
;;;707            }
;;;708        }
;;;709        if (pname == (INT8U *)0) {                       /* Is 'pname' a NULL pointer?                     */
000510  b91e              CBNZ     r6,|L1.1306|
;;;710            *perr = OS_ERR_PNAME_NULL;                   /* Yes                                            */
000512  200c              MOVS     r0,#0xc
000514  7020              STRB     r0,[r4,#0]
000516  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1306|
;;;711            return;
;;;712        }
;;;713    #endif
;;;714        if (OSIntNesting > 0) {                          /* See if trying to call from an ISR              */
00051a  48a6              LDR      r0,|L1.1972|
00051c  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
00051e  b118              CBZ      r0,|L1.1320|
;;;715            *perr = OS_ERR_NAME_SET_ISR;
000520  2012              MOVS     r0,#0x12
000522  7020              STRB     r0,[r4,#0]
000524  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1320|
;;;716            return;
;;;717        }
;;;718        OS_ENTER_CRITICAL();
000528  f7fff7ff          BL       OS_CPU_SR_Save
00052c  4607              MOV      r7,r0
;;;719        if (prio == OS_PRIO_SELF) {                      /* See if caller desires to set it's own name     */
00052e  2dff              CMP      r5,#0xff
000530  d103              BNE      |L1.1338|
;;;720            prio = OSTCBCur->OSTCBPrio;
000532  48a1              LDR      r0,|L1.1976|
000534  6800              LDR      r0,[r0,#0]  ; OSTCBCur
000536  f890f890          LDRB     r5,[r0,#0x2e]
                  |L1.1338|
;;;721        }
;;;722        ptcb = OSTCBPrioTbl[prio];
00053a  48a0              LDR      r0,|L1.1980|
00053c  f850f850          LDR      r5,[r0,r5,LSL #2]
;;;723        if (ptcb == (OS_TCB *)0) {                       /* Does task exist?                               */
000540  f04ff04f          MOV      r8,#0x43
000544  b935              CBNZ     r5,|L1.1364|
;;;724            OS_EXIT_CRITICAL();                          /* No                                             */
000546  4638              MOV      r0,r7
000548  f7fff7ff          BL       OS_CPU_SR_Restore
;;;725            *perr = OS_ERR_TASK_NOT_EXIST;
00054c  f884f884          STRB     r8,[r4,#0]
000550  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1364|
;;;726            return;
;;;727        }
;;;728        if (ptcb == OS_TCB_RESERVED) {                   /* Task assigned to a Mutex?                      */
000554  2d01              CMP      r5,#1
000556  d106              BNE      |L1.1382|
;;;729            OS_EXIT_CRITICAL();                          /* Yes                                            */
000558  4638              MOV      r0,r7
00055a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;730            *perr = OS_ERR_TASK_NOT_EXIST;
00055e  f884f884          STRB     r8,[r4,#0]
000562  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1382|
;;;731            return;
;;;732        }
;;;733        len = OS_StrLen(pname);                          /* Yes, Can we fit the string in the TCB?         */
000566  4630              MOV      r0,r6
000568  f7fff7ff          BL       OS_StrLen
;;;734        if (len > (OS_TASK_NAME_SIZE - 1)) {             /*      No                                        */
00056c  280f              CMP      r0,#0xf
00056e  d906              BLS      |L1.1406|
;;;735            OS_EXIT_CRITICAL();
000570  4638              MOV      r0,r7
000572  f7fff7ff          BL       OS_CPU_SR_Restore
;;;736            *perr = OS_ERR_TASK_NAME_TOO_LONG;
000576  2041              MOVS     r0,#0x41
000578  7020              STRB     r0,[r4,#0]
00057a  e8bde8bd          POP      {r4-r8,pc}
                  |L1.1406|
;;;737            return;
;;;738        }
;;;739        (void)OS_StrCopy(ptcb->OSTCBTaskName, pname);    /*      Yes, copy to TCB                          */
00057e  4631              MOV      r1,r6
000580  f105f105          ADD      r0,r5,#0x48
000584  f7fff7ff          BL       OS_StrCopy
;;;740        OS_EXIT_CRITICAL();
000588  4638              MOV      r0,r7
00058a  f7fff7ff          BL       OS_CPU_SR_Restore
;;;741        *perr = OS_ERR_NONE;
00058e  2000              MOVS     r0,#0
000590  7020              STRB     r0,[r4,#0]
;;;742    }
000592  e8bde8bd          POP      {r4-r8,pc}
;;;743    #endif
                          ENDP

                  OSTaskResume PROC
;;;765    INT8U  OSTaskResume (INT8U prio)
;;;766    {
000596  b510              PUSH     {r4,lr}
000598  4604              MOV      r4,r0
;;;767        OS_TCB    *ptcb;
;;;768    #if OS_CRITICAL_METHOD == 3                                   /* Storage for CPU status register       */
;;;769        OS_CPU_SR  cpu_sr = 0;
;;;770    #endif
;;;771    
;;;772    
;;;773    
;;;774    #if OS_ARG_CHK_EN > 0
;;;775        if (prio >= OS_LOWEST_PRIO) {                             /* Make sure task priority is valid      */
00059a  2c1f              CMP      r4,#0x1f
00059c  d301              BCC      |L1.1442|
;;;776            return (OS_ERR_PRIO_INVALID);
00059e  202a              MOVS     r0,#0x2a
;;;777        }
;;;778    #endif
;;;779        OS_ENTER_CRITICAL();
;;;780        ptcb = OSTCBPrioTbl[prio];
;;;781        if (ptcb == (OS_TCB *)0) {                                /* Task to suspend must exist            */
;;;782            OS_EXIT_CRITICAL();
;;;783            return (OS_ERR_TASK_RESUME_PRIO);
;;;784        }
;;;785        if (ptcb == OS_TCB_RESERVED) {                            /* See if assigned to Mutex              */
;;;786            OS_EXIT_CRITICAL();
;;;787            return (OS_ERR_TASK_NOT_EXIST);
;;;788        }

⌨️ 快捷键说明

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