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 + -
显示快捷键?