os_q.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,204 行 · 第 1/5 页
TXT
1,204 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 942] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_q.o --depend=.\rvmdk\os_q.d --device=DARMSTM --apcs=interwork -O1 -Otime -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\arm-cortex-m3\Generic\RealView -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\CPU\ST\STM32\inc -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\Arm-Cortex-M3\RealView -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Ports\ST\STM32 -I..\..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\..\..\..\uCOS-II\Source\os_q.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
OSQAccept PROC
;;;61 void *OSQAccept (OS_EVENT *pevent, INT8U *perr)
;;;62 {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 460c MOV r4,r1
;;;63 void *pmsg;
;;;64 OS_Q *pq;
;;;65 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;66 OS_CPU_SR cpu_sr = 0;
;;;67 #endif
;;;68
;;;69
;;;70
;;;71 #if OS_ARG_CHK_EN > 0
;;;72 if (perr == (INT8U *)0) { /* Validate 'perr' */
000006 b90c CBNZ r4,|L1.12|
;;;73 return ((void *)0);
000008 2000 MOVS r0,#0
;;;74 }
;;;75 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;76 *perr = OS_ERR_PEVENT_NULL;
;;;77 return ((void *)0);
;;;78 }
;;;79 #endif
;;;80 if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type */
;;;81 *perr = OS_ERR_EVENT_TYPE;
;;;82 return ((void *)0);
;;;83 }
;;;84 OS_ENTER_CRITICAL();
;;;85 pq = (OS_Q *)pevent->OSEventPtr; /* Point at queue control block */
;;;86 if (pq->OSQEntries > 0) { /* See if any messages in the queue */
;;;87 pmsg = *pq->OSQOut++; /* Yes, extract oldest message from the queue */
;;;88 pq->OSQEntries--; /* Update the number of entries in the queue */
;;;89 if (pq->OSQOut == pq->OSQEnd) { /* Wrap OUT pointer if we are at the end of the queue */
;;;90 pq->OSQOut = pq->OSQStart;
;;;91 }
;;;92 *perr = OS_ERR_NONE;
;;;93 } else {
;;;94 *perr = OS_ERR_Q_EMPTY;
;;;95 pmsg = (void *)0; /* Queue is empty */
;;;96 }
;;;97 OS_EXIT_CRITICAL();
;;;98 return (pmsg); /* Return message received (or NULL) */
;;;99 }
00000a bd70 POP {r4-r6,pc}
|L1.12|
00000c b91d CBNZ r5,|L1.22|
00000e 2004 MOVS r0,#4 ;76
000010 7020 STRB r0,[r4,#0] ;76
000012 2000 MOVS r0,#0 ;77
000014 bd70 POP {r4-r6,pc}
|L1.22|
000016 7828 LDRB r0,[r5,#0] ;80
000018 2802 CMP r0,#2 ;80
00001a d003 BEQ |L1.36|
00001c 2001 MOVS r0,#1 ;81
00001e 7020 STRB r0,[r4,#0] ;81
000020 2000 MOVS r0,#0 ;82
000022 bd70 POP {r4-r6,pc}
|L1.36|
000024 f7fffffe BL OS_CPU_SR_Save
000028 6869 LDR r1,[r5,#4] ;85
00002a 8aca LDRH r2,[r1,#0x16] ;86
00002c b172 CBZ r2,|L1.76|
00002e 690b LDR r3,[r1,#0x10] ;87
000030 1d1a ADDS r2,r3,#4 ;87
000032 610a STR r2,[r1,#0x10] ;87
000034 681d LDR r5,[r3,#0] ;87
000036 8acb LDRH r3,[r1,#0x16] ;88
000038 1e5b SUBS r3,r3,#1 ;88
00003a 82cb STRH r3,[r1,#0x16] ;88
00003c 688b LDR r3,[r1,#8] ;89
00003e 429a CMP r2,r3 ;89
000040 d101 BNE |L1.70|
000042 684a LDR r2,[r1,#4] ;90
000044 610a STR r2,[r1,#0x10] ;90
|L1.70|
000046 2100 MOVS r1,#0 ;92
000048 7021 STRB r1,[r4,#0] ;92
00004a e002 B |L1.82|
|L1.76|
00004c 211f MOVS r1,#0x1f ;94
00004e 7021 STRB r1,[r4,#0] ;94
000050 2500 MOVS r5,#0 ;95
|L1.82|
000052 f7fffffe BL OS_CPU_SR_Restore
000056 4628 MOV r0,r5 ;98
000058 bd70 POP {r4-r6,pc}
;;;100 #endif
ENDP
OSQCreate PROC
;;;121 OS_EVENT *OSQCreate (void **start, INT16U size)
;;;122 {
00005a e92d41f0 PUSH {r4-r8,lr}
00005e 4606 MOV r6,r0
000060 460f MOV r7,r1
;;;123 OS_EVENT *pevent;
;;;124 OS_Q *pq;
;;;125 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;126 OS_CPU_SR cpu_sr = 0;
;;;127 #endif
;;;128
;;;129
;;;130
;;;131 if (OSIntNesting > 0) { /* See if called from ISR ... */
000062 48fc LDR r0,|L1.1108|
000064 7800 LDRB r0,[r0,#0] ; OSIntNesting
000066 b110 CBZ r0,|L1.110|
;;;132 return ((OS_EVENT *)0); /* ... can't CREATE from an ISR */
000068 2000 MOVS r0,#0
;;;133 }
;;;134 OS_ENTER_CRITICAL();
;;;135 pevent = OSEventFreeList; /* Get next free event control block */
;;;136 if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
;;;137 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
;;;138 }
;;;139 OS_EXIT_CRITICAL();
;;;140 if (pevent != (OS_EVENT *)0) { /* See if we have an event control block */
;;;141 OS_ENTER_CRITICAL();
;;;142 pq = OSQFreeList; /* Get a free queue control block */
;;;143 if (pq != (OS_Q *)0) { /* Were we able to get a queue control block ? */
;;;144 OSQFreeList = OSQFreeList->OSQPtr; /* Yes, Adjust free list pointer to next free*/
;;;145 OS_EXIT_CRITICAL();
;;;146 pq->OSQStart = start; /* Initialize the queue */
;;;147 pq->OSQEnd = &start[size];
;;;148 pq->OSQIn = start;
;;;149 pq->OSQOut = start;
;;;150 pq->OSQSize = size;
;;;151 pq->OSQEntries = 0;
;;;152 pevent->OSEventType = OS_EVENT_TYPE_Q;
;;;153 pevent->OSEventCnt = 0;
;;;154 pevent->OSEventPtr = pq;
;;;155 #if OS_EVENT_NAME_SIZE > 1
;;;156 pevent->OSEventName[0] = '?'; /* Unknown name */
;;;157 pevent->OSEventName[1] = OS_ASCII_NUL;
;;;158 #endif
;;;159 OS_EventWaitListInit(pevent); /* Initalize the wait list */
;;;160 } else {
;;;161 pevent->OSEventPtr = (void *)OSEventFreeList; /* No, Return event control block on error */
;;;162 OSEventFreeList = pevent;
;;;163 OS_EXIT_CRITICAL();
;;;164 pevent = (OS_EVENT *)0;
;;;165 }
;;;166 }
;;;167 return (pevent);
;;;168 }
00006a e8bd81f0 POP {r4-r8,pc}
|L1.110|
00006e f7fffffe BL OS_CPU_SR_Save
000072 f8df83e4 LDR r8,|L1.1112|
000076 f8d84000 LDR r4,[r8,#0] ;135 ; OSEventFreeList
00007a b114 CBZ r4,|L1.130|
00007c 6861 LDR r1,[r4,#4] ;137
00007e f8c81000 STR r1,[r8,#0] ;137 ; OSEventFreeList
|L1.130|
000082 f7fffffe BL OS_CPU_SR_Restore
000086 2c00 CMP r4,#0 ;140
000088 d024 BEQ |L1.212|
00008a f7fffffe BL OS_CPU_SR_Save
00008e 49f3 LDR r1,|L1.1116|
000090 680d LDR r5,[r1,#0] ;142 ; OSQFreeList
000092 b1bd CBZ r5,|L1.196|
000094 682a LDR r2,[r5,#0] ;144
000096 600a STR r2,[r1,#0] ;144 ; OSQFreeList
000098 f7fffffe BL OS_CPU_SR_Restore
00009c 606e STR r6,[r5,#4] ;146
00009e eb060087 ADD r0,r6,r7,LSL #2 ;147
0000a2 60a8 STR r0,[r5,#8] ;147
0000a4 60ee STR r6,[r5,#0xc] ;148
0000a6 612e STR r6,[r5,#0x10] ;149
0000a8 82af STRH r7,[r5,#0x14] ;150
0000aa 2000 MOVS r0,#0 ;151
0000ac 82e8 STRH r0,[r5,#0x16] ;151
0000ae 2102 MOVS r1,#2 ;152
0000b0 7021 STRB r1,[r4,#0] ;152
0000b2 8120 STRH r0,[r4,#8] ;153
0000b4 6065 STR r5,[r4,#4] ;154
0000b6 213f MOVS r1,#0x3f ;156
0000b8 73e1 STRB r1,[r4,#0xf] ;156
0000ba 7420 STRB r0,[r4,#0x10] ;157
0000bc 4620 MOV r0,r4 ;159
0000be f7fffffe BL OS_EventWaitListInit
0000c2 e007 B |L1.212|
|L1.196|
0000c4 f8d81000 LDR r1,[r8,#0] ;161 ; OSEventFreeList
0000c8 6061 STR r1,[r4,#4] ;161
0000ca f8c84000 STR r4,[r8,#0] ;162 ; OSEventFreeList
0000ce f7fffffe BL OS_CPU_SR_Restore
0000d2 2400 MOVS r4,#0 ;164
|L1.212|
0000d4 4620 MOV r0,r4 ;167
0000d6 e8bd81f0 POP {r4-r8,pc}
;;;169 /*$PAGE*/
ENDP
OSQDel PROC
;;;212 OS_EVENT *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *perr)
;;;213 {
0000da e92d5ff0 PUSH {r4-r12,lr}
0000de 4604 MOV r4,r0
0000e0 460f MOV r7,r1
0000e2 4615 MOV r5,r2
;;;214 BOOLEAN tasks_waiting;
;;;215 OS_EVENT *pevent_return;
;;;216 OS_Q *pq;
;;;217 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;218 OS_CPU_SR cpu_sr = 0;
;;;219 #endif
;;;220
;;;221
;;;222
;;;223 #if OS_ARG_CHK_EN > 0
;;;224 if (perr == (INT8U *)0) { /* Validate 'perr' */
0000e4 b915 CBNZ r5,|L1.236|
;;;225 return (pevent);
0000e6 4620 MOV r0,r4
;;;226 }
;;;227 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;228 *perr = OS_ERR_PEVENT_NULL;
;;;229 return (pevent);
;;;230 }
;;;231 #endif
;;;232 if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */
;;;233 *perr = OS_ERR_EVENT_TYPE;
;;;234 return (pevent);
;;;235 }
;;;236 if (OSIntNesting > 0) { /* See if called from ISR ... */
;;;237 *perr = OS_ERR_DEL_ISR; /* ... can't DELETE from an ISR */
;;;238 return (pevent);
;;;239 }
;;;240 OS_ENTER_CRITICAL();
;;;241 if (pevent->OSEventGrp != 0) { /* See if any tasks waiting on queue */
;;;242 tasks_waiting = OS_TRUE; /* Yes */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?