📄 os_sem.lst
字号:
\ ??OSSemDel_8:
\ 0000012C 0A00D9E5 LDRB R0,[R9, #+10]
\ 00000130 000050E3 CMP R0,#+0
\ 00000134 0500000A BEQ ??OSSemDel_12
220 (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
\ 00000138 0030A0E3 MOV R3,#+0
\ 0000013C 0120A0E3 MOV R2,#+1
\ 00000140 0010A0E3 MOV R1,#+0
\ 00000144 0900B0E1 MOVS R0,R9
\ 00000148 ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rA
\ 0000014C F6FFFFEA B ??OSSemDel_8
221 }
222 #if OS_EVENT_NAME_SIZE > 1
223 pevent->OSEventName[0] = '?'; /* Unknown name */
\ ??OSSemDel_12:
\ 00000150 3F00A0E3 MOV R0,#+63
\ 00000154 0F00C9E5 STRB R0,[R9, #+15]
224 pevent->OSEventName[1] = OS_ASCII_NUL;
\ 00000158 0000A0E3 MOV R0,#+0
\ 0000015C 1000C9E5 STRB R0,[R9, #+16]
225 #endif
226 pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
\ 00000160 0000A0E3 MOV R0,#+0
\ 00000164 0000C9E5 STRB R0,[R9, #+0]
227 pevent->OSEventPtr = OSEventFreeList; /* Return Event Control Block to free list */
\ 00000168 ........ LDR R0,??DataTable9 ;; OSEventFreeList
\ 0000016C 000090E5 LDR R0,[R0, #+0]
\ 00000170 040089E5 STR R0,[R9, #+4]
228 pevent->OSEventCnt = 0;
\ 00000174 0000A0E3 MOV R0,#+0
\ 00000178 B800C9E1 STRH R0,[R9, #+8]
229 OSEventFreeList = pevent; /* Get next free event control block */
\ 0000017C ........ LDR R0,??DataTable9 ;; OSEventFreeList
\ 00000180 009080E5 STR R9,[R0, #+0]
230 OS_EXIT_CRITICAL();
\ 00000184 0800B0E1 MOVS R0,R8
\ 00000188 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
231 if (tasks_waiting == OS_TRUE) { /* Reschedule only if task(s) were waiting */
\ 0000018C 010056E3 CMP R6,#+1
\ 00000190 0000001A BNE ??OSSemDel_13
232 OS_Sched(); /* Find highest priority task ready to run */
\ 00000194 ........ _BLF OS_Sched,??OS_Sched??rA
233 }
234 *err = OS_ERR_NONE;
\ ??OSSemDel_13:
\ 00000198 0000A0E3 MOV R0,#+0
\ 0000019C 0000C5E5 STRB R0,[R5, #+0]
235 pevent_return = (OS_EVENT *)0; /* Semaphore has been deleted */
\ 000001A0 0000A0E3 MOV R0,#+0
\ 000001A4 0070B0E1 MOVS R7,R0
\ 000001A8 040000EA B ??OSSemDel_11
236 break;
237
238 default:
239 OS_EXIT_CRITICAL();
\ ??OSSemDel_9:
\ 000001AC 0800B0E1 MOVS R0,R8
\ 000001B0 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
240 *err = OS_ERR_INVALID_OPT;
\ 000001B4 0700A0E3 MOV R0,#+7
\ 000001B8 0000C5E5 STRB R0,[R5, #+0]
241 pevent_return = pevent;
\ 000001BC 0970B0E1 MOVS R7,R9
242 break;
243 }
244 return (pevent_return);
\ ??OSSemDel_11:
\ 000001C0 0700B0E1 MOVS R0,R7
\ ??OSSemDel_1:
\ 000001C4 F083BDE8 POP {R4-R9,PC} ;; return
245 }
246 #endif
247
248 /*$PAGE*/
249 /*
250 *********************************************************************************************************
251 * PEND ON SEMAPHORE
252 *
253 * Description: This function waits for a semaphore.
254 *
255 * Arguments : pevent is a pointer to the event control block associated with the desired
256 * semaphore.
257 *
258 * timeout is an optional timeout period (in clock ticks). If non-zero, your task will
259 * wait for the resource up to the amount of time specified by this argument.
260 * If you specify 0, however, your task will wait forever at the specified
261 * semaphore or, until the resource becomes available (or the event occurs).
262 *
263 * err is a pointer to where an error message will be deposited. Possible error
264 * messages are:
265 *
266 * OS_ERR_NONE The call was successful and your task owns the resource
267 * or, the event you are waiting for occurred.
268 * OS_ERR_TIMEOUT The semaphore was not received within the specified
269 * 'timeout'.
270 * OS_ERR_PEND_ABORT The wait on the semaphore was aborted.
271 * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore.
272 * OS_ERR_PEND_ISR If you called this function from an ISR and the result
273 * would lead to a suspension.
274 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
275 * OS_ERR_PEND_LOCKED If you called this function when the scheduler is locked
276 *
277 * Returns : none
278 *********************************************************************************************************
279 */
280
\ In segment CODE, align 4, keep-with-next
281 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
282 {
\ OSSemPend:
\ 00000000 F0412DE9 PUSH {R4-R8,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
\ 0000000C 0260B0E1 MOVS R6,R2
283 INT8U pend_stat;
284 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
285 OS_CPU_SR cpu_sr = 0;
\ 00000010 0000A0E3 MOV R0,#+0
\ 00000014 0080B0E1 MOVS R8,R0
286 #endif
287
288
289
290 #if OS_ARG_CHK_EN > 0
291 if (err == (INT8U *)0) { /* Validate 'err' */
\ 00000018 000056E3 CMP R6,#+0
\ 0000001C 5A00000A BEQ ??OSSemPend_0
292 return;
293 }
294 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000020 000054E3 CMP R4,#+0
\ 00000024 0200001A BNE ??OSSemPend_1
295 *err = OS_ERR_PEVENT_NULL;
\ 00000028 0400A0E3 MOV R0,#+4
\ 0000002C 0000C6E5 STRB R0,[R6, #+0]
296 return;
\ 00000030 550000EA B ??OSSemPend_0
297 }
298 #endif
299 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
\ ??OSSemPend_1:
\ 00000034 0000D4E5 LDRB R0,[R4, #+0]
\ 00000038 030050E3 CMP R0,#+3
\ 0000003C 0200000A BEQ ??OSSemPend_2
300 *err = OS_ERR_EVENT_TYPE;
\ 00000040 0100A0E3 MOV R0,#+1
\ 00000044 0000C6E5 STRB R0,[R6, #+0]
301 return;
\ 00000048 4F0000EA B ??OSSemPend_0
302 }
303 if (OSIntNesting > 0) { /* See if called from ISR ... */
\ ??OSSemPend_2:
\ 0000004C ........ LDR R0,??DataTable10 ;; OSIntNesting
\ 00000050 0000D0E5 LDRB R0,[R0, #+0]
\ 00000054 010050E3 CMP R0,#+1
\ 00000058 0200003A BCC ??OSSemPend_3
304 *err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
\ 0000005C 0200A0E3 MOV R0,#+2
\ 00000060 0000C6E5 STRB R0,[R6, #+0]
305 return;
\ 00000064 480000EA B ??OSSemPend_0
306 }
307 if (OSLockNesting > 0) { /* See if called with scheduler locked ... */
\ ??OSSemPend_3:
\ 00000068 20019FE5 LDR R0,??OSSemPend_4 ;; OSLockNesting
\ 0000006C 0000D0E5 LDRB R0,[R0, #+0]
\ 00000070 010050E3 CMP R0,#+1
\ 00000074 0200003A BCC ??OSSemPend_5
308 *err = OS_ERR_PEND_LOCKED; /* ... can't PEND when locked */
\ 00000078 0D00A0E3 MOV R0,#+13
\ 0000007C 0000C6E5 STRB R0,[R6, #+0]
309 return;
\ 00000080 410000EA B ??OSSemPend_0
310 }
311 OS_ENTER_CRITICAL();
\ ??OSSemPend_5:
\ 00000084 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000088 0080B0E1 MOVS R8,R0
312 if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
\ 0000008C B800D4E1 LDRH R0,[R4, #+8]
\ 00000090 010050E3 CMP R0,#+1
\ 00000094 0900003A BCC ??OSSemPend_6
313 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
\ 00000098 B800D4E1 LDRH R0,[R4, #+8]
\ 0000009C FF10A0E3 MOV R1,#+255
\ 000000A0 FF1C81E3 ORR R1,R1,#0xFF00
\ 000000A4 000091E0 ADDS R0,R1,R0
\ 000000A8 B800C4E1 STRH R0,[R4, #+8]
314 OS_EXIT_CRITICAL();
\ 000000AC 0800B0E1 MOVS R0,R8
\ 000000B0 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
315 *err = OS_ERR_NONE;
\ 000000B4 0000A0E3 MOV R0,#+0
\ 000000B8 0000C6E5 STRB R0,[R6, #+0]
316 return;
\ 000000BC 320000EA B ??OSSemPend_0
317 }
318 /* Otherwise, must wait until event occurs */
319 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
\ ??OSSemPend_6:
\ 000000C0 CC009FE5 LDR R0,??OSSemPend_4+0x4 ;; OSTCBCur
\ 000000C4 000090E5 LDR R0,[R0, #+0]
\ 000000C8 C4109FE5 LDR R1,??OSSemPend_4+0x4 ;; OSTCBCur
\ 000000CC 001091E5 LDR R1,[R1, #+0]
\ 000000D0 2C10D1E5 LDRB R1,[R1, #+44]
\ 000000D4 011091E3 ORRS R1,R1,#0x1
\ 000000D8 2C10C0E5 STRB R1,[R0, #+44]
320 OSTCBCur->OSTCBStatPend = OS_STAT_PEND_OK;
\ 000000DC B0009FE5 LDR R0,??OSSemPend_4+0x4 ;; OSTCBCur
\ 000000E0 000090E5 LDR R0,[R0, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -