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

📄 os_task.txt

📁 ucos2.86版本结合STM板极支持包
💻 TXT
📖 第 1 页 / 共 5 页
字号:
;;;213            err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
00018c  2300              MOVS     r3,#0
00018e  4601              MOV      r1,r0
000190  9300              STR      r3,[sp,#0]
000192  9301              STR      r3,[sp,#4]
000194  461a              MOV      r2,r3
000196  4620              MOV      r0,r4
000198  9302              STR      r3,[sp,#8]
00019a  f7fff7ff          BL       OS_TCBInit
00019e  4605              MOV      r5,r0
;;;214            if (err == OS_ERR_NONE) {
0001a0  b935              CBNZ     r5,|L1.432|
;;;215                if (OSRunning == OS_TRUE) {      /* Find highest priority task if multitasking has started */
0001a2  48a1              LDR      r0,|L1.1064|
0001a4  7800              LDRB     r0,[r0,#0]  ; OSRunning
0001a6  2801              CMP      r0,#1
0001a8  d109              BNE      |L1.446|
;;;216                    OS_Sched();
0001aa  f7fff7ff          BL       OS_Sched
0001ae  e006              B        |L1.446|
                  |L1.432|
;;;217                }
;;;218            } else {
;;;219                OS_ENTER_CRITICAL();
0001b0  f7fff7ff          BL       OS_CPU_SR_Save
;;;220                OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
0001b4  2100              MOVS     r1,#0
0001b6  f846f846          STR      r1,[r6,r4,LSL #2]
;;;221                OS_EXIT_CRITICAL();
0001ba  f7fff7ff          BL       OS_CPU_SR_Restore
                  |L1.446|
;;;222            }
;;;223            return (err);
0001be  4628              MOV      r0,r5
0001c0  b004              ADD      sp,sp,#0x10
0001c2  e8bde8bd          POP      {r4-r8,pc}
                  |L1.454|
;;;224        }
;;;225        OS_EXIT_CRITICAL();
0001c6  f7fff7ff          BL       OS_CPU_SR_Restore
;;;226        return (OS_ERR_PRIO_EXIST);
0001ca  2028              MOVS     r0,#0x28
;;;227    }
0001cc  b004              ADD      sp,sp,#0x10
0001ce  e8bde8bd          POP      {r4-r8,pc}
;;;228    #endif
                          ENDP

                  OS_TaskStkClr PROC
;;;1052   {
;;;1053       if ((opt & OS_TASK_OPT_STK_CHK) != 0x0000) {       /* See if stack checking has been enabled       */
0001d2  f012f012          TST      r2,#1
0001d6  d00a              BEQ      |L1.494|
;;;1054           if ((opt & OS_TASK_OPT_STK_CLR) != 0x0000) {   /* See if stack needs to be cleared             */
0001d8  f012f012          TST      r2,#2
0001dc  d007              BEQ      |L1.494|
;;;1055   #if OS_STK_GROWTH == 1
;;;1056               while (size > 0) {                         /* Stack grows from HIGH to LOW memory          */
0001de  2900              CMP      r1,#0
0001e0  d005              BEQ      |L1.494|
0001e2  2200              MOVS     r2,#0
                  |L1.484|
;;;1057                   size--;
0001e4  1e49              SUBS     r1,r1,#1
0001e6  f840f840          STR      r2,[r0],#4
0001ea  2900              CMP      r1,#0
0001ec  d1fa              BNE      |L1.484|
                  |L1.494|
;;;1058                   *pbos++ = (OS_STK)0;                   /* Clear from bottom of stack and up!           */
;;;1059               }
;;;1060   #else
;;;1061               while (size > 0) {                         /* Stack grows from LOW to HIGH memory          */
;;;1062                   size--;
;;;1063                   *pbos-- = (OS_STK)0;                   /* Clear from bottom of stack and down          */
;;;1064               }
;;;1065   #endif
;;;1066           }
;;;1067       }
;;;1068   }
0001ee  4770              BX       lr
;;;1069   
                          ENDP

                  OSTaskCreateExt PROC
;;;309                            INT16U   opt)
;;;310    {
0001f0  e92de92d          PUSH     {r0-r11,lr}
0001f4  b083              SUB      sp,sp,#0xc
0001f6  ad10              ADD      r5,sp,#0x40
0001f8  e895e895          LDM      r5,{r5,r7-r10}
0001fc  4683              MOV      r11,r0
0001fe  461c              MOV      r4,r3
;;;311        OS_STK    *psp;
;;;312        INT8U      err;
;;;313    #if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
;;;314        OS_CPU_SR  cpu_sr = 0;
;;;315    #endif
;;;316    
;;;317    
;;;318    
;;;319    #if OS_ARG_CHK_EN > 0
;;;320        if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
000200  2c1f              CMP      r4,#0x1f
000202  d903              BLS      |L1.524|
;;;321            return (OS_ERR_PRIO_INVALID);
000204  202a              MOVS     r0,#0x2a
000206  b007              ADD      sp,sp,#0x1c
000208  e8bde8bd          POP      {r4-r11,pc}
                  |L1.524|
;;;322        }
;;;323    #endif
;;;324        OS_ENTER_CRITICAL();
00020c  f7fff7ff          BL       OS_CPU_SR_Save
;;;325        if (OSIntNesting > 0) {                  /* Make sure we don't create the task from within an ISR  */
000210  4986              LDR      r1,|L1.1068|
000212  7809              LDRB     r1,[r1,#0]  ; OSIntNesting
000214  b129              CBZ      r1,|L1.546|
;;;326            OS_EXIT_CRITICAL();
000216  f7fff7ff          BL       OS_CPU_SR_Restore
;;;327            return (OS_ERR_TASK_CREATE_ISR);
00021a  203c              MOVS     r0,#0x3c
00021c  b007              ADD      sp,sp,#0x1c
00021e  e8bde8bd          POP      {r4-r11,pc}
                  |L1.546|
;;;328        }
;;;329        if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
000222  4e7d              LDR      r6,|L1.1048|
000224  f856f856          LDR      r1,[r6,r4,LSL #2]
000228  2900              CMP      r1,#0
00022a  d12f              BNE      |L1.652|
;;;330            OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ...  */
00022c  2101              MOVS     r1,#1
00022e  f846f846          STR      r1,[r6,r4,LSL #2]
;;;331                                                 /* ... the same thing until task is created.              */
;;;332            OS_EXIT_CRITICAL();
000232  f7fff7ff          BL       OS_CPU_SR_Restore
;;;333    
;;;334    #if OS_TASK_STAT_STK_CHK_EN > 0
;;;335            OS_TaskStkClr(pbos, stk_size, opt);                    /* Clear the task stack (if needed)     */
000236  4652              MOV      r2,r10
000238  4641              MOV      r1,r8
00023a  4638              MOV      r0,r7
00023c  f7fff7ff          BL       OS_TaskStkClr
;;;336    #endif        
;;;337    
;;;338            psp = OSTaskStkInit(task, p_arg, ptos, opt);           /* Initialize the task's stack          */
000240  4653              MOV      r3,r10
000242  4658              MOV      r0,r11
000244  9a05              LDR      r2,[sp,#0x14]
000246  9904              LDR      r1,[sp,#0x10]
000248  f7fff7ff          BL       OSTaskStkInit
;;;339            err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
00024c  4601              MOV      r1,r0
00024e  462b              MOV      r3,r5
000250  463a              MOV      r2,r7
000252  4620              MOV      r0,r4
000254  f8cdf8cd          STR      r10,[sp,#8]
000258  f8cdf8cd          STR      r9,[sp,#4]
00025c  f8cdf8cd          STR      r8,[sp,#0]
000260  f7fff7ff          BL       OS_TCBInit
000264  4605              MOV      r5,r0
;;;340            if (err == OS_ERR_NONE) {
000266  b935              CBNZ     r5,|L1.630|
;;;341                if (OSRunning == OS_TRUE) {                        /* Find HPT if multitasking has started */
000268  486f              LDR      r0,|L1.1064|
00026a  7800              LDRB     r0,[r0,#0]  ; OSRunning
00026c  2801              CMP      r0,#1
00026e  d109              BNE      |L1.644|
;;;342                    OS_Sched();
000270  f7fff7ff          BL       OS_Sched
000274  e006              B        |L1.644|
                  |L1.630|
;;;343                }
;;;344            } else {
;;;345                OS_ENTER_CRITICAL();
000276  f7fff7ff          BL       OS_CPU_SR_Save
;;;346                OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* Make this priority avail. to others  */
00027a  2100              MOVS     r1,#0
00027c  f846f846          STR      r1,[r6,r4,LSL #2]
;;;347                OS_EXIT_CRITICAL();
000280  f7fff7ff          BL       OS_CPU_SR_Restore
                  |L1.644|
;;;348            }
;;;349            return (err);
000284  4628              MOV      r0,r5
000286  b007              ADD      sp,sp,#0x1c
000288  e8bde8bd          POP      {r4-r11,pc}
                  |L1.652|
;;;350        }
;;;351        OS_EXIT_CRITICAL();
00028c  f7fff7ff          BL       OS_CPU_SR_Restore
;;;352        return (OS_ERR_PRIO_EXIST);
000290  2028              MOVS     r0,#0x28
;;;353    }
000292  b007              ADD      sp,sp,#0x1c
000294  e8bde8bd          POP      {r4-r11,pc}
;;;354    #endif
                          ENDP

                  OSTaskDel PROC
;;;393    INT8U  OSTaskDel (INT8U prio)
;;;394    {
000298  e92de92d          PUSH     {r4-r10,lr}
00029c  4605              MOV      r5,r0
;;;395    #if OS_EVENT_EN
;;;396        OS_EVENT     *pevent;
;;;397    #endif
;;;398    #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;399        OS_FLAG_NODE *pnode;
;;;400    #endif
;;;401        OS_TCB       *ptcb;
;;;402        INT8U         y;
;;;403    #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;;;404        OS_CPU_SR     cpu_sr = 0;
;;;405    #endif
;;;406    
;;;407    
;;;408    
;;;409        if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
00029e  4863              LDR      r0,|L1.1068|
0002a0  7800              LDRB     r0,[r0,#0]  ; OSIntNesting
0002a2  b110              CBZ      r0,|L1.682|
;;;410            return (OS_ERR_TASK_DEL_ISR);
0002a4  2040              MOVS     r0,#0x40
0002a6  e8bde8bd          POP      {r4-r10,pc}
                  |L1.682|
;;;411        }
;;;412        if (prio == OS_TASK_IDLE_PRIO) {                            /* Not allowed to delete idle task     */
0002aa  2d1f              CMP      r5,#0x1f
0002ac  d102              BNE      |L1.692|
;;;413            return (OS_ERR_TASK_DEL_IDLE);
0002ae  203e              MOVS     r0,#0x3e
0002b0  e8bde8bd          POP      {r4-r10,pc}
                  |L1.692|
;;;414        }
;;;415    #if OS_ARG_CHK_EN > 0
;;;416        if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */
0002b4  d304              BCC      |L1.704|
;;;417            if (prio != OS_PRIO_SELF) {
0002b6  2dff              CMP      r5,#0xff
0002b8  d002              BEQ      |L1.704|
;;;418                return (OS_ERR_PRIO_INVALID);
0002ba  202a              MOVS     r0,#0x2a
0002bc  e8bde8bd          POP      {r4-r10,pc}
                  |L1.704|
;;;419            }
;;;420        }
;;;421    #endif
;;;422    
;;;423        OS_ENTER_CRITICAL();
0002c0  f7fff7ff          BL       OS_CPU_SR_Save
0002c4  4607              MOV      r7,r0
;;;424        if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
0002c6  2dff              CMP      r5,#0xff
0002c8  d103              BNE      |L1.722|
;;;425            prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
0002ca  4854              LDR      r0,|L1.1052|
0002cc  6800              LDR      r0,[r0,#0]  ; OSTCBCur
0002ce  f890f890          LDRB     r5,[r0,#0x2e]
                  |L1.722|
;;;426        }
;;;427        ptcb = OSTCBPrioTbl[prio];
0002d2  4e51              LDR      r6,|L1.1048|
0002d4  f856f856          LDR      r4,[r6,r5,LSL #2]
;;;428        if (ptcb == (OS_TCB *)0) {                                  /* Task to delete must exist           */
0002d8  b92c              CBNZ     r4,|L1.742|
;;;429            OS_EXIT_CRITICAL();
0002da  4638              MOV      r0,r7
0002dc  f7fff7ff          BL       OS_CPU_SR_Restore
;;;430            return (OS_ERR_TASK_NOT_EXIST);
0002e0  2043              MOVS     r0,#0x43
0002e2  e8bde8bd          POP      {r4-r10,pc}
                  |L1.742|
;;;431        }

⌨️ 快捷键说明

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