📄 os_task.txt
字号:
0004d4 e78d B |L1.1010|
|L1.1238|
0004d6 4639 MOV r1,r7 ;764
0004d8 f105f105 ADD r0,r5,#0x4c ;764
0004dc f7fff7ff BL OS_StrCopy
0004e0 4630 MOV r0,r6 ;765
0004e2 f7fff7ff BL OS_CPU_SR_Restore
0004e6 2000 MOVS r0,#0 ;766
0004e8 7020 STRB r0,[r4,#0] ;766
0004ea e782 B |L1.1010|
;;;768 #endif
ENDP
OSTaskResume PROC
;;;790 INT8U OSTaskResume (INT8U prio)
;;;791 {
0004ec b510 PUSH {r4,lr}
0004ee 4604 MOV r4,r0
;;;792 OS_TCB *ptcb;
;;;793 #if OS_CRITICAL_METHOD == 3 /* Storage for CPU status register */
;;;794 OS_CPU_SR cpu_sr = 0;
;;;795 #endif
;;;796
;;;797
;;;798
;;;799 #if OS_ARG_CHK_EN > 0
;;;800 if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */
;;;801 return (OS_ERR_PRIO_INVALID);
;;;802 }
;;;803 #endif
;;;804 OS_ENTER_CRITICAL();
0004f0 f7fff7ff BL OS_CPU_SR_Save
;;;805 ptcb = OSTCBPrioTbl[prio];
0004f4 496a LDR r1,|L1.1696|
0004f6 f851f851 LDR r1,[r1,r4,LSL #2]
;;;806 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
0004fa b919 CBNZ r1,|L1.1284|
;;;807 OS_EXIT_CRITICAL();
0004fc f7fff7ff BL OS_CPU_SR_Restore
;;;808 return (OS_ERR_TASK_RESUME_PRIO);
000500 2046 MOVS r0,#0x46
;;;809 }
;;;810 if (ptcb == OS_TCB_RESERVED) { /* See if assigned to Mutex */
;;;811 OS_EXIT_CRITICAL();
;;;812 return (OS_ERR_TASK_NOT_EXIST);
;;;813 }
;;;814 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
;;;815 ptcb->OSTCBStat &= ~(INT8U)OS_STAT_SUSPEND; /* Remove suspension */
;;;816 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is now ready */
;;;817 if (ptcb->OSTCBDly == 0) {
;;;818 OSRdyGrp |= ptcb->OSTCBBitY; /* Yes, Make task ready to run */
;;;819 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;820 OS_EXIT_CRITICAL();
;;;821 if (OSRunning == OS_TRUE) {
;;;822 OS_Sched(); /* Find new highest priority task */
;;;823 }
;;;824 } else {
;;;825 OS_EXIT_CRITICAL();
;;;826 }
;;;827 } else { /* Must be pending on event */
;;;828 OS_EXIT_CRITICAL();
;;;829 }
;;;830 return (OS_ERR_NONE);
;;;831 }
;;;832 OS_EXIT_CRITICAL();
;;;833 return (OS_ERR_TASK_NOT_SUSPENDED);
;;;834 }
000502 bd10 POP {r4,pc}
|L1.1284|
000504 2901 CMP r1,#1 ;810
000506 d103 BNE |L1.1296|
000508 f7fff7ff BL OS_CPU_SR_Restore
00050c 2043 MOVS r0,#0x43 ;812
00050e bd10 POP {r4,pc}
|L1.1296|
000510 f891f891 LDRB r2,[r1,#0x30] ;814
000514 0713 LSLS r3,r2,#28 ;814
000516 d524 BPL |L1.1378|
000518 f022f022 BIC r2,r2,#8 ;815
00051c f881f881 STRB r2,[r1,#0x30] ;815
000520 f891f891 LDRB r2,[r1,#0x30] ;816
000524 b9ca CBNZ r2,|L1.1370|
000526 8dca LDRH r2,[r1,#0x2e] ;817
000528 b9a2 CBNZ r2,|L1.1364|
00052a 4b5f LDR r3,|L1.1704|
00052c 3134 ADDS r1,r1,#0x34 ;818
00052e 788a LDRB r2,[r1,#2] ;818
000530 781c LDRB r4,[r3,#0] ;818 ; OSRdyGrp
000532 4322 ORRS r2,r2,r4 ;818
000534 701a STRB r2,[r3,#0] ;818 ; OSRdyGrp
000536 780a LDRB r2,[r1,#0] ;819
000538 4b5c LDR r3,|L1.1708|
00053a 7849 LDRB r1,[r1,#1] ;819
00053c 5c9c LDRB r4,[r3,r2] ;819
00053e 430c ORRS r4,r4,r1 ;819
000540 549c STRB r4,[r3,r2] ;819
000542 f7fff7ff BL OS_CPU_SR_Restore
000546 485a LDR r0,|L1.1712|
000548 7800 LDRB r0,[r0,#0] ;821 ; OSRunning
00054a 2801 CMP r0,#1 ;821
00054c d107 BNE |L1.1374|
00054e f7fff7ff BL OS_Sched
000552 e004 B |L1.1374|
|L1.1364|
000554 f7fff7ff BL OS_CPU_SR_Restore
000558 e001 B |L1.1374|
|L1.1370|
00055a f7fff7ff BL OS_CPU_SR_Restore
|L1.1374|
00055e 2000 MOVS r0,#0 ;830
000560 bd10 POP {r4,pc}
|L1.1378|
000562 f7fff7ff BL OS_CPU_SR_Restore
000566 2044 MOVS r0,#0x44 ;833
000568 bd10 POP {r4,pc}
;;;835 #endif
ENDP
OSTaskStkChk PROC
;;;857 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
;;;858 {
00056a e92de92d PUSH {r4-r8,lr}
00056e 4604 MOV r4,r0
000570 460e MOV r6,r1
;;;859 OS_TCB *ptcb;
;;;860 OS_STK *pchk;
;;;861 INT32U nfree;
;;;862 INT32U size;
;;;863 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;864 OS_CPU_SR cpu_sr = 0;
;;;865 #endif
;;;866
;;;867
;;;868
;;;869 #if OS_ARG_CHK_EN > 0
;;;870 if (prio > OS_LOWEST_PRIO) { /* Make sure task priority is valid */
;;;871 if (prio != OS_PRIO_SELF) {
;;;872 return (OS_ERR_PRIO_INVALID);
;;;873 }
;;;874 }
;;;875 if (p_stk_data == (OS_STK_DATA *)0) { /* Validate 'p_stk_data' */
;;;876 return (OS_ERR_PDATA_NULL);
;;;877 }
;;;878 #endif
;;;879 p_stk_data->OSFree = 0; /* Assume failure, set to 0 size */
000572 2000 MOVS r0,#0
000574 6030 STR r0,[r6,#0]
;;;880 p_stk_data->OSUsed = 0;
000576 6070 STR r0,[r6,#4]
;;;881 OS_ENTER_CRITICAL();
000578 f7fff7ff BL OS_CPU_SR_Save
;;;882 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
00057c 2cff CMP r4,#0xff
00057e d103 BNE |L1.1416|
;;;883 prio = OSTCBCur->OSTCBPrio;
000580 4946 LDR r1,|L1.1692|
000582 6809 LDR r1,[r1,#0] ; OSTCBCur
000584 f891f891 LDRB r4,[r1,#0x32]
|L1.1416|
;;;884 }
;;;885 ptcb = OSTCBPrioTbl[prio];
000588 4945 LDR r1,|L1.1696|
00058a f851f851 LDR r1,[r1,r4,LSL #2]
;;;886 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
00058e b919 CBNZ r1,|L1.1432|
;;;887 OS_EXIT_CRITICAL();
000590 f7fff7ff BL OS_CPU_SR_Restore
;;;888 return (OS_ERR_TASK_NOT_EXIST);
000594 2043 MOVS r0,#0x43
;;;889 }
;;;890 if (ptcb == OS_TCB_RESERVED) {
;;;891 OS_EXIT_CRITICAL();
;;;892 return (OS_ERR_TASK_NOT_EXIST);
;;;893 }
;;;894 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
;;;895 OS_EXIT_CRITICAL();
;;;896 return (OS_ERR_TASK_OPT);
;;;897 }
;;;898 nfree = 0;
;;;899 size = ptcb->OSTCBStkSize;
;;;900 pchk = ptcb->OSTCBStkBottom;
;;;901 OS_EXIT_CRITICAL();
;;;902 #if OS_STK_GROWTH == 1
;;;903 while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
;;;904 nfree++;
;;;905 }
;;;906 #else
;;;907 while (*pchk-- == (OS_STK)0) {
;;;908 nfree++;
;;;909 }
;;;910 #endif
;;;911 p_stk_data->OSFree = nfree * sizeof(OS_STK); /* Compute number of free bytes on the stack */
;;;912 p_stk_data->OSUsed = (size - nfree) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
;;;913 return (OS_ERR_NONE);
;;;914 }
000596 e72c B |L1.1010|
|L1.1432|
000598 2901 CMP r1,#1 ;890
00059a d103 BNE |L1.1444|
00059c f7fff7ff BL OS_CPU_SR_Restore
0005a0 2043 MOVS r0,#0x43 ;892
0005a2 e726 B |L1.1010|
|L1.1444|
0005a4 8a0a LDRH r2,[r1,#0x10] ;894
0005a6 07d2 LSLS r2,r2,#31 ;894
0005a8 d103 BNE |L1.1458|
0005aa f7fff7ff BL OS_CPU_SR_Restore
0005ae 2045 MOVS r0,#0x45 ;896
0005b0 e71f B |L1.1010|
|L1.1458|
0005b2 2400 MOVS r4,#0 ;898
0005b4 68cf LDR r7,[r1,#0xc] ;899
0005b6 688d LDR r5,[r1,#8] ;900
0005b8 f7fff7ff BL OS_CPU_SR_Restore
0005bc e000 B |L1.1472|
|L1.1470|
0005be 1c64 ADDS r4,r4,#1 ;904
|L1.1472|
0005c0 cd01 LDM r5!,{r0} ;903
0005c2 2800 CMP r0,#0 ;903
0005c4 d0fb BEQ |L1.1470|
0005c6 00a0 LSLS r0,r4,#2 ;911
0005c8 6030 STR r0,[r6,#0] ;911
0005ca 1b38 SUBS r0,r7,r4 ;912
0005cc 0080 LSLS r0,r0,#2 ;912
0005ce 6070 STR r0,[r6,#4] ;912
0005d0 2000 MOVS r0,#0 ;913
0005d2 e70e B |L1.1010|
;;;915 #endif
ENDP
OSTaskSuspend PROC
;;;941 INT8U OSTaskSuspend (INT8U prio)
;;;942 {
0005d4 b570 PUSH {r4-r6,lr}
0005d6 4605 MOV r5,r0
;;;943 BOOLEAN self;
;;;944 OS_TCB *ptcb;
;;;945 INT8U y;
;;;946 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;947 OS_CPU_SR cpu_sr = 0;
;;;948 #endif
;;;949
;;;950
;;;951
;;;952 #if OS_ARG_CHK_EN > 0
;;;953 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to suspend idle task */
;;;954 return (OS_ERR_TASK_SUSPEND_IDLE);
;;;955 }
;;;956 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;957 if (prio != OS_PRIO_SELF) {
;;;958 return (OS_ERR_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -