📄 os_task.txt
字号:
|L1.1888|
000760 ebfffffe BL OS_CPU_SR_Restore
|L1.1892|
000764 e3a00000 MOV r0,#0 ;805
000768 eaffffdb B |L1.1756|
|L1.1900|
00076c ebfffffe BL OS_CPU_SR_Restore
000770 e3a00044 MOV r0,#0x44 ;808
000774 eaffffd8 B |L1.1756|
;;;810 #endif
ENDP
OSTaskStkChk PROC
;;;832 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *p_stk_data)
;;;833 {
000778 e92d41f0 PUSH {r4-r8,lr}
00077c e1a04000 MOV r4,r0
;;;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 */
;;;846 if (prio != OS_PRIO_SELF) {
;;;847 return (OS_ERR_PRIO_INVALID);
;;;848 }
;;;849 }
;;;850 if (p_stk_data == (OS_STK_DATA *)0) { /* Validate 'p_stk_data' */
;;;851 return (OS_ERR_PDATA_NULL);
;;;852 }
;;;853 #endif
;;;854 p_stk_data->OSFree = 0; /* Assume failure, set to 0 size */
000780 e3a00000 MOV r0,#0
;;;855 p_stk_data->OSUsed = 0;
000784 e5810000 STR r0,[r1,#0]
000788 e1a06001 MOV r6,r1 ;833
00078c e5810004 STR r0,[r1,#4]
;;;856 OS_ENTER_CRITICAL();
000790 ebfffffe BL OS_CPU_SR_Save
;;;857 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
000794 e35400ff CMP r4,#0xff
;;;858 prio = OSTCBCur->OSTCBPrio;
000798 059f11b8 LDREQ r1,|L1.2392|
00079c 05911000 LDREQ r1,[r1,#0] ; OSTCBCur
0007a0 05d1402e LDRBEQ r4,[r1,#0x2e]
;;;859 }
;;;860 ptcb = OSTCBPrioTbl[prio];
0007a4 e59f11a8 LDR r1,|L1.2388|
0007a8 e7911104 LDR r1,[r1,r4,LSL #2]
;;;861 if (ptcb == (OS_TCB *)0) { /* Make sure task exist */
0007ac e3510000 CMP r1,#0
;;;862 OS_EXIT_CRITICAL();
;;;863 return (OS_ERR_TASK_NOT_EXIST);
;;;864 }
;;;865 if (ptcb == OS_TCB_RESERVED) {
0007b0 13510001 CMPNE r1,#1
0007b4 1a000003 BNE |L1.1992|
;;;866 OS_EXIT_CRITICAL();
0007b8 ebfffffe BL OS_CPU_SR_Restore
;;;867 return (OS_ERR_TASK_NOT_EXIST);
0007bc e3a00043 MOV r0,#0x43
|L1.1984|
0007c0 e8bd41f0 POP {r4-r8,lr}
;;;868 }
;;;869 if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* Make sure stack checking option is set */
;;;870 OS_EXIT_CRITICAL();
;;;871 return (OS_ERR_TASK_OPT);
;;;872 }
;;;873 free = 0;
;;;874 size = ptcb->OSTCBStkSize;
;;;875 pchk = ptcb->OSTCBStkBottom;
;;;876 OS_EXIT_CRITICAL();
;;;877 #if OS_STK_GROWTH == 1
;;;878 while (*pchk++ == (OS_STK)0) { /* Compute the number of zero entries on the stk */
;;;879 free++;
;;;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 */
;;;887 p_stk_data->OSUsed = (size - free) * sizeof(OS_STK); /* Compute number of bytes used on the stack */
;;;888 return (OS_ERR_NONE);
;;;889 }
0007c4 e12fff1e BX lr
|L1.1992|
0007c8 e1d121b0 LDRH r2,[r1,#0x10] ;869
0007cc e3120001 TST r2,#1 ;869
0007d0 1a000002 BNE |L1.2016|
0007d4 ebfffffe BL OS_CPU_SR_Restore
0007d8 e3a00045 MOV r0,#0x45 ;871
0007dc eafffff7 B |L1.1984|
|L1.2016|
0007e0 e2817008 ADD r7,r1,#8 ;875
0007e4 e89700a0 LDM r7,{r5,r7} ;875
0007e8 e3a04000 MOV r4,#0 ;873
0007ec ebfffffe BL OS_CPU_SR_Restore
|L1.2032|
0007f0 e4950004 LDR r0,[r5],#4 ;878
0007f4 e3500000 CMP r0,#0 ;878
0007f8 02844001 ADDEQ r4,r4,#1 ;879
0007fc 0afffffb BEQ |L1.2032|
000800 e1a00104 LSL r0,r4,#2 ;886
000804 e5860000 STR r0,[r6,#0] ;886
000808 e0470004 SUB r0,r7,r4 ;887
00080c e1a00100 LSL r0,r0,#2 ;887
000810 e5860004 STR r0,[r6,#4] ;887
000814 e3a00000 MOV r0,#0 ;888
000818 eaffffe8 B |L1.1984|
;;;890 #endif
ENDP
OSTaskSuspend PROC
;;;916 INT8U OSTaskSuspend (INT8U prio)
;;;917 {
00081c e92d4070 PUSH {r4-r6,lr}
000820 e1a05000 MOV r5,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 */
;;;929 return (OS_ERR_TASK_SUSPEND_IDLE);
;;;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();
000824 ebfffffe BL OS_CPU_SR_Save
000828 e59f1128 LDR r1,|L1.2392|
;;;938 if (prio == OS_PRIO_SELF) { /* See if suspend SELF */
00082c e35500ff CMP r5,#0xff
;;;939 prio = OSTCBCur->OSTCBPrio;
000830 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000834 05d1502e LDRBEQ r5,[r1,#0x2e]
;;;940 self = OS_TRUE;
000838 0a000003 BEQ |L1.2124|
;;;941 } else if (prio == OSTCBCur->OSTCBPrio) { /* See if suspending self */
00083c e5d1102e LDRB r1,[r1,#0x2e]
000840 e1510005 CMP r1,r5
;;;942 self = OS_TRUE;
;;;943 } else {
;;;944 self = OS_FALSE; /* No suspending another task */
000844 13a04000 MOVNE r4,#0
000848 1a000000 BNE |L1.2128|
|L1.2124|
00084c e3a04001 MOV r4,#1 ;942
|L1.2128|
;;;945 }
;;;946 ptcb = OSTCBPrioTbl[prio];
000850 e59f10fc LDR r1,|L1.2388|
000854 e7911105 LDR r1,[r1,r5,LSL #2]
;;;947 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
000858 e3510000 CMP r1,#0
00085c 1a000003 BNE |L1.2160|
;;;948 OS_EXIT_CRITICAL();
000860 ebfffffe BL OS_CPU_SR_Restore
;;;949 return (OS_ERR_TASK_SUSPEND_PRIO);
000864 e3a00048 MOV r0,#0x48
|L1.2152|
000868 e8bd4070 POP {r4-r6,lr}
;;;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 }
00086c e12fff1e BX lr
|L1.2160|
000870 e3510001 CMP r1,#1 ;951
000874 1a000002 BNE |L1.2180|
000878 ebfffffe BL OS_CPU_SR_Restore
00087c e3a00043 MOV r0,#0x43 ;953
000880 eafffff8 B |L1.2152|
|L1.2180|
000884 e5d12030 LDRB r2,[r1,#0x30] ;955
000888 e59f30cc LDR r3,|L1.2396|
00088c e5d1e031 LDRB lr,[r1,#0x31] ;956
000890 e7d3c002 LDRB r12,[r3,r2] ;956
000894 e1ccc00e BIC r12,r12,lr ;956
000898 e7c3c002 STRB r12,[r3,r2] ;956
00089c e7d32002 LDRB r2,[r3,r2] ;957
0008a0 e3520000 CMP r2,#0 ;957
0008a4 059f20b4 LDREQ r2,|L1.2400|
0008a8 05d13032 LDRBEQ r3,[r1,#0x32] ;958
0008ac 05d2c000 LDRBEQ r12,[r2,#0] ;958 ; OSRdyGrp
0008b0 01cc3003 BICEQ r3,r12,r3 ;958
0008b4 05c23000 STRBEQ r3,[r2,#0] ;958 ; OSRdyGrp
0008b8 e5d1202c LDRB r2,[r1,#0x2c] ;960
0008bc e3822008 ORR r2,r2,#8 ;960
0008c0 e5c1202c STRB r2,[r1,#0x2c] ;960
0008c4 ebfffffe BL OS_CPU_SR_Restore
0008c8 e3540001 CMP r4,#1 ;962
0008cc 0bfffffe BLEQ OS_Sched
0008d0 e3a00000 MOV r0,#0 ;965
0008d4 eaffffe3 B |L1.2152|
;;;967 #endif
ENDP
OSTaskQuery PROC
;;;989 INT8U OSTaskQuery (INT8U prio, OS_TCB *p_task_data)
;;;990 {
0008d8 e92d4070 PUSH {r4-r6,lr}
0008dc e1a05000 MOV r5,r0
0008e0 e1a06001 MOV r6,r1
;;;991 OS_TCB *ptcb;
;;;992 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;993 OS_CPU_SR cpu_sr = 0;
;;;994 #endif
;;;995
;;;996
;;;997
;;;998 #if OS_ARG_CHK_EN > 0
;;;999 if (prio > OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;1000 if (prio != OS_PRIO_SELF) {
;;;1001 return (OS_ERR_PRIO_INVALID);
;;;1002 }
;;;1003 }
;;;1004 if (p_task_data == (OS_TCB *)0) { /* Validate 'p_task_data' */
;;;1005 return (OS_ERR_PDATA_NULL);
;;;1006 }
;;;1007 #endif
;;;1008 OS_ENTER_CRITICAL();
0008e4 ebfffffe BL OS_CPU_SR_Save
;;;1009 if (prio == OS_PRIO_SELF) { /* See if suspend SELF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -