os_task.txt

来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,263 行 · 第 1/5 页

TXT
1,263
字号
;;;216                    OS_Sched();
;;;217                }
;;;218            } else {
;;;219                OS_ENTER_CRITICAL();
;;;220                OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
;;;221                OS_EXIT_CRITICAL();
;;;222            }
;;;223            return (err);
;;;224        }
;;;225        OS_EXIT_CRITICAL();
;;;226        return (OS_ERR_PRIO_EXIST);
;;;227    }
000150  b004              ADD      sp,sp,#0x10
000152  e8bd81f0          POP      {r4-r8,pc}
                  |L1.342|
000156  f7fffffe          BL       OS_CPU_SR_Save
00015a  49b4              LDR      r1,|L1.1068|
00015c  7809              LDRB     r1,[r1,#0]            ;204  ; OSIntNesting
00015e  b129              CBZ      r1,|L1.364|
000160  f7fffffe          BL       OS_CPU_SR_Restore
000164  203c              MOVS     r0,#0x3c              ;206
000166  b004              ADD      sp,sp,#0x10
000168  e8bd81f0          POP      {r4-r8,pc}
                  |L1.364|
00016c  4eaa              LDR      r6,|L1.1048|
00016e  f8561024          LDR      r1,[r6,r4,LSL #2]     ;208
000172  2900              CMP      r1,#0                 ;208
000174  d127              BNE      |L1.454|
000176  2101              MOVS     r1,#1                 ;209
000178  f8461024          STR      r1,[r6,r4,LSL #2]     ;209
00017c  f7fffffe          BL       OS_CPU_SR_Restore
000180  2300              MOVS     r3,#0                 ;212
000182  4642              MOV      r2,r8                 ;212
000184  4639              MOV      r1,r7                 ;212
000186  4628              MOV      r0,r5                 ;212
000188  f7fffffe          BL       OSTaskStkInit
00018c  2300              MOVS     r3,#0                 ;213
00018e  4601              MOV      r1,r0                 ;213
000190  9300              STR      r3,[sp,#0]            ;213
000192  9301              STR      r3,[sp,#4]            ;213
000194  461a              MOV      r2,r3                 ;213
000196  4620              MOV      r0,r4                 ;213
000198  9302              STR      r3,[sp,#8]            ;213
00019a  f7fffffe          BL       OS_TCBInit
00019e  4605              MOV      r5,r0                 ;213
0001a0  b935              CBNZ     r5,|L1.432|
0001a2  48a1              LDR      r0,|L1.1064|
0001a4  7800              LDRB     r0,[r0,#0]            ;215  ; OSRunning
0001a6  2801              CMP      r0,#1                 ;215
0001a8  d109              BNE      |L1.446|
0001aa  f7fffffe          BL       OS_Sched
0001ae  e006              B        |L1.446|
                  |L1.432|
0001b0  f7fffffe          BL       OS_CPU_SR_Save
0001b4  2100              MOVS     r1,#0                 ;220
0001b6  f8461024          STR      r1,[r6,r4,LSL #2]     ;220
0001ba  f7fffffe          BL       OS_CPU_SR_Restore
                  |L1.446|
0001be  4628              MOV      r0,r5                 ;223
0001c0  b004              ADD      sp,sp,#0x10
0001c2  e8bd81f0          POP      {r4-r8,pc}
                  |L1.454|
0001c6  f7fffffe          BL       OS_CPU_SR_Restore
0001ca  2028              MOVS     r0,#0x28              ;226
0001cc  b004              ADD      sp,sp,#0x10
0001ce  e8bd81f0          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  f0120f01          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  f0120f02          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
;;;1058                   *pbos++ = (OS_STK)0;                   /* Clear from bottom of stack and up!           */
0001e6  f8402b04          STR      r2,[r0],#4
0001ea  2900              CMP      r1,#0                 ;1056
0001ec  d1fa              BNE      |L1.484|
                  |L1.494|
;;;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  e92d4fff          PUSH     {r0-r11,lr}
0001f4  b083              SUB      sp,sp,#0xc
0001f6  ad10              ADD      r5,sp,#0x40
0001f8  e89507a0          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
;;;322        }
;;;323    #endif
;;;324        OS_ENTER_CRITICAL();
;;;325        if (OSIntNesting > 0) {                  /* Make sure we don't create the task from within an ISR  */
;;;326            OS_EXIT_CRITICAL();
;;;327            return (OS_ERR_TASK_CREATE_ISR);
;;;328        }
;;;329        if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
;;;330            OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ...  */
;;;331                                                 /* ... the same thing until task is created.              */
;;;332            OS_EXIT_CRITICAL();
;;;333    
;;;334    #if OS_TASK_STAT_STK_CHK_EN > 0
;;;335            OS_TaskStkClr(pbos, stk_size, opt);                    /* Clear the task stack (if needed)     */
;;;336    #endif        
;;;337    
;;;338            psp = OSTaskStkInit(task, p_arg, ptos, opt);           /* Initialize the task's stack          */
;;;339            err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
;;;340            if (err == OS_ERR_NONE) {
;;;341                if (OSRunning == OS_TRUE) {                        /* Find HPT if multitasking has started */
;;;342                    OS_Sched();
;;;343                }
;;;344            } else {
;;;345                OS_ENTER_CRITICAL();
;;;346                OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* Make this priority avail. to others  */
;;;347                OS_EXIT_CRITICAL();
;;;348            }
;;;349            return (err);
;;;350        }
;;;351        OS_EXIT_CRITICAL();
;;;352        return (OS_ERR_PRIO_EXIST);
;;;353    }
000206  b007              ADD      sp,sp,#0x1c
000208  e8bd8ff0          POP      {r4-r11,pc}
                  |L1.524|
00020c  f7fffffe          BL       OS_CPU_SR_Save
000210  4986              LDR      r1,|L1.1068|
000212  7809              LDRB     r1,[r1,#0]            ;325  ; OSIntNesting
000214  b129              CBZ      r1,|L1.546|
000216  f7fffffe          BL       OS_CPU_SR_Restore
00021a  203c              MOVS     r0,#0x3c              ;327
00021c  b007              ADD      sp,sp,#0x1c
00021e  e8bd8ff0          POP      {r4-r11,pc}
                  |L1.546|
000222  4e7d              LDR      r6,|L1.1048|
000224  f8561024          LDR      r1,[r6,r4,LSL #2]     ;329
000228  2900              CMP      r1,#0                 ;329
00022a  d12f              BNE      |L1.652|
00022c  2101              MOVS     r1,#1                 ;330
00022e  f8461024          STR      r1,[r6,r4,LSL #2]     ;330
000232  f7fffffe          BL       OS_CPU_SR_Restore
000236  4652              MOV      r2,r10                ;335
000238  4641              MOV      r1,r8                 ;335
00023a  4638              MOV      r0,r7                 ;335
00023c  f7fffffe          BL       OS_TaskStkClr
000240  4653              MOV      r3,r10                ;338
000242  4658              MOV      r0,r11                ;338
000244  9a05              LDR      r2,[sp,#0x14]         ;338
000246  9904              LDR      r1,[sp,#0x10]         ;338
000248  f7fffffe          BL       OSTaskStkInit
00024c  4601              MOV      r1,r0                 ;339
00024e  462b              MOV      r3,r5                 ;339
000250  463a              MOV      r2,r7                 ;339
000252  4620              MOV      r0,r4                 ;339
000254  f8cda008          STR      r10,[sp,#8]           ;339
000258  f8cd9004          STR      r9,[sp,#4]            ;339
00025c  f8cd8000          STR      r8,[sp,#0]            ;339
000260  f7fffffe          BL       OS_TCBInit
000264  4605              MOV      r5,r0                 ;339
000266  b935              CBNZ     r5,|L1.630|
000268  486f              LDR      r0,|L1.1064|
00026a  7800              LDRB     r0,[r0,#0]            ;341  ; OSRunning
00026c  2801              CMP      r0,#1                 ;341
00026e  d109              BNE      |L1.644|
000270  f7fffffe          BL       OS_Sched
000274  e006              B        |L1.644|
                  |L1.630|
000276  f7fffffe          BL       OS_CPU_SR_Save
00027a  2100              MOVS     r1,#0                 ;346
00027c  f8461024          STR      r1,[r6,r4,LSL #2]     ;346
000280  f7fffffe          BL       OS_CPU_SR_Restore
                  |L1.644|
000284  4628              MOV      r0,r5                 ;349
000286  b007              ADD      sp,sp,#0x1c
000288  e8bd8ff0          POP      {r4-r11,pc}
                  |L1.652|
00028c  f7fffffe          BL       OS_CPU_SR_Restore
000290  2028              MOVS     r0,#0x28              ;352
000292  b007              ADD      sp,sp,#0x1c
000294  e8bd8ff0          POP      {r4-r11,pc}
;;;354    #endif
                          ENDP

                  OSTaskDel PROC
;;;393    INT8U  OSTaskDel (INT8U prio)
;;;394    {
000298  e92d47f0          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
;;;411        }
;;;412        if (prio == OS_TASK_IDLE_PRIO) {                            /* Not allowed to delete idle task     */
;;;413            return (OS_ERR_TASK_DEL_IDLE);
;;;414        }
;;;415    #if OS_ARG_CHK_EN > 0
;;;416        if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */
;;;417            if (prio != OS_PRIO_SELF) {
;;;418                return (OS_ERR_PRIO_INVALID);

⌨️ 快捷键说明

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