📄 os_sem.lst
字号:
\ 0000001E 0BD0 BEQ ??OSSemPost_3
339 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
\ 00000020 0122 MOVS R2,#+1
\ 00000022 0021 MOVS R1,#+0
\ 00000024 2000 MOVS R0,R4
\ 00000026 ........ _BLF OS_EventTaskRdy,??OS_EventTaskRdy??rT
340 OS_EXIT_CRITICAL();
\ 0000002A 2800 MOVS R0,R5
\ 0000002C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
341 OS_Sched(); /* Find highest priority task ready to run */
\ 00000030 ........ _BLF OS_Sched,??OS_Sched??rT
342 return (OS_NO_ERR);
\ ??OSSemPost_4:
\ 00000034 0020 MOVS R0,#+0
\ 00000036 0DE0 B ??OSSemPost_1
343 }
344 if (pevent->OSEventCnt < 65535u) { /* Make sure semaphore will not overflow */
\ ??OSSemPost_3:
\ 00000038 6088 LDRH R0,[R4, #+2]
\ 0000003A 0849 LDR R1,??OSSemPost_5 ;; 0xffff
\ 0000003C 8842 CMP R0,R1
\ 0000003E 05D0 BEQ ??OSSemPost_6
345 pevent->OSEventCnt++; /* Increment semaphore count to register event */
\ 00000040 401C ADDS R0,R0,#+1
\ 00000042 6080 STRH R0,[R4, #+2]
346 OS_EXIT_CRITICAL();
\ 00000044 2800 MOVS R0,R5
\ 00000046 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
347 return (OS_NO_ERR);
\ 0000004A F3E7 B.N ??OSSemPost_4
348 }
349 OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
\ ??OSSemPost_6:
\ 0000004C 2800 MOVS R0,R5
\ 0000004E ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
350 return (OS_SEM_OVF);
\ 00000052 3220 MOVS R0,#+50
\ ??OSSemPost_1:
\ 00000054 30BC POP {R4,R5}
\ 00000056 02BC POP {R1}
\ 00000058 0847 BX R1 ;; return
\ 0000005A C046 Nop
\ ??OSSemPost_5:
\ 0000005C FFFF0000 DC32 0xffff
351 }
352 /*$PAGE*/
353 /*
354 *********************************************************************************************************
355 * QUERY A SEMAPHORE
356 *
357 * Description: This function obtains information about a semaphore
358 *
359 * Arguments : pevent is a pointer to the event control block associated with the desired
360 * semaphore
361 *
362 * p_sem_data is a pointer to a structure that will contain information about the
363 * semaphore.
364 *
365 * Returns : OS_NO_ERR The call was successful and the message was sent
366 * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semaphore.
367 * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
368 *********************************************************************************************************
369 */
370
371 #if OS_SEM_QUERY_EN > 0
\ In segment CODE, align 4, keep-with-next
372 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
373 {
\ OSSemQuery:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
374 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
375 OS_CPU_SR cpu_sr;
376 #endif
377 INT8U *psrc;
378 INT8U *pdest;
379
380
381 #if OS_ARG_CHK_EN > 0
382 if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
\ 00000006 002C CMP R4,#+0
\ 00000008 01D1 BNE ??OSSemQuery_0
383 return (OS_ERR_PEVENT_NULL);
\ 0000000A 0420 MOVS R0,#+4
\ 0000000C 21E0 B ??OSSemQuery_1
384 }
385 #endif
386 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
\ ??OSSemQuery_0:
\ 0000000E 2078 LDRB R0,[R4, #+0]
\ 00000010 0328 CMP R0,#+3
\ 00000012 01D0 BEQ ??OSSemQuery_2
387 return (OS_ERR_EVENT_TYPE);
\ 00000014 0120 MOVS R0,#+1
\ 00000016 1CE0 B ??OSSemQuery_1
388 }
389 OS_ENTER_CRITICAL();
\ ??OSSemQuery_2:
\ 00000018 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
390 p_sem_data->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
\ 0000001C 6178 LDRB R1,[R4, #+1]
\ 0000001E A972 STRB R1,[R5, #+10]
391 psrc = &pevent->OSEventTbl[0];
\ 00000020 2100 MOVS R1,R4
392 pdest = &p_sem_data->OSEventTbl[0];
\ 00000022 AA1C ADDS R2,R5,#+2
393 #if OS_EVENT_TBL_SIZE > 0
394 *pdest++ = *psrc++;
\ 00000024 0B7A LDRB R3,[R1, #+8]
\ 00000026 1370 STRB R3,[R2, #+0]
395 #endif
396
397 #if OS_EVENT_TBL_SIZE > 1
398 *pdest++ = *psrc++;
\ 00000028 4B7A LDRB R3,[R1, #+9]
\ 0000002A 5370 STRB R3,[R2, #+1]
399 #endif
400
401 #if OS_EVENT_TBL_SIZE > 2
402 *pdest++ = *psrc++;
\ 0000002C 8B7A LDRB R3,[R1, #+10]
\ 0000002E 9370 STRB R3,[R2, #+2]
403 #endif
404
405 #if OS_EVENT_TBL_SIZE > 3
406 *pdest++ = *psrc++;
\ 00000030 CB7A LDRB R3,[R1, #+11]
\ 00000032 D370 STRB R3,[R2, #+3]
407 #endif
408
409 #if OS_EVENT_TBL_SIZE > 4
410 *pdest++ = *psrc++;
\ 00000034 0B7B LDRB R3,[R1, #+12]
\ 00000036 1371 STRB R3,[R2, #+4]
411 #endif
412
413 #if OS_EVENT_TBL_SIZE > 5
414 *pdest++ = *psrc++;
\ 00000038 4B7B LDRB R3,[R1, #+13]
\ 0000003A 5371 STRB R3,[R2, #+5]
\ 0000003C 0E31 ADDS R1,R1,#+14
\ 0000003E 921D ADDS R2,R2,#+6
415 #endif
416
417 #if OS_EVENT_TBL_SIZE > 6
418 *pdest++ = *psrc++;
\ 00000040 0B78 LDRB R3,[R1, #+0]
\ 00000042 1370 STRB R3,[R2, #+0]
419 #endif
420
421 #if OS_EVENT_TBL_SIZE > 7
422 *pdest = *psrc;
\ 00000044 4978 LDRB R1,[R1, #+1]
\ 00000046 5170 STRB R1,[R2, #+1]
423 #endif
424 p_sem_data->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
\ 00000048 6188 LDRH R1,[R4, #+2]
\ 0000004A 2980 STRH R1,[R5, #+0]
425 OS_EXIT_CRITICAL();
\ 0000004C ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
426 return (OS_NO_ERR);
\ 00000050 0020 MOVS R0,#+0
\ ??OSSemQuery_1:
\ 00000052 30BC POP {R4,R5}
\ 00000054 02BC POP {R1}
\ 00000056 0847 BX R1 ;; return
427 }
\ In segment CODE, align 4, keep-with-next
\ ??DataTable6:
\ 00000000 ........ DC32 OSEventFreeList
\ In segment CODE, align 4, keep-with-next
\ ??DataTable7:
\ 00000000 ........ DC32 OSIntNesting
428 #endif /* OS_SEM_QUERY_EN */
429 #endif /* OS_SEM_EN */
Maximum stack usage in bytes:
Function CSTACK
-------- ------
OSSemAccept 12
OSSemCreate 12
OSSemDel 24
OSSemPend 20
OSSemPost 12
OSSemQuery 12
Segment part sizes:
Function/Label Bytes
-------------- -----
OSSemAccept 42
OSSemCreate 72
OSSemDel 198
OSSemPend 168
OSSemPost 96
OSSemQuery 88
??DataTable6 4
??DataTable7 4
Others 104
776 bytes in segment CODE
672 bytes of CODE memory (+ 104 bytes shared)
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -