⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_sem.s

📁 将本站的UCOSFORAVR128V276版本升级到了280版
💻 S
📖 第 1 页 / 共 3 页
字号:
; * Returns    : OS_NO_ERR           The call was successful and the semaphore was signaled.
; *              OS_SEM_OVF          If the semaphore count exceeded its limit.  In other words, you have
; *                                  signalled the semaphore more often than you waited on it with either
; *                                  OSSemAccept() or OSSemPend().
; *              OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore
; *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
; *********************************************************************************************************
; */
; 
; INT8U  OSSemPost (OS_EVENT *pevent)
; {
	.dbline 342
; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;     OS_CPU_SR  cpu_sr = 0;
	clr R20
	.dbline 352
; #endif
; 
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;         return (OS_ERR_PEVENT_NULL);
;     }
; #endif
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
	movw R30,R22
	ldd R24,z+0
	cpi R24,3
	breq L42
	.dbline 352
	.dbline 353
;         return (OS_ERR_EVENT_TYPE);
	ldi R16,1
	xjmp L41
L42:
	.dbline 355
;     }
;     OS_ENTER_CRITICAL();
	xcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 356
;     if (pevent->OSEventGrp != 0) {                             /* See if any task waiting for semaphore*/
	movw R30,R22
	ldd R2,z+5
	tst R2
	breq L44
	.dbline 356
	.dbline 357
;         (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready HPT waiting on event           */
	ldi R24,1
	std y+0,R24
	clr R18
	clr R19
	movw R16,R22
	xcall _OS_EventTaskRdy
	.dbline 358
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 359
;         OS_Sched();                                            /* Find HPT ready to run                */
	xcall _OS_Sched
	.dbline 360
;         return (OS_NO_ERR);
	clr R16
	xjmp L41
L44:
	.dbline 362
;     }
;     if (pevent->OSEventCnt < 65535u) {                /* Make sure semaphore will not overflow         */
	movw R30,R22
	ldd R24,z+3
	ldd R25,z+4
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brsh L46
	.dbline 362
	.dbline 363
;         pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
	movw R24,R22
	adiw R24,3
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	std z+1,R25
	std z+0,R24
	.dbline 364
;         OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 365
;         return (OS_NO_ERR);
	clr R16
	xjmp L41
L46:
	.dbline 367
;     }
;     OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 368
;     return (OS_SEM_OVF);
	ldi R16,50
	.dbline -2
L41:
	adiw R28,1
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym r pevent 22 pS[os_event]
	.dbend
	.dbfunc e OSSemQuery _OSSemQuery fc
	.dbstruct 0 5 os_sem_data
	.dbfield 0 OSCnt i
	.dbfield 2 OSEventTbl A[2:2]c
	.dbfield 4 OSEventGrp c
	.dbend
;         cpu_sr -> R20
;          pdest -> R22,R23
;           psrc -> R10,R11
;              i -> R12
;     p_sem_data -> R14,R15
;         pevent -> y+10
	.even
_OSSemQuery::
	xcall push_arg4
	xcall push_gset5
	movw R14,R18
	.dbline -1
	.dbline 392
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                          QUERY A SEMAPHORE
; *
; * Description: This function obtains information about a semaphore
; *
; * Arguments  : pevent        is a pointer to the event control block associated with the desired
; *                            semaphore
; *
; *              p_sem_data    is a pointer to a structure that will contain information about the
; *                            semaphore.
; *
; * Returns    : OS_NO_ERR           The call was successful and the message was sent
; *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non semaphore.
; *              OS_ERR_PEVENT_NULL  If 'pevent'     is a NULL pointer.
; *              OS_ERR_PDATA_NULL   If 'p_sem_data' is a NULL pointer
; *********************************************************************************************************
; */
; 
; #if OS_SEM_QUERY_EN > 0
; INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *p_sem_data)
; {
	.dbline 402
; #if OS_LOWEST_PRIO <= 63
;     INT8U     *psrc;
;     INT8U     *pdest;
; #else
;     INT16U    *psrc;
;     INT16U    *pdest;
; #endif
;     INT8U      i;
; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;     OS_CPU_SR  cpu_sr = 0;
	clr R20
	.dbline 415
; #endif
; 
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;         return (OS_ERR_PEVENT_NULL);
;     }
;     if (p_sem_data == (OS_SEM_DATA *)0) {                  /* Validate 'p_sem_data'                    */
;         return (OS_ERR_PDATA_NULL);
;     }
; #endif
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
	ldd R30,y+10
	ldd R31,y+11
	ldd R24,z+0
	cpi R24,3
	breq L49
	.dbline 415
	.dbline 416
;         return (OS_ERR_EVENT_TYPE);
	ldi R16,1
	xjmp L48
L49:
	.dbline 418
;     }
;     OS_ENTER_CRITICAL();
	xcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 419
;     p_sem_data->OSEventGrp = pevent->OSEventGrp;           /* Copy message mailbox wait list           */
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+5
	movw R30,R14
	std z+4,R2
	.dbline 420
;     psrc                   = &pevent->OSEventTbl[0];
	ldd R24,y+10
	ldd R25,y+11
	adiw R24,6
	movw R10,R24
	.dbline 421
;     pdest                  = &p_sem_data->OSEventTbl[0];
	movw R22,R14
	subi R22,254  ; offset = 2
	sbci R23,255
	.dbline 422
	clr R12
	xjmp L54
L51:
	.dbline 422
	.dbline 423
	movw R30,R10
	movw R26,R22
	ld R0,Z+
	movw R10,R30
	st X+,R0
	movw R22,R26
	.dbline 424
L52:
	.dbline 422
	inc R12
L54:
	.dbline 422
;     for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
	mov R24,R12
	cpi R24,2
	brlo L51
	.dbline 425
;         *pdest++ = *psrc++;
;     }
;     p_sem_data->OSCnt = pevent->OSEventCnt;                /* Get semaphore count                      */
	ldd R30,y+10
	ldd R31,y+11
	ldd R2,z+3
	ldd R3,z+4
	movw R30,R14
	std z+1,R3
	std z+0,R2
	.dbline 426
;     OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline 427
;     return (OS_NO_ERR);
	clr R16
	.dbline -2
L48:
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym r pdest 22 pc
	.dbsym r psrc 10 pc
	.dbsym r i 12 c
	.dbsym r p_sem_data 14 pS[os_sem_data]
	.dbsym l pevent 10 pS[os_event]
	.dbend
	.dbfunc e OSSemSet _OSSemSet fV
;         cpu_sr -> R20
;            err -> y+6
;            cnt -> R22,R23
;         pevent -> R10,R11
	.even
_OSSemSet::
	xcall push_gset3
	movw R22,R18
	movw R10,R16
	.dbline -1
	.dbline 458
; }
; #endif                                                     /* OS_SEM_QUERY_EN                          */
; 
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                              SET SEMAPHORE
; *
; * Description: This function sets the semaphore count to the value specified as an argument.  Typically,
; *              this value would be 0.
; *
; *              You would typically use this function when a semaphore is used as a signaling mechanism
; *              and, you want to reset the count value.
; *
; * Arguments  : pevent     is a pointer to the event control block
; *
; *              cnt        is the new value for the semaphore count.  You would pass 0 to reset the
; *                         semaphore count.
; *
; *              err        is a pointer to an error code returned by the function as follows:
; *
; *                            OS_NO_ERR            The call was successful and the semaphore value was set.
; *                            OS_ERR_EVENT_TYPE    If you didn't pass a pointer to a semaphore.
; *                            OS_ERR_PEVENT_NULL   If 'pevent' is a NULL pointer.
; *                            OS_ERR_TASK_WAITING  If tasks are waiting on the semaphore.
; *********************************************************************************************************
; */
; 
; #if OS_SEM_SET_EN > 0
; void  OSSemSet (OS_EVENT *pevent, INT16U cnt, INT8U *err)
; {
	.dbline 460
; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;     OS_CPU_SR  cpu_sr = 0;
	clr R20
	.dbline 474
; #endif
; 
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (err == (INT8U *)0) {                          /* Validate 'err'                                */
;         return;
;     }
;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;         *err = OS_ERR_PEVENT_NULL;
;         return;
;     }
; #endif
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
	movw R30,R10
	ldd R24,z+0
	cpi R24,3
	breq L56
	.dbline 474
	.dbline 475
;         *err = OS_ERR_EVENT_TYPE;
	ldi R24,1
	ldd R30,y+6
	ldd R31,y+7
	std z+0,R24
	.dbline 476
;         return;
	xjmp L55
L56:
	.dbline 478
;     }
;     OS_ENTER_CRITICAL();
	xcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 479
;     *err = OS_NO_ERR;
	clr R2
	ldd R30,y+6
	ldd R31,y+7
	std z+0,R2
	.dbline 480
;     if (pevent->OSEventCnt > 0) {                     /* See if semaphore already has a count          */
	movw R30,R10
	ldd R2,z+3
	ldd R3,z+4
	tst R2
	brne X7
	tst R3
	breq L58
X7:
	.dbline 480
	.dbline 481
;         pevent->OSEventCnt = cnt;                     /* Yes, set it to the new value specified.       */
	movw R30,R10
	std z+4,R23
	std z+3,R22
	.dbline 482
	xjmp L59
L58:
	.dbline 482
;     } else {                                          /* No                                            */
	.dbline 483
;         if (pevent->OSEventGrp == 0) {                /*      See if task(s) waiting?                  */
	movw R30,R10
	ldd R2,z+5
	tst R2
	brne L60
	.dbline 483
	.dbline 484
;             pevent->OSEventCnt = cnt;                 /*      No, OK to set the value                  */
	movw R30,R10
	std z+4,R23
	std z+3,R22
	.dbline 485
	xjmp L61
L60:
	.dbline 485
;         } else {
	.dbline 486
;             *err               = OS_ERR_TASK_WAITING;
	ldi R24,8
	ldd R30,y+6
	ldd R31,y+7
	std z+0,R24
	.dbline 487
;         }
L61:
	.dbline 488
;     }
L59:
	.dbline 489
;     OS_EXIT_CRITICAL();
	mov R16,R20
	xcall _OS_CPU_SR_Restore
	.dbline -2
L55:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym l err 6 pc
	.dbsym r cnt 22 i
	.dbsym r pevent 10 pS[os_event]
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -