os_task.lis

来自「将本站的UCOSFORAVR128V276版本升级到了280版」· LIS 代码 · 共 1,140 行 · 第 1/4 页

LIS
1,140
字号
 0230                   .dbline 455
 0230           ;     OSTCBPrioTbl[prio] = (OS_TCB *)0;                           /* Clear old priority entry            */
 0230 82E0              ldi R24,2
 0232 8A9D              mul R24,R10
 0234 F001              movw R30,R0
 0236 80E0              ldi R24,<_OSTCBPrioTbl
 0238 90E0              ldi R25,>_OSTCBPrioTbl
 023A E80F              add R30,R24
 023C F91F              adc R31,R25
 023E 2224              clr R2
 0240 3324              clr R3
 0242 3182              std z+1,R3
 0244 2082              std z+0,R2
 0246                   .dbline 456
 0246           ;     if (ptcb->OSTCBPrev == (OS_TCB *)0) {                       /* Remove from TCB chain               */
 0246 FB01              movw R30,R22
 0248 2480              ldd R2,z+4
 024A 3580              ldd R3,z+5
 024C 2220              tst R2
 024E 91F4              brne L29
 0250 3320              tst R3
 0252 81F4              brne L29
 0254           X5:
 0254                   .dbline 456
 0254                   .dbline 457
 0254           ;         ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
 0254 2224              clr R2
 0256 3324              clr R3
 0258 FB01              movw R30,R22
 025A A281              ldd R26,z+2
 025C B381              ldd R27,z+3
 025E 1496              adiw R26,4
 0260 2D92              st x+,R2
 0262 3C92              st x,R3
 0264                   .dbline 458
 0264           ;         OSTCBList                  = ptcb->OSTCBNext;
 0264 FB01              movw R30,R22
 0266 2280              ldd R2,z+2
 0268 3380              ldd R3,z+3
 026A 30920100          sts _OSTCBList+1,R3
 026E 20920000          sts _OSTCBList,R2
 0272                   .dbline 459
 0272 12C0              xjmp L30
 0274           L29:
 0274                   .dbline 459
 0274           ;     } else {
 0274                   .dbline 460
 0274           ;         ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
 0274 FB01              movw R30,R22
 0276 2280              ldd R2,z+2
 0278 3380              ldd R3,z+3
 027A FB01              movw R30,R22
 027C A481              ldd R26,z+4
 027E B581              ldd R27,z+5
 0280 1296              adiw R26,2
 0282 2D92              st x+,R2
 0284 3C92              st x,R3
 0286                   .dbline 461
 0286           ;         ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
 0286 FB01              movw R30,R22
 0288 2480              ldd R2,z+4
 028A 3580              ldd R3,z+5
 028C FB01              movw R30,R22
 028E A281              ldd R26,z+2
 0290 B381              ldd R27,z+3
 0292 1496              adiw R26,4
 0294 2D92              st x+,R2
 0296 3C92              st x,R3
 0298                   .dbline 462
 0298           ;     }
 0298           L30:
 0298                   .dbline 463
 0298           ;     ptcb->OSTCBNext   = OSTCBFreeList;                          /* Return TCB to free TCB list         */
 0298 20900000          lds R2,_OSTCBFreeList
 029C 30900100          lds R3,_OSTCBFreeList+1
 02A0 FB01              movw R30,R22
 02A2 3382              std z+3,R3
 02A4 2282              std z+2,R2
 02A6                   .dbline 464
 02A6           ;     OSTCBFreeList     = ptcb;
 02A6 70930100          sts _OSTCBFreeList+1,R23
 02AA 60930000          sts _OSTCBFreeList,R22
 02AE                   .dbline 469
 02AE           ; #if OS_TASK_NAME_SIZE > 1
 02AE           ;     ptcb->OSTCBTaskName[0] = '?';                               /* Unknown name                        */
 02AE           ;     ptcb->OSTCBTaskName[1] = OS_ASCII_NUL;
 02AE           ; #endif
 02AE           ;     OS_EXIT_CRITICAL();
 02AE 042F              mov R16,R20
 02B0 0E940000          xcall _OS_CPU_SR_Restore
 02B4                   .dbline 470
 02B4           ;     OS_Sched();                                                 /* Find new highest priority task      */
 02B4 0E940000          xcall _OS_Sched
 02B8                   .dbline 471
 02B8           ;     return (OS_NO_ERR);
 02B8 0027              clr R16
 02BA                   .dbline -2
 02BA           L10:
 02BA 0E940000          xcall pop_gset5
 02BE                   .dbline 0 ; func end
 02BE 0895              ret
 02C0                   .dbsym r pevent 12 pS[os_event]
 02C0                   .dbsym r y 14 c
 02C0                   .dbsym r cpu_sr 20 c
 02C0                   .dbsym r ptcb 22 pS[os_tcb]
 02C0                   .dbsym r prio 10 c
 02C0                   .dbend
 02C0                   .dbfunc e OSTaskDelReq _OSTaskDelReq fc
 02C0           ;           stat -> R10
 02C0           ;           ptcb -> R22,R23
 02C0           ;         cpu_sr -> R20
 02C0           ;           prio -> R22
                        .even
 02C0           _OSTaskDelReq::
 02C0 0E940000          xcall push_gset3
 02C4 602F              mov R22,R16
 02C6                   .dbline -1
 02C6                   .dbline 523
 02C6           ; }
 02C6           ; #endif
 02C6           ; /*$PAGE*/
 02C6           ; /*
 02C6           ; *********************************************************************************************************
 02C6           ; *                                    REQUEST THAT A TASK DELETE ITSELF
 02C6           ; *
 02C6           ; * Description: This function is used to:
 02C6           ; *                   a) notify a task to delete itself.
 02C6           ; *                   b) to see if a task requested that the current task delete itself.
 02C6           ; *              This function is a little tricky to understand.  Basically, you have a task that needs
 02C6           ; *              to be deleted however, this task has resources that it has allocated (memory buffers,
 02C6           ; *              semaphores, mailboxes, queues etc.).  The task cannot be deleted otherwise these
 02C6           ; *              resources would not be freed.  The requesting task calls OSTaskDelReq() to indicate that
 02C6           ; *              the task needs to be deleted.  Deleting of the task is however, deferred to the task to
 02C6           ; *              be deleted.  For example, suppose that task #10 needs to be deleted.  The requesting task
 02C6           ; *              example, task #5, would call OSTaskDelReq(10).  When task #10 gets to execute, it calls
 02C6           ; *              this function by specifying OS_PRIO_SELF and monitors the returned value.  If the return
 02C6           ; *              value is OS_TASK_DEL_REQ, another task requested a task delete.  Task #10 would look like
 02C6           ; *              this:
 02C6           ; *
 02C6           ; *                   void Task(void *p_arg)
 02C6           ; *                   {
 02C6           ; *                       .
 02C6           ; *                       .
 02C6           ; *                       while (1) {
 02C6           ; *                           OSTimeDly(1);
 02C6           ; *                           if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ) {
 02C6           ; *                               Release any owned resources;
 02C6           ; *                               De-allocate any dynamic memory;
 02C6           ; *                               OSTaskDel(OS_PRIO_SELF);
 02C6           ; *                           }
 02C6           ; *                       }
 02C6           ; *                   }
 02C6           ; *
 02C6           ; * Arguments  : prio    is the priority of the task to request the delete from
 02C6           ; *
 02C6           ; * Returns    : OS_NO_ERR          if the task exist and the request has been registered
 02C6           ; *              OS_TASK_NOT_EXIST  if the task has been deleted.  This allows the caller to know whether
 02C6           ; *                                 the request has been executed.
 02C6           ; *              OS_TASK_DEL_ERR    if the task is assigned to a Mutex.
 02C6           ; *              OS_TASK_DEL_IDLE   if you requested to delete uC/OS-II's idle task
 02C6           ; *              OS_PRIO_INVALID    if the priority you specify is higher that the maximum allowed
 02C6           ; *                                 (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
 02C6           ; *              OS_TASK_DEL_REQ    if a task (possibly another task) requested that the running task be
 02C6           ; *                                 deleted.
 02C6           ; *********************************************************************************************************
 02C6           ; */
 02C6           ; /*$PAGE*/
 02C6           ; #if OS_TASK_DEL_EN > 0
 02C6           ; INT8U  OSTaskDelReq (INT8U prio)
 02C6           ; {
 02C6                   .dbline 527
 02C6           ;     INT8U      stat;
 02C6           ;     OS_TCB    *ptcb;
 02C6           ; #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
 02C6           ;     OS_CPU_SR  cpu_sr = 0;
 02C6 4427              clr R20
 02C8                   .dbline 542
 02C8           ; #endif
 02C8           ; 
 02C8           ; 
 02C8           ; 
 02C8           ; #if OS_ARG_CHK_EN > 0
 02C8           ;     if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
 02C8           ;         return (OS_TASK_DEL_IDLE);
 02C8           ;     }
 02C8           ;     if (prio >= OS_LOWEST_PRIO) {                                                     /* Task priority valid ?               */
 02C8           ;         if (prio != OS_PRIO_SELF) {
 02C8           ;             return (OS_PRIO_INVALID);
 02C8           ;               }
 02C8           ;     }
 02C8           ; #endif
 02C8           ;     if (prio == OS_PRIO_SELF) {                                 /* See if a task is requesting to ...  */
 02C8 6F3F              cpi R22,255
 02CA 61F4              brne L32
 02CC                   .dbline 542
 02CC                   .dbline 543
 02CC           ;         OS_ENTER_CRITICAL();                                    /* ... this task to delete itself      */
 02CC 0E940000          xcall _OS_CPU_SR_Save
 02D0 402F              mov R20,R16
 02D2                   .dbline 544
 02D2           ;         stat = OSTCBCur->OSTCBDelReq;                           /* Return request status to caller     */
 02D2 E0910000          lds R30,_OSTCBCur
 02D6 F0910100          lds R31,_OSTCBCur+1
 02DA A188              ldd R10,z+17
 02DC                   .dbline 545
 02DC           ;         OS_EXIT_CRITICAL();
 02DC 0E940000          xcall _OS_CPU_SR_Restore
 02E0                   .dbline 546
 02E0           ;         return (stat);
 02E0 0A2D              mov R16,R10
 02E2 24C0              xjmp L31
 02E4           L32:
 02E4                   .dbline 548
 02E4           ;     }
 02E4           ;     OS_ENTER_CRITICAL();
 02E4 0E940000          xcall _OS_CPU_SR_Save
 02E8 402F              mov R20,R16
 02EA                   .dbline 549
 02EA           ;     ptcb = OSTCBPrioTbl[prio];
 02EA 82E0              ldi R24,2
 02EC 869F              mul R24,R22
 02EE F001              movw R30,R0
 02F0 80E0              ldi R24,<_OSTCBPrioTbl
 02F2 90E0              ldi R25,>_OSTCBPrioTbl
 02F4 E80F              add R30,R24
 02F6 F91F              adc R31,R25
 02F8 6081              ldd R22,z+0
 02FA 7181              ldd R23,z+1
 02FC                   .dbline 550
 02FC           ;     if (ptcb == (OS_TCB *)0) {                                  /* Task to delete must exist           */
 02FC 6030              cpi R22,0
 02FE 6707              cpc R22,R23
 0300 29F4              brne L34
 0302           X7:
 0302                   .dbline 550
 0302                   .dbline 551
 0302           ;         OS_EXIT_CRITICAL();
 0302 042F              mov R16,R20
 0304 0E940000          xcall _OS_CPU_SR_Restore
 0308                   .dbline 552
 0308           ;         return (OS_TASK_NOT_EXIST);                             /* Task must already be deleted        */
 0308 0BE0              ldi R16,11
 030A 10C0              xjmp L31
 030C           L34:
 030C                   .dbline 554
 030C           ;     }
 030C           ;     if (ptcb == (OS_TCB *)1) {                                  /* Must NOT be assigned to a Mutex     */
 030C 6130              cpi R22,1
 030E E0E0              ldi R30,0
 0310 7E07              cpc R23,R30
 0312 29F4              brne L36
 0314                   .dbline 554
 0314                   .dbline 555
 0314           ;         OS_EXIT_CRITICAL();
 0314 042F              mov R16,R20
 0316 0E940000          xcall _OS_CPU_SR_Restore
 031A                   .dbline 556
 031A           ;         return (OS_TASK_DEL_ERR);
 031A 0CE3              ldi R16,60
 031C 07C0              xjmp L31
 031E           L36:
 031E                   .dbline 558
 031E           ;     }
 031E           ;     ptcb->OSTCBDelReq = OS_TASK_DEL_REQ;                        /* Set flag indicating task to be DEL. */
 031E 8EE3              ldi R24,62
 0320 FB01              movw R30,R22
 0322 818B              std z+17,R24
 0324                   .dbline 559
 0324           ;     OS_EXIT_CRITICAL();
 0324 042F              mov R16,R20
 0326 0E940000          xcall _OS_CPU_SR_Restore
 032A                   .dbline 560
 032A           ;     return (OS_NO_ERR);
 032A 0027              clr R16
 032C                   .dbline -2
 032C           L31:
 032C 0E940000          xcall pop_gset3
 0330                   .dbline 0 ; func end
 0330 0895              ret
 0332                   .dbsym r stat 10 c
 0332                   .dbsym r ptcb 22 pS[os_tcb]
 0332                   .dbsym r cpu_sr 20 c
 0332                   .dbsym r prio 22 c
 0332                   .dbend

⌨️ 快捷键说明

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