📄 os_core.txt
字号:
000840 e1877005 ORR r7,r7,r5
000844 e59f82ec LDR r8,|L1.2872|
000848 e7c87004 STRB r7,[r8,r4]
;;;489 }
;;;490 return (prio);
|L1.2124|
00084c e8bd41f0 POP {r4-r8,lr}
;;;491 }
000850 e12fff1e BX lr
ENDP
OS_EventTaskWait PROC
;;;510 {
;;;511 OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
000854 e59f12ec LDR r1,|L1.2888|
000858 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00085c e581001c STR r0,[r1,#0x1c]
;;;512 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
000860 e59f12e0 LDR r1,|L1.2888|
000864 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000868 e5d1102f LDRB r1,[r1,#0x2f]
00086c e59f22c4 LDR r2,|L1.2872|
000870 e7d21001 LDRB r1,[r2,r1]
000874 e59f22cc LDR r2,|L1.2888|
000878 e5922000 LDR r2,[r2,#0] ; OSTCBCur
00087c e5d22030 LDRB r2,[r2,#0x30]
000880 e1c11002 BIC r1,r1,r2
000884 e21110ff ANDS r1,r1,#0xff
000888 e59f22b8 LDR r2,|L1.2888|
00088c e5922000 LDR r2,[r2,#0] ; OSTCBCur
000890 e5d2202f LDRB r2,[r2,#0x2f]
000894 e59f329c LDR r3,|L1.2872|
000898 e7c31002 STRB r1,[r3,r2]
00089c 1a000007 BNE |L1.2240|
;;;513 OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
0008a0 e59f12a0 LDR r1,|L1.2888|
0008a4 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0008a8 e5d11031 LDRB r1,[r1,#0x31]
0008ac e59f2280 LDR r2,|L1.2868|
0008b0 e5d22000 LDRB r2,[r2,#0] ; OSRdyGrp
0008b4 e1c21001 BIC r1,r2,r1
0008b8 e59f2274 LDR r2,|L1.2868|
0008bc e5c21000 STRB r1,[r2,#0] ; OSRdyGrp
;;;514 }
;;;515 pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
|L1.2240|
0008c0 e59f1280 LDR r1,|L1.2888|
0008c4 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0008c8 e5d1102f LDRB r1,[r1,#0x2f]
0008cc e2802008 ADD r2,r0,#8
0008d0 e7d21001 LDRB r1,[r2,r1]
0008d4 e59f226c LDR r2,|L1.2888|
0008d8 e5922000 LDR r2,[r2,#0] ; OSTCBCur
0008dc e5d22030 LDRB r2,[r2,#0x30]
0008e0 e1811002 ORR r1,r1,r2
0008e4 e59f225c LDR r2,|L1.2888|
0008e8 e5922000 LDR r2,[r2,#0] ; OSTCBCur
0008ec e5d2202f LDRB r2,[r2,#0x2f]
0008f0 e2803008 ADD r3,r0,#8
0008f4 e7c31002 STRB r1,[r3,r2]
;;;516 pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0008f8 e5d01001 LDRB r1,[r0,#1]
0008fc e59f2244 LDR r2,|L1.2888|
000900 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000904 e5d22031 LDRB r2,[r2,#0x31]
000908 e1811002 ORR r1,r1,r2
00090c e5c01001 STRB r1,[r0,#1]
;;;517 }
000910 e12fff1e BX lr
ENDP
OS_EventTO PROC
;;;536 {
;;;537 if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
000914 e59f122c LDR r1,|L1.2888|
000918 e5911000 LDR r1,[r1,#0] ; OSTCBCur
00091c e5d1102f LDRB r1,[r1,#0x2f]
000920 e2802008 ADD r2,r0,#8
000924 e7d21001 LDRB r1,[r2,r1]
000928 e59f2218 LDR r2,|L1.2888|
00092c e5922000 LDR r2,[r2,#0] ; OSTCBCur
000930 e5d22030 LDRB r2,[r2,#0x30]
000934 e1c11002 BIC r1,r1,r2
000938 e21110ff ANDS r1,r1,#0xff
00093c e59f2204 LDR r2,|L1.2888|
000940 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000944 e5d2202f LDRB r2,[r2,#0x2f]
000948 e2803008 ADD r3,r0,#8
00094c e7c31002 STRB r1,[r3,r2]
000950 1a000005 BNE |L1.2412|
;;;538 pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
000954 e5d01001 LDRB r1,[r0,#1]
000958 e59f21e8 LDR r2,|L1.2888|
00095c e5922000 LDR r2,[r2,#0] ; OSTCBCur
000960 e5d22031 LDRB r2,[r2,#0x31]
000964 e1c11002 BIC r1,r1,r2
000968 e5c01001 STRB r1,[r0,#1]
;;;539 }
;;;540 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
|L1.2412|
00096c e3a01000 MOV r1,#0
000970 e59f21d0 LDR r2,|L1.2888|
000974 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000978 e5c2102c STRB r1,[r2,#0x2c]
;;;541 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
00097c e59f21c4 LDR r2,|L1.2888|
000980 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000984 e582101c STR r1,[r2,#0x1c]
;;;542 }
000988 e12fff1e BX lr
ENDP
OS_EventWaitListInit PROC
;;;563
;;;564 pevent->OSEventGrp = 0x00; /* No task waiting on event */
00098c e3a02000 MOV r2,#0
000990 e5c02001 STRB r2,[r0,#1]
;;;565 ptbl = &pevent->OSEventTbl[0];
000994 e2801008 ADD r1,r0,#8
;;;566
;;;567 #if OS_EVENT_TBL_SIZE > 0
;;;568 *ptbl++ = 0x00;
000998 e4c12001 STRB r2,[r1],#1
;;;569 #endif
;;;570
;;;571 #if OS_EVENT_TBL_SIZE > 1
;;;572 *ptbl++ = 0x00;
00099c e4c12001 STRB r2,[r1],#1
;;;573 #endif
;;;574
;;;575 #if OS_EVENT_TBL_SIZE > 2
;;;576 *ptbl++ = 0x00;
;;;577 #endif
;;;578
;;;579 #if OS_EVENT_TBL_SIZE > 3
;;;580 *ptbl++ = 0x00;
;;;581 #endif
;;;582
;;;583 #if OS_EVENT_TBL_SIZE > 4
;;;584 *ptbl++ = 0x00;
;;;585 #endif
;;;586
;;;587 #if OS_EVENT_TBL_SIZE > 5
;;;588 *ptbl++ = 0x00;
;;;589 #endif
;;;590
;;;591 #if OS_EVENT_TBL_SIZE > 6
;;;592 *ptbl++ = 0x00;
;;;593 #endif
;;;594
;;;595 #if OS_EVENT_TBL_SIZE > 7
;;;596 *ptbl = 0x00;
;;;597 #endif
;;;598 }
0009a0 e12fff1e BX lr
ENDP
OS_TCBInit PROC
;;;1035 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
;;;1036 {
0009a4 e92d5ff0 PUSH {r4-r12,lr}
0009a8 e1a04000 MOV r4,r0
0009ac e1a05001 MOV r5,r1
0009b0 e1a06002 MOV r6,r2
0009b4 e1a07003 MOV r7,r3
0009b8 e28da028 ADD r10,sp,#0x28
0009bc e89a0700 LDM r10,{r8-r10}
;;;1037 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;1038 OS_CPU_SR cpu_sr;
;;;1039 #endif
;;;1040 OS_TCB *ptcb;
;;;1041
;;;1042
;;;1043 OS_ENTER_CRITICAL();
0009c0 ef000002 SVC 0x2 ; formerly SWI
;;;1044 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
0009c4 e59f0164 LDR r0,|L1.2864|
0009c8 e590b000 LDR r11,[r0,#0] ; OSTCBFreeList
;;;1045 if (ptcb != (OS_TCB *)0) {
0009cc e35b0000 CMP r11,#0
0009d0 0a000044 BEQ |L1.2792|
;;;1046 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0009d4 e2801000 ADD r1,r0,#0
0009d8 e59b0014 LDR r0,[r11,#0x14]
0009dc e5810000 STR r0,[r1,#0] ; OSTCBFreeList
;;;1047 OS_EXIT_CRITICAL();
0009e0 ef000003 SVC 0x3 ; formerly SWI
;;;1048 ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0009e4 e58b5000 STR r5,[r11,#0]
;;;1049 ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
0009e8 e5cb402d STRB r4,[r11,#0x2d]
;;;1050 ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0009ec e3a00000 MOV r0,#0
0009f0 e5cb002c STRB r0,[r11,#0x2c]
;;;1051 ptcb->OSTCBDly = 0; /* Task is not delayed */
0009f4 e1cb02ba STRH r0,[r11,#0x2a]
;;;1052
;;;1053 #if OS_TASK_CREATE_EXT_EN > 0
;;;1054 ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
0009f8 e58b9004 STR r9,[r11,#4]
;;;1055 ptcb->OSTCBStkSize = stk_size; /* Store stack size */
0009fc e58b800c STR r8,[r11,#0xc]
;;;1056 ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
000a00 e58b6008 STR r6,[r11,#8]
;;;1057 ptcb->OSTCBOpt = opt; /* Store task options */
000a04 e1cba1b0 STRH r10,[r11,#0x10]
;;;1058 ptcb->OSTCBId = id; /* Store task ID */
000a08 e1cb71b2 STRH r7,[r11,#0x12]
;;;1059 #else
;;;1060 pext = pext; /* Prevent compiler warning if not used */
;;;1061 stk_size = stk_size;
;;;1062 pbos = pbos;
;;;1063 opt = opt;
;;;1064 id = id;
;;;1065 #endif
;;;1066
;;;1067 #if OS_TASK_DEL_EN > 0
;;;1068 ptcb->OSTCBDelReq = OS_NO_ERR;
000a0c e5cb0032 STRB r0,[r11,#0x32]
;;;1069 #endif
;;;1070
;;;1071 ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
000a10 e1a001c4 ASR r0,r4,#3
000a14 e5cb002f STRB r0,[r11,#0x2f]
;;;1072 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
000a18 e5db002f LDRB r0,[r11,#0x2f]
000a1c e59f1148 LDR r1,|L1.2924|
000a20 e7d10000 LDRB r0,[r1,r0]
000a24 e5cb0031 STRB r0,[r11,#0x31]
;;;1073 ptcb->OSTCBX = prio & 0x07;
000a28 e2040007 AND r0,r4,#7
000a2c e5cb002e STRB r0,[r11,#0x2e]
;;;1074 ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
000a30 e5db002e LDRB r0,[r11,#0x2e]
000a34 e7d10000 LDRB r0,[r1,r0]
000a38 e5cb0030 STRB r0,[r11,#0x30]
;;;1075
;;;1076 #if OS_EVENT_EN > 0
;;;1077 ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
000a3c e3a00000 MOV r0,#0
000a40 e58b001c STR r0,[r11,#0x1c]
;;;1078 #endif
;;;1079
;;;1080 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)
;;;1081 ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0; /* Task is not pending on an event flag */
000a44 e58b0024 STR r0,[r11,#0x24]
;;;1082 #endif
;;;1083
;;;1084 #if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
;;;1085 ptcb->OSTCBMsg = (void *)0; /* No message received */
000a48 e58b0020 STR r0,[r11,#0x20]
;;;1086 #endif
;;;1087
;;;1088 #if OS_VERSION >= 204
;;;1089 OSTCBInitHook(ptcb);
000a4c e1a0000b MOV r0,r11
000a50 ebfffffe BL OSTCBInitHook
;;;1090 #endif
;;;1091
;;;1092 OSTaskCreateHook(ptcb);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -