📄 os_task.txt
字号:
0005f4 e3a0003d MOV r0,#0x3d
|L1.1528|
0005f8 e8bd41f0 POP {r4-r8,lr}
;;;499 }
;;;500 if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
;;;501 return (OS_PRIO_INVALID);
;;;502 }
;;;503 #endif
;;;504 if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
;;;505 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
;;;506 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
;;;507 OS_EXIT_CRITICAL();
;;;508 return (stat);
;;;509 }
;;;510 OS_ENTER_CRITICAL();
;;;511 ptcb = OSTCBPrioTbl[prio];
;;;512 if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */
;;;513 ptcb->OSTCBDelReq = OS_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */
;;;514 err = OS_NO_ERR;
;;;515 } else {
;;;516 err = OS_TASK_NOT_EXIST; /* Task must be deleted */
;;;517 }
;;;518 OS_EXIT_CRITICAL();
;;;519 return (err);
;;;520 }
0005fc e12fff1e BX lr
|L1.1536|
000600 e354000c CMP r4,#0xc ;500
000604 ba000003 BLT |L1.1560| ;500
000608 e35400ff CMP r4,#0xff ;500
00060c 0a000001 BEQ |L1.1560| ;500
000610 e3a0002a MOV r0,#0x2a ;501
000614 eafffff7 B |L1.1528| ;501
|L1.1560|
000618 e35400ff CMP r4,#0xff ;504
00061c 1a000006 BNE |L1.1596| ;504
000620 ef000002 SVC 0x2 ; formerly SWI ;505
000624 e59f0338 LDR r0,|L1.2404| ;506
000628 e5900000 LDR r0,[r0,#0] ;506 ; OSTCBCur
00062c e5d05032 LDRB r5,[r0,#0x32] ;506
000630 ef000003 SVC 0x3 ; formerly SWI ;507
000634 e1a00005 MOV r0,r5 ;508
000638 eaffffee B |L1.1528| ;508
|L1.1596|
00063c ef000002 SVC 0x2 ; formerly SWI ;510
000640 e59f0314 LDR r0,|L1.2396| ;511
000644 e7906104 LDR r6,[r0,r4,LSL #2] ;511
000648 e3560000 CMP r6,#0 ;512
00064c 0a000003 BEQ |L1.1632| ;512
000650 e3a0003e MOV r0,#0x3e ;513
000654 e5c60032 STRB r0,[r6,#0x32] ;513
000658 e3a07000 MOV r7,#0 ;514
00065c ea000000 B |L1.1636| ;514
|L1.1632|
000660 e3a0700b MOV r7,#0xb ;516
|L1.1636|
000664 ef000003 SVC 0x3 ; formerly SWI ;518
000668 e1a00007 MOV r0,r7 ;519
00066c eaffffe1 B |L1.1528| ;519
ENDP
OSTaskResume PROC
;;;541 INT8U OSTaskResume (INT8U prio)
;;;542 {
000670 e92d4070 PUSH {r4-r6,lr}
000674 e1a05000 MOV r5,r0
;;;543 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;544 OS_CPU_SR cpu_sr;
;;;545 #endif
;;;546 OS_TCB *ptcb;
;;;547
;;;548
;;;549 #if OS_ARG_CHK_EN > 0
;;;550 if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */
000678 e355000c CMP r5,#0xc
00067c ba000002 BLT |L1.1676|
;;;551 return (OS_PRIO_INVALID);
000680 e3a0002a MOV r0,#0x2a
|L1.1668|
000684 e8bd4070 POP {r4-r6,lr}
;;;552 }
;;;553 #endif
;;;554 OS_ENTER_CRITICAL();
;;;555 ptcb = OSTCBPrioTbl[prio];
;;;556 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
;;;557 OS_EXIT_CRITICAL();
;;;558 return (OS_TASK_RESUME_PRIO);
;;;559 }
;;;560 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
;;;561 if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* Remove suspension */
;;;562 (ptcb->OSTCBDly == 0)) { /* Must not be delayed */
;;;563 OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
;;;564 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;565 OS_EXIT_CRITICAL();
;;;566 OS_Sched();
;;;567 } else {
;;;568 OS_EXIT_CRITICAL();
;;;569 }
;;;570 return (OS_NO_ERR);
;;;571 }
;;;572 OS_EXIT_CRITICAL();
;;;573 return (OS_TASK_NOT_SUSPENDED);
;;;574 }
000688 e12fff1e BX lr
|L1.1676|
00068c ef000002 SVC 0x2 ; formerly SWI ;554
000690 e59f02c4 LDR r0,|L1.2396| ;555
000694 e7904105 LDR r4,[r0,r5,LSL #2] ;555
000698 e3540000 CMP r4,#0 ;556
00069c 1a000002 BNE |L1.1708| ;556
0006a0 ef000003 SVC 0x3 ; formerly SWI ;557
0006a4 e3a00064 MOV r0,#0x64 ;558
0006a8 eafffff5 B |L1.1668| ;558
|L1.1708|
0006ac e5d4002c LDRB r0,[r4,#0x2c] ;560
0006b0 e3100008 TST r0,#8 ;560
0006b4 0a00001a BEQ |L1.1828| ;560
0006b8 e5d4002c LDRB r0,[r4,#0x2c] ;561
0006bc e3d00008 BICS r0,r0,#8 ;561
0006c0 e5c4002c STRB r0,[r4,#0x2c] ;561
0006c4 1a000013 BNE |L1.1816| ;561
0006c8 e1d402ba LDRH r0,[r4,#0x2a] ;562
0006cc e3500000 CMP r0,#0 ;562
0006d0 1a000010 BNE |L1.1816| ;562
0006d4 e5d40031 LDRB r0,[r4,#0x31] ;563
0006d8 e59f128c LDR r1,|L1.2412| ;563
0006dc e5d11000 LDRB r1,[r1,#0] ;563 ; OSRdyGrp
0006e0 e1800001 ORR r0,r0,r1 ;563
0006e4 e59f1280 LDR r1,|L1.2412| ;563
0006e8 e5c10000 STRB r0,[r1,#0] ;563 ; OSRdyGrp
0006ec e5d4002f LDRB r0,[r4,#0x2f] ;564
0006f0 e59f1270 LDR r1,|L1.2408| ;564
0006f4 e7d10000 LDRB r0,[r1,r0] ;564
0006f8 e5d41030 LDRB r1,[r4,#0x30] ;564
0006fc e1800001 ORR r0,r0,r1 ;564
000700 e5d4102f LDRB r1,[r4,#0x2f] ;564
000704 e59f225c LDR r2,|L1.2408| ;564
000708 e7c20001 STRB r0,[r2,r1] ;564
00070c ef000003 SVC 0x3 ; formerly SWI ;565
000710 ebfffffe BL OS_Sched ;566
000714 ea000000 B |L1.1820| ;566
|L1.1816|
000718 ef000003 SVC 0x3 ; formerly SWI ;568
|L1.1820|
00071c e3a00000 MOV r0,#0 ;570
000720 eaffffd7 B |L1.1668| ;570
|L1.1828|
000724 ef000003 SVC 0x3 ; formerly SWI ;572
000728 e3a00065 MOV r0,#0x65 ;573
00072c eaffffd4 B |L1.1668| ;573
ENDP
OSTaskStkChk PROC
;;;596 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
;;;597 {
000730 e92d47f0 PUSH {r4-r10,lr}
000734 e1a04000 MOV r4,r0
000738 e1a05001 MOV r5,r1
;;;598 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;599 OS_CPU_SR cpu_sr;
;;;600 #endif
;;;601 OS_TCB *ptcb;
;;;602 OS_STK *pchk;
;;;603 INT32U free;
;;;604 INT32U size;
;;;605
;;;606
;;;607 #if OS_ARG_CHK_EN > 0
;;;608 if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Make sure task priority is valid */
00073c e354000c CMP r4,#0xc
000740 da000004 BLE |L1.1880|
000744 e35400ff CMP r4,#0xff
000748 0a000002 BEQ |L1.1880|
;;;609 return (OS_PRIO_INVALID);
00074c e3a0002a MOV r0,#0x2a
|L1.1872|
000750 e8bd47f0 POP {r4-r10,lr}
;;;610 }
;;;611 #endif
;;;612 pdata->OSFree = 0; /* Assume failure, set to 0 size */
;;;613 pdata->OSUsed = 0;
;;;614 OS_ENTER_CRITICAL();
;;;615 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
;;;616 prio = OSTCBCur->OSTCBPrio;
;;;617 }
;;;618 ptcb = OSTCBPrioTbl[prio];
;;;619 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
;;;620 OS_EXIT_CRITICAL();
;;;621 return (OS_TASK_NOT_EXIST);
;;;622 }
;;;623 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
;;;624 OS_EXIT_CRITICAL();
;;;625 return (OS_TASK_OPT_ERR);
;;;626 }
;;;627 free = 0;
;;;628 size = ptcb->OSTCBStkSize;
;;;629 pchk = ptcb->OSTCBStkBottom;
;;;630 OS_EXIT_CRITICAL();
;;;631 #if OS_STK_GROWTH == 1
;;;632 while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
;;;633 free++;
;;;634 }
;;;635 #else
;;;636 while (*pchk-- == (OS_STK)0) {
;;;637 free++;
;;;638 }
;;;639 #endif
;;;640 pdata->OSFree = free * sizeof(OS_STK); /* Compute number of free bytes on the stack */
;;;641 pdata->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
;;;642 return (OS_NO_ERR);
;;;643 }
000754 e12fff1e BX lr
|L1.1880|
000758 e3a00000 MOV r0,#0 ;612
00075c e5850000 STR r0,[r5,#0] ;612
000760 e5850004 STR r0,[r5,#4] ;613
000764 ef000002 SVC 0x2 ; formerly SWI ;614
000768 e35400ff CMP r4,#0xff ;615
00076c 1a000002 BNE |L1.1916| ;615
000770 e59f01ec LDR r0,|L1.2404| ;616
000774 e5900000 LDR r0,[r0,#0] ;616 ; OSTCBCur
000778 e5d0402d LDRB r4,[r0,#0x2d] ;616
|L1.1916|
00077c e59f01d8 LDR r0,|L1.2396| ;618
000780 e7906104 LDR r6,[r0,r4,LSL #2] ;618
000784 e3560000 CMP r6,#0 ;619
000788 1a000002 BNE |L1.1944| ;619
00078c ef000003 SVC 0x3 ; formerly SWI ;620
000790 e3a0000b MOV r0,#0xb ;621
000794 eaffffed B |L1.1872| ;621
|L1.1944|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -