📄 os_core.txt
字号:
0005c4 e59f7328 LDR r7,|L1.2292|
0005c8 e797c100 LDR r12,[r7,r0,LSL #2]
;;;595 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
0005cc e3a07000 MOV r7,#0
0005d0 e1cc71ba STRH r7,[r12,#0x1a]
;;;596 ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
0005d4 e58c700c STR r7,[r12,#0xc]
;;;597 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;;;598 ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
0005d8 e58c1010 STR r1,[r12,#0x10]
;;;599 #else
;;;600 msg = msg; /* Prevent compiler warning if not used */
;;;601 #endif
;;;602 ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
0005dc e5dc701c LDRB r7,[r12,#0x1c]
0005e0 e1c77002 BIC r7,r7,r2
0005e4 e5cc701c STRB r7,[r12,#0x1c]
;;;603 if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
0005e8 e5dc701c LDRB r7,[r12,#0x1c]
0005ec e3570000 CMP r7,#0
0005f0 1a000009 BNE |L1.1564|
;;;604 OSRdyGrp |= bity; /* Put task in the ready to run list */
0005f4 e59f72dc LDR r7,|L1.2264|
0005f8 e5d77000 LDRB r7,[r7,#0] ; OSRdyGrp
0005fc e1877006 ORR r7,r7,r6
000600 e59f82d0 LDR r8,|L1.2264|
000604 e5c87000 STRB r7,[r8,#0] ; OSRdyGrp
;;;605 OSRdyTbl[y] |= bitx;
000608 e59f72cc LDR r7,|L1.2268|
00060c e7d77004 LDRB r7,[r7,r4]
000610 e1877005 ORR r7,r7,r5
000614 e59f82c0 LDR r8,|L1.2268|
000618 e7c87004 STRB r7,[r8,r4]
;;;606 }
;;;607 return (prio);
;;;608 }
|L1.1564|
00061c e8bd81f0 POP {r4-r8,pc}
ENDP
OS_EventTaskWait PROC
;;;627 {
;;;628 OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
000620 e59f12c4 LDR r1,|L1.2284|
000624 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000628 e581000c STR r0,[r1,#0xc]
;;;629 if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) { /* Task no longer ready */
00062c e59f12b8 LDR r1,|L1.2284|
000630 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000634 e5d1101f LDRB r1,[r1,#0x1f]
000638 e59f229c LDR r2,|L1.2268|
00063c e7d21001 LDRB r1,[r2,r1]
000640 e59f22a4 LDR r2,|L1.2284|
000644 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000648 e5d22020 LDRB r2,[r2,#0x20]
00064c e1c11002 BIC r1,r1,r2
000650 e21110ff ANDS r1,r1,#0xff
000654 e59f2290 LDR r2,|L1.2284|
000658 e5922000 LDR r2,[r2,#0] ; OSTCBCur
00065c e5d2201f LDRB r2,[r2,#0x1f]
000660 e59f3274 LDR r3,|L1.2268|
000664 e7c31002 STRB r1,[r3,r2]
000668 1a000007 BNE |L1.1676|
;;;630 OSRdyGrp &= ~OSTCBCur->OSTCBBitY; /* Clear event grp bit if this was only task pending */
00066c e59f1278 LDR r1,|L1.2284|
000670 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000674 e5d11021 LDRB r1,[r1,#0x21]
000678 e59f2258 LDR r2,|L1.2264|
00067c e5d22000 LDRB r2,[r2,#0] ; OSRdyGrp
000680 e1c21001 BIC r1,r2,r1
000684 e59f224c LDR r2,|L1.2264|
000688 e5c21000 STRB r1,[r2,#0] ; OSRdyGrp
;;;631 }
;;;632 pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
|L1.1676|
00068c e59f1258 LDR r1,|L1.2284|
000690 e5911000 LDR r1,[r1,#0] ; OSTCBCur
000694 e5d1101f LDRB r1,[r1,#0x1f]
000698 e2802008 ADD r2,r0,#8
00069c e7d21001 LDRB r1,[r2,r1]
0006a0 e59f2244 LDR r2,|L1.2284|
0006a4 e5922000 LDR r2,[r2,#0] ; OSTCBCur
0006a8 e5d22020 LDRB r2,[r2,#0x20]
0006ac e1811002 ORR r1,r1,r2
0006b0 e59f2234 LDR r2,|L1.2284|
0006b4 e5922000 LDR r2,[r2,#0] ; OSTCBCur
0006b8 e5d2201f LDRB r2,[r2,#0x1f]
0006bc e2803008 ADD r3,r0,#8
0006c0 e7c31002 STRB r1,[r3,r2]
;;;633 pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
0006c4 e5d01001 LDRB r1,[r0,#1]
0006c8 e59f221c LDR r2,|L1.2284|
0006cc e5922000 LDR r2,[r2,#0] ; OSTCBCur
0006d0 e5d22021 LDRB r2,[r2,#0x21]
0006d4 e1811002 ORR r1,r1,r2
0006d8 e5c01001 STRB r1,[r0,#1]
;;;634 }
0006dc e12fff1e BX lr
ENDP
OS_EventTO PROC
;;;653 {
;;;654 if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
0006e0 e59f1204 LDR r1,|L1.2284|
0006e4 e5911000 LDR r1,[r1,#0] ; OSTCBCur
0006e8 e5d1101f LDRB r1,[r1,#0x1f]
0006ec e2802008 ADD r2,r0,#8
0006f0 e7d21001 LDRB r1,[r2,r1]
0006f4 e59f21f0 LDR r2,|L1.2284|
0006f8 e5922000 LDR r2,[r2,#0] ; OSTCBCur
0006fc e5d22020 LDRB r2,[r2,#0x20]
000700 e1c11002 BIC r1,r1,r2
000704 e21110ff ANDS r1,r1,#0xff
000708 e59f21dc LDR r2,|L1.2284|
00070c e5922000 LDR r2,[r2,#0] ; OSTCBCur
000710 e5d2201f LDRB r2,[r2,#0x1f]
000714 e2803008 ADD r3,r0,#8
000718 e7c31002 STRB r1,[r3,r2]
00071c 1a000005 BNE |L1.1848|
;;;655 pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
000720 e5d01001 LDRB r1,[r0,#1]
000724 e59f21c0 LDR r2,|L1.2284|
000728 e5922000 LDR r2,[r2,#0] ; OSTCBCur
00072c e5d22021 LDRB r2,[r2,#0x21]
000730 e1c11002 BIC r1,r1,r2
000734 e5c01001 STRB r1,[r0,#1]
;;;656 }
;;;657 OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
|L1.1848|
000738 e3a01000 MOV r1,#0
00073c e59f21a8 LDR r2,|L1.2284|
000740 e5922000 LDR r2,[r2,#0] ; OSTCBCur
000744 e5c2101c STRB r1,[r2,#0x1c]
;;;658 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
000748 e59f219c LDR r2,|L1.2284|
00074c e5922000 LDR r2,[r2,#0] ; OSTCBCur
000750 e582100c STR r1,[r2,#0xc]
;;;659 }
000754 e12fff1e BX lr
ENDP
OS_EventWaitListInit PROC
;;;680
;;;681 pevent->OSEventGrp = 0x00; /* No task waiting on event */
000758 e3a02000 MOV r2,#0
00075c e5c02001 STRB r2,[r0,#1]
;;;682 ptbl = &pevent->OSEventTbl[0];
000760 e2801008 ADD r1,r0,#8
;;;683
;;;684 #if OS_EVENT_TBL_SIZE > 0
;;;685 *ptbl++ = 0x00;
000764 e4c12001 STRB r2,[r1],#1
;;;686 #endif
;;;687
;;;688 #if OS_EVENT_TBL_SIZE > 1
;;;689 *ptbl++ = 0x00;
000768 e4c12001 STRB r2,[r1],#1
;;;690 #endif
;;;691
;;;692 #if OS_EVENT_TBL_SIZE > 2
;;;693 *ptbl++ = 0x00;
;;;694 #endif
;;;695
;;;696 #if OS_EVENT_TBL_SIZE > 3
;;;697 *ptbl++ = 0x00;
;;;698 #endif
;;;699
;;;700 #if OS_EVENT_TBL_SIZE > 4
;;;701 *ptbl++ = 0x00;
;;;702 #endif
;;;703
;;;704 #if OS_EVENT_TBL_SIZE > 5
;;;705 *ptbl++ = 0x00;
;;;706 #endif
;;;707
;;;708 #if OS_EVENT_TBL_SIZE > 6
;;;709 *ptbl++ = 0x00;
;;;710 #endif
;;;711
;;;712 #if OS_EVENT_TBL_SIZE > 7
;;;713 *ptbl = 0x00;
;;;714 #endif
;;;715 }
00076c e12fff1e BX lr
ENDP
OS_TCBInit PROC
;;;898 INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
;;;899 {
000770 e92d5ff0 PUSH {r4-r12,lr}
000774 e1a04000 MOV r4,r0
000778 e1a05001 MOV r5,r1
00077c e1a06002 MOV r6,r2
000780 e1a07003 MOV r7,r3
000784 e28da028 ADD r10,sp,#0x28
000788 e89a0700 LDM r10,{r8-r10}
;;;900 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;901 OS_CPU_SR cpu_sr;
;;;902 #endif
;;;903 OS_TCB *ptcb;
;;;904
;;;905
;;;906 OS_ENTER_CRITICAL();
00078c ef000002 SVC 0x2 ; formerly SWI
;;;907 ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
000790 e59f0164 LDR r0,|L1.2300|
000794 e590b000 LDR r11,[r0,#0] ; OSTCBFreeList
;;;908 if (ptcb != (OS_TCB *)0) {
000798 e35b0000 CMP r11,#0
00079c 0a000043 BEQ |L1.2224|
;;;909 OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
0007a0 e2801000 ADD r1,r0,#0
0007a4 e59b0004 LDR r0,[r11,#4]
0007a8 e5810000 STR r0,[r1,#0] ; OSTCBFreeList
;;;910 OS_EXIT_CRITICAL();
0007ac ef000003 SVC 0x3 ; formerly SWI
;;;911 ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
0007b0 e58b5000 STR r5,[r11,#0]
;;;912 ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
0007b4 e5cb401d STRB r4,[r11,#0x1d]
;;;913 ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
0007b8 e3a00000 MOV r0,#0
0007bc e5cb001c STRB r0,[r11,#0x1c]
;;;914 ptcb->OSTCBDly = 0; /* Task is not delayed */
0007c0 e1cb01ba STRH r0,[r11,#0x1a]
;;;915
;;;916 #if OS_TASK_CREATE_EXT_EN > 0
;;;917 ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
;;;918 ptcb->OSTCBStkSize = stk_size; /* Store stack size */
;;;919 ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
;;;920 ptcb->OSTCBOpt = opt; /* Store task options */
;;;921 ptcb->OSTCBId = id; /* Store task ID */
;;;922 #else
;;;923 pext = pext; /* Prevent compiler warning if not used */
0007c4 e1a00000 MOV r0,r0
;;;924 stk_size = stk_size;
0007c8 e1a00000 MOV r0,r0
;;;925 pbos = pbos;
0007cc e1a00000 MOV r0,r0
;;;926 opt = opt;
0007d0 e1a00000 MOV r0,r0
;;;927 id = id;
0007d4 e1a00000 MOV r0,r0
;;;928 #endif
;;;929
;;;930 #if OS_TASK_DEL_EN > 0
;;;931 ptcb->OSTCBDelReq = OS_NO_ERR;
0007d8 e5cb0022 STRB r0,[r11,#0x22]
;;;932 #endif
;;;933
;;;934 ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
0007dc e1a001c4 ASR r0,r4,#3
0007e0 e5cb001f STRB r0,[r11,#0x1f]
;;;935 ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
0007e4 e5db001f LDRB r0,[r11,#0x1f]
0007e8 e59f1124 LDR r1,|L1.2324|
0007ec e7d10000 LDRB r0,[r1,r0]
0007f0 e5cb0021 STRB r0,[r11,#0x21]
;;;936 ptcb->OSTCBX = prio & 0x07;
0007f4 e2040007 AND r0,r4,#7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -