?? os_task.txt
字號:
;;;789 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
;;;790 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_SUSPEND; /* Remove suspension */
;;;791 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is now ready */
;;;792 if (ptcb->OSTCBDly == 0) {
;;;793 OSRdyGrp |= ptcb->OSTCBBitY; /* Yes, Make task ready to run */
;;;794 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;795 OS_EXIT_CRITICAL();
;;;796 if (OSRunning == OS_TRUE) {
;;;797 OS_Sched(); /* Find new highest priority task */
;;;798 }
;;;799 } else {
;;;800 OS_EXIT_CRITICAL();
;;;801 }
;;;802 } else { /* Must be pending on event */
;;;803 OS_EXIT_CRITICAL();
;;;804 }
;;;805 return (OS_ERR_NONE);
;;;806 }
;;;807 OS_EXIT_CRITICAL();
;;;808 return (OS_ERR_TASK_NOT_SUSPENDED);
;;;809 }
0005a0 bd10 POP {r4,pc}
|L1.1442|
0005a2 f7fff7ff BL OS_CPU_SR_Save
0005a6 4985 LDR r1,|L1.1980|
0005a8 f851f851 LDR r1,[r1,r4,LSL #2]
0005ac b919 CBNZ r1,|L1.1462|
0005ae f7fff7ff BL OS_CPU_SR_Restore
0005b2 2046 MOVS r0,#0x46
0005b4 bd10 POP {r4,pc}
|L1.1462|
0005b6 2901 CMP r1,#1
0005b8 d103 BNE |L1.1474|
0005ba f7fff7ff BL OS_CPU_SR_Restore
0005be 2043 MOVS r0,#0x43
0005c0 bd10 POP {r4,pc}
|L1.1474|
0005c2 f891f891 LDRB r2,[r1,#0x2c]
0005c6 f012f012 TST r2,#8
0005ca d02a BEQ |L1.1570|
0005cc f022f022 BIC r2,r2,#8
0005d0 f881f881 STRB r2,[r1,#0x2c]
0005d4 f891f891 LDRB r2,[r1,#0x2c]
0005d8 b9fa CBNZ r2,|L1.1562|
0005da 8d4a LDRH r2,[r1,#0x2a]
0005dc b9d2 CBNZ r2,|L1.1556|
0005de 4a78 LDR r2,|L1.1984|
0005e0 f891f891 LDRB r3,[r1,#0x32]
0005e4 f892f892 LDRB r12,[r2,#0] ; OSRdyGrp
0005e8 ea43ea43 ORR r3,r3,r12
0005ec 7013 STRB r3,[r2,#0] ; OSRdyGrp
0005ee f891f891 LDRB r2,[r1,#0x30]
0005f2 4b74 LDR r3,|L1.1988|
0005f4 f891f891 LDRB r1,[r1,#0x31]
0005f8 f813f813 LDRB r12,[r3,r2]
0005fc ea4cea4c ORR r1,r12,r1
000600 5499 STRB r1,[r3,r2]
000602 f7fff7ff BL OS_CPU_SR_Restore
000606 4870 LDR r0,|L1.1992|
000608 7800 LDRB r0,[r0,#0] ; OSRunning
00060a 2801 CMP r0,#1
00060c d107 BNE |L1.1566|
00060e f7fff7ff BL OS_Sched
000612 e004 B |L1.1566|
|L1.1556|
000614 f7fff7ff BL OS_CPU_SR_Restore
000618 e001 B |L1.1566|
|L1.1562|
00061a f7fff7ff BL OS_CPU_SR_Restore
|L1.1566|
00061e 2000 MOVS r0,#0
000620 bd10 POP {r4,pc}
|L1.1570|
000622 f7fff7ff BL OS_CPU_SR_Restore
000626 2044 MOVS r0,#0x44
000628 bd10 POP {r4,pc}
;;;810 #endif
ENDP
OSTaskStkChk PROC
;;;832 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
;;;833 {
00062a e92de92d PUSH {r4-r8,lr}
00062e 4604 MOV r4,r0
000630 460d MOV r5,r1
;;;834 OS_TCB *ptcb;
;;;835 OS_STK *pchk;
;;;836 INT32U free;
;;;837 INT32U size;
;;;838 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;839 OS_CPU_SR cpu_sr = 0;
;;;840 #endif
;;;841
;;;842
;;;843
;;;844 #if OS_ARG_CHK_EN > 0
;;;845 if (prio > OS_LOWEST_PRIO) { /* Make sure task priority is valid */
000632 2c1f CMP r4,#0x1f
000634 d904 BLS |L1.1600|
;;;846 if (prio != OS_PRIO_SELF) {
000636 2cff CMP r4,#0xff
000638 d002 BEQ |L1.1600|
;;;847 return (OS_ERR_PRIO_INVALID);
00063a 202a MOVS r0,#0x2a
00063c e8bde8bd POP {r4-r8,pc}
|L1.1600|
;;;848 }
;;;849 }
;;;850 if (p_stk_data == (OS_STK_DATA *)0) { /* Validate 'p_stk_data' */
000640 b915 CBNZ r5,|L1.1608|
;;;851 return (OS_ERR_PDATA_NULL);
000642 2009 MOVS r0,#9
000644 e8bde8bd POP {r4-r8,pc}
|L1.1608|
;;;852 }
;;;853 #endif
;;;854 p_stk_data->OSFree = 0; /* Assume failure, set to 0 size */
000648 2000 MOVS r0,#0
00064a 6028 STR r0,[r5,#0]
;;;855 p_stk_data->OSUsed = 0;
00064c 6068 STR r0,[r5,#4]
;;;856 OS_ENTER_CRITICAL();
00064e f7fff7ff BL OS_CPU_SR_Save
;;;857 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
000652 2cff CMP r4,#0xff
000654 d103 BNE |L1.1630|
;;;858 prio = OSTCBCur->OSTCBPrio;
000656 4958 LDR r1,|L1.1976|
000658 6809 LDR r1,[r1,#0] ; OSTCBCur
00065a f891f891 LDRB r4,[r1,#0x2e]
|L1.1630|
;;;859 }
;;;860 ptcb = OSTCBPrioTbl[prio];
00065e 4957 LDR r1,|L1.1980|
000660 f851f851 LDR r1,[r1,r4,LSL #2]
;;;861 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
000664 b921 CBNZ r1,|L1.1648|
;;;862 OS_EXIT_CRITICAL();
000666 f7fff7ff BL OS_CPU_SR_Restore
;;;863 return (OS_ERR_TASK_NOT_EXIST);
00066a 2043 MOVS r0,#0x43
00066c e8bde8bd POP {r4-r8,pc}
|L1.1648|
;;;864 }
;;;865 if (ptcb == OS_TCB_RESERVED) {
000670 2901 CMP r1,#1
000672 d104 BNE |L1.1662|
;;;866 OS_EXIT_CRITICAL();
000674 f7fff7ff BL OS_CPU_SR_Restore
;;;867 return (OS_ERR_TASK_NOT_EXIST);
000678 2043 MOVS r0,#0x43
00067a e8bde8bd POP {r4-r8,pc}
|L1.1662|
;;;868 }
;;;869 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
00067e 8a0a LDRH r2,[r1,#0x10]
000680 f012f012 TST r2,#1
000684 d104 BNE |L1.1680|
;;;870 OS_EXIT_CRITICAL();
000686 f7fff7ff BL OS_CPU_SR_Restore
;;;871 return (OS_ERR_TASK_OPT);
00068a 2045 MOVS r0,#0x45
00068c e8bde8bd POP {r4-r8,pc}
|L1.1680|
;;;872 }
;;;873 free = 0;
000690 2400 MOVS r4,#0
;;;874 size = ptcb->OSTCBStkSize;
000692 68ce LDR r6,[r1,#0xc]
;;;875 pchk = ptcb->OSTCBStkBottom;
000694 688f LDR r7,[r1,#8]
;;;876 OS_EXIT_CRITICAL();
000696 f7fff7ff BL OS_CPU_SR_Restore
;;;877 #if OS_STK_GROWTH == 1
;;;878 while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
00069a 6839 LDR r1,[r7,#0]
00069c 1d38 ADDS r0,r7,#4
00069e b921 CBNZ r1,|L1.1706|
|L1.1696|
;;;879 free++;
0006a0 1c64 ADDS r4,r4,#1
0006a2 f850f850 LDR r1,[r0],#4
0006a6 2900 CMP r1,#0
0006a8 d0fa BEQ |L1.1696|
|L1.1706|
;;;880 }
;;;881 #else
;;;882 while (*pchk-- == (OS_STK)0) {
;;;883 free++;
;;;884 }
;;;885 #endif
;;;886 p_stk_data->OSFree = free * sizeof(OS_STK); /* Compute number of free bytes on the stack */
0006aa 00a0 LSLS r0,r4,#2
0006ac 6028 STR r0,[r5,#0]
;;;887 p_stk_data->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
0006ae 1b30 SUBS r0,r6,r4
0006b0 0080 LSLS r0,r0,#2
0006b2 6068 STR r0,[r5,#4]
;;;888 return (OS_ERR_NONE);
0006b4 2000 MOVS r0,#0
;;;889 }
0006b6 e8bde8bd POP {r4-r8,pc}
;;;890 #endif
ENDP
OSTaskSuspend PROC
;;;916 INT8U OSTaskSuspend (INT8U prio)
;;;917 {
0006ba b570 PUSH {r4-r6,lr}
0006bc 4604 MOV r4,r0
;;;918 BOOLEAN self;
;;;919 OS_TCB *ptcb;
;;;920 INT8U y;
;;;921 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;922 OS_CPU_SR cpu_sr = 0;
;;;923 #endif
;;;924
;;;925
;;;926
;;;927 #if OS_ARG_CHK_EN > 0
;;;928 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to suspend idle task */
0006be 2c1f CMP r4,#0x1f
0006c0 d101 BNE |L1.1734|
;;;929 return (OS_ERR_TASK_SUSPEND_IDLE);
0006c2 2047 MOVS r0,#0x47
;;;930 }
;;;931 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;932 if (prio != OS_PRIO_SELF) {
;;;933 return (OS_ERR_PRIO_INVALID);
;;;934 }
;;;935 }
;;;936 #endif
;;;937 OS_ENTER_CRITICAL();
;;;938 if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
;;;939 prio = OSTCBCur->OSTCBPrio;
;;;940 self = OS_TRUE;
;;;941 } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */
;;;942 self = OS_TRUE;
;;;943 } else {
;;;944 self = OS_FALSE; /* No suspending another task */
;;;945 }
;;;946 ptcb = OSTCBPrioTbl[prio];
;;;947 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
;;;948 OS_EXIT_CRITICAL();
;;;949 return (OS_ERR_TASK_SUSPEND_PRIO);
;;;950 }
;;;951 if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
;;;952 OS_EXIT_CRITICAL();
;;;953 return (OS_ERR_TASK_NOT_EXIST);
;;;954 }
;;;955 y = ptcb->OSTCBY;
;;;956 OSRdyTbl[y] &= ~ptcb->OSTCBBitX; /* Make task not ready */
;;;957 if (OSRdyTbl[y] == 0) {
;;;958 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;959 }
;;;960 ptcb->OSTCBStat |= OS_STAT_SUSPEND; /* Status of task is 'SUSPENDED' */
;;;961 OS_EXIT_CRITICAL();
;;;962 if (self == OS_TRUE) { /* Context switch only if SELF */
;;;963 OS_Sched(); /* Find new highest priority task */
;;;964 }
;;;965 return (OS_ERR_NONE);
;;;966 }
0006c4 bd70 POP {r4-r6,pc}
|L1.1734|
0006c6 d303 BCC |L1.1744|
0006c8 2cff CMP r4,#0xff
0006ca d001 BEQ |L1.1744|
0006cc 202a MOVS r0,#0x2a
0006ce bd70 POP {r4-r6,pc}
|L1.1744|
0006d0 f7fff7ff BL OS_CPU_SR_Save
0006d4 4938 LDR r1,|L1.197
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -