📄 os_sem.lis
字号:
021E ; * OS_SEM_OVF If the semaphore count exceeded its limit. In other words, you have
021E ; * signalled the semaphore more often than you waited on it with either
021E ; * OSSemAccept() or OSSemPend().
021E ; * OS_ERR_EVENT_TYPE If you didn't pass a pointer to a semaphore
021E ; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
021E ; *********************************************************************************************************
021E ; */
021E ;
021E ; INT8U OSSemPost (OS_EVENT *pevent)
021E ; {
021E .dbline 322
021E ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
021E ; OS_CPU_SR cpu_sr;
021E ; #endif
021E ;
021E ;
021E ; #if OS_ARG_CHK_EN > 0
021E ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
021E ; return (OS_ERR_PEVENT_NULL);
021E ; }
021E ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
021E ; return (OS_ERR_EVENT_TYPE);
021E ; }
021E ; #endif
021E ; OS_ENTER_CRITICAL();
021E 00D0 rcall _OS_CPU_SR_Save
0220 402F mov R20,R16
0222 .dbline 323
0222 ; if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore */
0222 FB01 movw R30,R22
0224 2180 ldd R2,z+1
0226 2220 tst R2
0228 59F0 breq L38
022A .dbline 323
022A .dbline 324
022A ; OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
022A 81E0 ldi R24,1
022C 8883 std y+0,R24
022E 2227 clr R18
0230 3327 clr R19
0232 8B01 movw R16,R22
0234 00D0 rcall _OS_EventTaskRdy
0236 .dbline 325
0236 ; OS_EXIT_CRITICAL();
0236 042F mov R16,R20
0238 00D0 rcall _OS_CPU_SR_Restore
023A .dbline 326
023A ; OS_Sched(); /* Find highest priority task ready to run */
023A 00D0 rcall _OS_Sched
023C .dbline 327
023C ; return (OS_NO_ERR);
023C 0027 clr R16
023E 16C0 rjmp L37
0240 L38:
0240 .dbline 329
0240 ; }
0240 ; if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
0240 FB01 movw R30,R22
0242 8281 ldd R24,z+2
0244 9381 ldd R25,z+3
0246 8F3F cpi R24,255
0248 EFEF ldi R30,255
024A 9E07 cpc R25,R30
024C 60F4 brsh L40
024E .dbline 329
024E .dbline 330
024E ; pevent->OSEventCnt++; /* Increment semaphore count to register event */
024E CB01 movw R24,R22
0250 0296 adiw R24,2
0252 FC01 movw R30,R24
0254 8081 ldd R24,z+0
0256 9181 ldd R25,z+1
0258 0196 adiw R24,1
025A 9183 std z+1,R25
025C 8083 std z+0,R24
025E .dbline 331
025E ; OS_EXIT_CRITICAL();
025E 042F mov R16,R20
0260 00D0 rcall _OS_CPU_SR_Restore
0262 .dbline 332
0262 ; return (OS_NO_ERR);
0262 0027 clr R16
0264 03C0 rjmp L37
0266 L40:
0266 .dbline 334
0266 ; }
0266 ; OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
0266 042F mov R16,R20
0268 00D0 rcall _OS_CPU_SR_Restore
026A .dbline 335
026A ; return (OS_SEM_OVF);
026A 02E3 ldi R16,50
026C .dbline -2
026C L37:
026C 2196 adiw R28,1
026E 00D0 rcall pop_gset2
0270 .dbline 0 ; func end
0270 0895 ret
0272 .dbsym r cpu_sr 20 c
0272 .dbsym r pevent 22 pS[.1]
0272 .dbend
0272 .dbfunc e OSSemQuery _OSSemQuery fc
0272 .dbstruct 0 6 .2
0272 .dbfield 0 OSCnt i
0272 .dbfield 2 OSEventTbl A[3:3]c
0272 .dbfield 5 OSEventGrp c
0272 .dbend
0272 ; cpu_sr -> R20
0272 ; pdest -> R12,R13
0272 ; psrc -> R14,R15
0272 ; pdata -> R22,R23
0272 ; pevent -> R10,R11
.even
0272 _OSSemQuery::
0272 00D0 rcall push_gset5
0274 B901 movw R22,R18
0276 5801 movw R10,R16
0278 .dbline -1
0278 .dbline 357
0278 ; }
0278 ; /*
0278 ; *********************************************************************************************************
0278 ; * QUERY A SEMAPHORE
0278 ; *
0278 ; * Description: This function obtains information about a semaphore
0278 ; *
0278 ; * Arguments : pevent is a pointer to the event control block associated with the desired
0278 ; * semaphore
0278 ; *
0278 ; * pdata is a pointer to a structure that will contain information about the
0278 ; * semaphore.
0278 ; *
0278 ; * Returns : OS_NO_ERR The call was successful and the message was sent
0278 ; * OS_ERR_EVENT_TYPE If you are attempting to obtain data from a non semaphore.
0278 ; * OS_ERR_PEVENT_NULL If 'pevent' is a NULL pointer.
0278 ; *********************************************************************************************************
0278 ; */
0278 ;
0278 ; #if OS_SEM_QUERY_EN > 0
0278 ; INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
0278 ; {
0278 .dbline 373
0278 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
0278 ; OS_CPU_SR cpu_sr;
0278 ; #endif
0278 ; INT8U *psrc;
0278 ; INT8U *pdest;
0278 ;
0278 ;
0278 ; #if OS_ARG_CHK_EN > 0
0278 ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
0278 ; return (OS_ERR_PEVENT_NULL);
0278 ; }
0278 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0278 ; return (OS_ERR_EVENT_TYPE);
0278 ; }
0278 ; #endif
0278 ; OS_ENTER_CRITICAL();
0278 00D0 rcall _OS_CPU_SR_Save
027A 402F mov R20,R16
027C .dbline 374
027C ; pdata->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list */
027C F501 movw R30,R10
027E 2180 ldd R2,z+1
0280 FB01 movw R30,R22
0282 2582 std z+5,R2
0284 .dbline 375
0284 ; psrc = &pevent->OSEventTbl[0];
0284 C501 movw R24,R10
0286 0696 adiw R24,6
0288 7C01 movw R14,R24
028A .dbline 376
028A ; pdest = &pdata->OSEventTbl[0];
028A CB01 movw R24,R22
028C 0296 adiw R24,2
028E .dbline 378
028E ; #if OS_EVENT_TBL_SIZE > 0
028E ; *pdest++ = *psrc++;
028E F701 movw R30,R14
0290 DC01 movw R26,R24
0292 0190 ld R0,Z+
0294 0D92 st X+,R0
0296 .dbline 382
0296 ; #endif
0296 ;
0296 ; #if OS_EVENT_TBL_SIZE > 1
0296 ; *pdest++ = *psrc++;
0296 0190 ld R0,Z+
0298 0D92 st X+,R0
029A .dbline 386
029A ; #endif
029A ;
029A ; #if OS_EVENT_TBL_SIZE > 2
029A ; *pdest++ = *psrc++;
029A 0190 ld R0,Z+
029C 7F01 movw R14,R30
029E 0D92 st X+,R0
02A0 6D01 movw R12,R26
02A2 .dbline 408
02A2 ; #endif
02A2 ;
02A2 ; #if OS_EVENT_TBL_SIZE > 3
02A2 ; *pdest++ = *psrc++;
02A2 ; #endif
02A2 ;
02A2 ; #if OS_EVENT_TBL_SIZE > 4
02A2 ; *pdest++ = *psrc++;
02A2 ; #endif
02A2 ;
02A2 ; #if OS_EVENT_TBL_SIZE > 5
02A2 ; *pdest++ = *psrc++;
02A2 ; #endif
02A2 ;
02A2 ; #if OS_EVENT_TBL_SIZE > 6
02A2 ; *pdest++ = *psrc++;
02A2 ; #endif
02A2 ;
02A2 ; #if OS_EVENT_TBL_SIZE > 7
02A2 ; *pdest = *psrc;
02A2 ; #endif
02A2 ; pdata->OSCnt = pevent->OSEventCnt; /* Get semaphore count */
02A2 F501 movw R30,R10
02A4 2280 ldd R2,z+2
02A6 3380 ldd R3,z+3
02A8 FB01 movw R30,R22
02AA 3182 std z+1,R3
02AC 2082 std z+0,R2
02AE .dbline 409
02AE ; OS_EXIT_CRITICAL();
02AE 00D0 rcall _OS_CPU_SR_Restore
02B0 .dbline 410
02B0 ; return (OS_NO_ERR);
02B0 0027 clr R16
02B2 .dbline -2
02B2 L42:
02B2 00D0 rcall pop_gset5
02B4 .dbline 0 ; func end
02B4 0895 ret
02B6 .dbsym r cpu_sr 20 c
02B6 .dbsym r pdest 12 pc
02B6 .dbsym r psrc 14 pc
02B6 .dbsym r pdata 22 pS[.2]
02B6 .dbsym r pevent 10 pS[.1]
02B6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -