📄 os_sem.txt
字号:
;;;206 OS_EXIT_CRITICAL();
;;;207 *err = OS_ERR_INVALID_OPT;
;;;208 return (pevent);
;;;209 }
;;;210 }
000108 e12fff1e BX lr
|L1.268|
00010c e3540000 CMP r4,#0 ;161
000110 1a000003 BNE |L1.292| ;161
000114 e3a00004 MOV r0,#4 ;162
000118 e5c60000 STRB r0,[r6,#0] ;162
00011c e1a00004 MOV r0,r4 ;163
000120 eafffff7 B |L1.260| ;163
|L1.292|
000124 e5d40000 LDRB r0,[r4,#0] ;165
000128 e3500003 CMP r0,#3 ;165
00012c 0a000003 BEQ |L1.320| ;165
000130 e3a00001 MOV r0,#1 ;166
000134 e5c60000 STRB r0,[r6,#0] ;166
000138 e1a00004 MOV r0,r4 ;167
00013c eafffff0 B |L1.260| ;167
|L1.320|
000140 ef000002 SVC 0x2 ; formerly SWI ;170
000144 e5d40001 LDRB r0,[r4,#1] ;171
000148 e3500000 CMP r0,#0 ;171
00014c 0a000001 BEQ |L1.344| ;171
000150 e3a07001 MOV r7,#1 ;172
000154 ea000000 B |L1.348| ;172
|L1.344|
000158 e3a07000 MOV r7,#0 ;174
|L1.348|
00015c e3550000 CMP r5,#0 ;176
000160 0a000002 BEQ |L1.368| ;176
000164 e3550001 CMP r5,#1 ;176
000168 1a00002a BNE |L1.536| ;176
00016c ea000012 B |L1.444| ;176
|L1.368|
000170 e1a00000 MOV r0,r0 ;177
000174 e3570000 CMP r7,#0 ;178
000178 1a00000a BNE |L1.424| ;178
00017c e3a00000 MOV r0,#0 ;179
000180 e5c40000 STRB r0,[r4,#0] ;179
000184 e59f02bc LDR r0,|L1.1096| ;180
000188 e5900000 LDR r0,[r0,#0] ;180 ; OSEventFreeList
00018c e5840004 STR r0,[r4,#4] ;180
000190 e59f02b0 LDR r0,|L1.1096| ;181
000194 e5804000 STR r4,[r0,#0] ;181 ; OSEventFreeList
000198 ef000003 SVC 0x3 ; formerly SWI ;182
00019c e3a00000 MOV r0,#0 ;183
0001a0 e5c60000 STRB r0,[r6,#0] ;183
0001a4 eaffffd6 B |L1.260| ;184
|L1.424|
0001a8 ef000003 SVC 0x3 ; formerly SWI ;186
0001ac e3a00008 MOV r0,#8 ;187
0001b0 e5c60000 STRB r0,[r6,#0] ;187
0001b4 e1a00004 MOV r0,r4 ;188
0001b8 eaffffd1 B |L1.260| ;188
|L1.444|
0001bc e1a00000 MOV r0,r0 ;191
0001c0 ea000003 B |L1.468| ;192
|L1.452|
0001c4 e3a02001 MOV r2,#1 ;193
0001c8 e3a01000 MOV r1,#0 ;193
0001cc e1a00004 MOV r0,r4 ;193
0001d0 ebfffffe BL OS_EventTaskRdy ;193
|L1.468|
0001d4 e5d40001 LDRB r0,[r4,#1] ;192
0001d8 e3500000 CMP r0,#0 ;192
0001dc 1afffff8 BNE |L1.452| ;192
0001e0 e3a00000 MOV r0,#0 ;195
0001e4 e5c40000 STRB r0,[r4,#0] ;195
0001e8 e59f0258 LDR r0,|L1.1096| ;196
0001ec e5900000 LDR r0,[r0,#0] ;196 ; OSEventFreeList
0001f0 e5840004 STR r0,[r4,#4] ;196
0001f4 e59f024c LDR r0,|L1.1096| ;197
0001f8 e5804000 STR r4,[r0,#0] ;197 ; OSEventFreeList
0001fc ef000003 SVC 0x3 ; formerly SWI ;198
000200 e3570001 CMP r7,#1 ;199
000204 1a000000 BNE |L1.524| ;199
000208 ebfffffe BL OS_Sched ;200
|L1.524|
00020c e3a00000 MOV r0,#0 ;202
000210 e5c60000 STRB r0,[r6,#0] ;202
000214 eaffffba B |L1.260| ;203
|L1.536|
000218 e1a00000 MOV r0,r0 ;205
00021c ef000003 SVC 0x3 ; formerly SWI ;206
000220 e3a00007 MOV r0,#7 ;207
000224 e5c60000 STRB r0,[r6,#0] ;207
000228 e1a00004 MOV r0,r4 ;208
00022c eaffffb4 B |L1.260| ;208
ENDP
OSSemPend PROC
;;;244 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
;;;245 {
000230 e92d4070 PUSH {r4-r6,lr}
000234 e1a04000 MOV r4,r0
000238 e1a05001 MOV r5,r1
00023c e1a06002 MOV r6,r2
;;;246 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;247 OS_CPU_SR cpu_sr;
;;;248 #endif
;;;249
;;;250
;;;251 if (OSIntNesting > 0) { /* See if called from ISR ... */
000240 e59f01fc LDR r0,|L1.1092|
000244 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000248 e3500000 CMP r0,#0
00024c da000003 BLE |L1.608|
;;;252 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
000250 e3a00002 MOV r0,#2
000254 e5c60000 STRB r0,[r6,#0]
;;;253 return;
;;;254 }
;;;255 #if OS_ARG_CHK_EN > 0
;;;256 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
;;;257 *err = OS_ERR_PEVENT_NULL;
;;;258 return;
;;;259 }
;;;260 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
;;;261 *err = OS_ERR_EVENT_TYPE;
;;;262 return;
;;;263 }
;;;264 #endif
;;;265 OS_ENTER_CRITICAL();
;;;266 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
;;;267 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
;;;268 OS_EXIT_CRITICAL();
;;;269 *err = OS_NO_ERR;
;;;270 return;
;;;271 }
;;;272 /* Otherwise, must wait until event occurs */
;;;273 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
;;;274 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
;;;275 OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
;;;276 OS_EXIT_CRITICAL();
;;;277 OS_Sched(); /* Find next highest priority task ready */
;;;278 OS_ENTER_CRITICAL();
;;;279 if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
;;;280 OS_EventTO(pevent);
;;;281 OS_EXIT_CRITICAL();
;;;282 *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
;;;283 return;
;;;284 }
;;;285 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
;;;286 OS_EXIT_CRITICAL();
;;;287 *err = OS_NO_ERR;
;;;288 }
|L1.600|
000258 e8bd4070 POP {r4-r6,lr}
00025c e12fff1e BX lr
|L1.608|
000260 e3540000 CMP r4,#0 ;256
000264 1a000002 BNE |L1.628| ;256
000268 e3a00004 MOV r0,#4 ;257
00026c e5c60000 STRB r0,[r6,#0] ;257
000270 eafffff8 B |L1.600| ;258
|L1.628|
000274 e5d40000 LDRB r0,[r4,#0] ;260
000278 e3500003 CMP r0,#3 ;260
00027c 0a000002 BEQ |L1.652| ;260
000280 e3a00001 MOV r0,#1 ;261
000284 e5c60000 STRB r0,[r6,#0] ;261
000288 eafffff2 B |L1.600| ;262
|L1.652|
00028c ef000002 SVC 0x2 ; formerly SWI ;265
000290 e1d400b2 LDRH r0,[r4,#2] ;266
000294 e3500000 CMP r0,#0 ;266
000298 da000006 BLE |L1.696| ;266
00029c e1d400b2 LDRH r0,[r4,#2] ;267
0002a0 e2400001 SUB r0,r0,#1 ;267
0002a4 e1c400b2 STRH r0,[r4,#2] ;267
0002a8 ef000003 SVC 0x3 ; formerly SWI ;268
0002ac e3a00000 MOV r0,#0 ;269
0002b0 e5c60000 STRB r0,[r6,#0] ;269
0002b4 eaffffe7 B |L1.600| ;270
|L1.696|
0002b8 e59f018c LDR r0,|L1.1100| ;273
0002bc e5900000 LDR r0,[r0,#0] ;273 ; OSTCBCur
0002c0 e5d0002c LDRB r0,[r0,#0x2c] ;273
0002c4 e3800001 ORR r0,r0,#1 ;273
0002c8 e59f117c LDR r1,|L1.1100| ;273
0002cc e5911000 LDR r1,[r1,#0] ;273 ; OSTCBCur
0002d0 e5c1002c STRB r0,[r1,#0x2c] ;273
0002d4 e59f0170 LDR r0,|L1.1100| ;274
0002d8 e5900000 LDR r0,[r0,#0] ;274 ; OSTCBCur
0002dc e1c052ba STRH r5,[r0,#0x2a] ;274
0002e0 e1a00004 MOV r0,r4 ;275
0002e4 ebfffffe BL OS_EventTaskWait ;275
0002e8 ef000003 SVC 0x3 ; formerly SWI ;276
0002ec ebfffffe BL OS_Sched ;277
0002f0 ef000002 SVC 0x2 ; formerly SWI ;278
0002f4 e59f0150 LDR r0,|L1.1100| ;279
0002f8 e5900000 LDR r0,[r0,#0] ;279 ; OSTCBCur
0002fc e5d0002c LDRB r0,[r0,#0x2c] ;279
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -