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

📄 os_sem.s

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 S
📖 第 1 页 / 共 2 页
字号:
	rcall _OS_CPU_SR_Restore
	.dbline 206
;              *err = OS_ERR_INVALID_OPT;
	ldi R24,7
	movw R30,R22
	std z+0,R24
	.dbline 207
;              return (pevent);
	movw R16,R20
	.dbline -2
L13:
	adiw R28,1
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r tasks_waiting 12 c
	.dbsym r cpu_sr 10 c
	.dbsym r err 22 pc
	.dbsym r opt 14 c
	.dbsym r pevent 20 pS[.1]
	.dbend
	.dbfunc e OSSemPend _OSSemPend fV
;         cpu_sr -> R22
;            err -> R20,R21
;        timeout -> R12,R13
;         pevent -> R10,R11
	.even
_OSSemPend::
	rcall push_gset4
	movw R12,R18
	movw R10,R16
	ldd R20,y+8
	ldd R21,y+9
	.dbline -1
	.dbline 244
;     }
; }
; #endif
; 
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                           PEND ON SEMAPHORE
; *
; * Description: This function waits for a semaphore.
; *
; * Arguments  : pevent        is a pointer to the event control block associated with the desired
; *                            semaphore.
; *
; *              timeout       is an optional timeout period (in clock ticks).  If non-zero, your task will
; *                            wait for the resource up to the amount of time specified by this argument.
; *                            If you specify 0, however, your task will wait forever at the specified
; *                            semaphore or, until the resource becomes available (or the event occurs).
; *
; *              err           is a pointer to where an error message will be deposited.  Possible error
; *                            messages are:
; *
; *                            OS_NO_ERR           The call was successful and your task owns the resource
; *                                                or, the event you are waiting for occurred.
; *                            OS_TIMEOUT          The semaphore was not received within the specified
; *                                                timeout.
; *                            OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore.
; *                            OS_ERR_PEND_ISR     If you called this function from an ISR and the result
; *                                                would lead to a suspension.
; *                            OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
; *
; * Returns    : none
; *********************************************************************************************************
; */
; 
; void  OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
; {
	.dbline 250
; #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register      */
;     OS_CPU_SR  cpu_sr;
; #endif    
; 
; 
;     if (OSIntNesting > 0) {                           /* See if called from ISR ...                    */
	clr R2
	lds R3,_OSIntNesting
	cp R2,R3
	brsh L31
	.dbline 250
	.dbline 251
;         *err = OS_ERR_PEND_ISR;                       /* ... can't PEND from an ISR                    */
	ldi R24,2
	movw R30,R20
	std z+0,R24
	.dbline 252
;         return;
	rjmp L30
L31:
	.dbline 264
;     }
; #if OS_ARG_CHK_EN > 0
;     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                             */
;         *err = OS_ERR_PEVENT_NULL;
;         return;
;     }
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
;         *err = OS_ERR_EVENT_TYPE;
;         return;
;     }
; #endif
;     OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	mov R22,R16
	.dbline 265
;     if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
	movw R30,R10
	ldd R2,z+2
	ldd R3,z+3
	tst R2
	brne X6
	tst R3
	breq L33
X6:
	.dbline 265
	.dbline 266
;         pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
	movw R24,R10
	adiw R24,2
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	sbiw R24,1
	std z+1,R25
	std z+0,R24
	.dbline 267
;         OS_EXIT_CRITICAL();
	mov R16,R22
	rcall _OS_CPU_SR_Restore
	.dbline 268
;         *err = OS_NO_ERR;
	clr R2
	movw R30,R20
	std z+0,R2
	.dbline 269
;         return;
	rjmp L30
L33:
	.dbline 272
;     }
;                                                       /* Otherwise, must wait until event occurs       */
;     OSTCBCur->OSTCBStat |= OS_STAT_SEM;               /* Resource not available, pend on semaphore     */
	lds R24,_OSTCBCur
	lds R25,_OSTCBCur+1
	adiw R24,10
	movw R30,R24
	ldd R24,z+0
	ori R24,1
	std z+0,R24
	.dbline 273
;     OSTCBCur->OSTCBDly   = timeout;                   /* Store pend timeout in TCB                     */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+9,R13
	std z+8,R12
	.dbline 274
;     OS_EventTaskWait(pevent);                         /* Suspend task until event or timeout occurs    */
	movw R16,R10
	rcall _OS_EventTaskWait
	.dbline 275
;     OS_EXIT_CRITICAL();
	mov R16,R22
	rcall _OS_CPU_SR_Restore
	.dbline 276
;     OS_Sched();                                       /* Find next highest priority task ready         */
	rcall _OS_Sched
	.dbline 277
;     OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	mov R22,R16
	.dbline 278
;     if (OSTCBCur->OSTCBStat & OS_STAT_SEM) {          /* Must have timed out if still waiting for event*/
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+10
	sbrs R2,0
	rjmp L35
	.dbline 278
	.dbline 279
;         OS_EventTO(pevent);
	movw R16,R10
	rcall _OS_EventTO
	.dbline 280
;         OS_EXIT_CRITICAL();
	mov R16,R22
	rcall _OS_CPU_SR_Restore
	.dbline 281
;         *err = OS_TIMEOUT;                            /* Indicate that didn't get event within TO      */
	ldi R24,10
	movw R30,R20
	std z+0,R24
	.dbline 282
;         return;
	rjmp L30
L35:
	.dbline 284
;     }
;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
	clr R2
	clr R3
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R3
	std z+6,R2
	.dbline 285
;     OS_EXIT_CRITICAL();
	mov R16,R22
	rcall _OS_CPU_SR_Restore
	.dbline 286
;     *err = OS_NO_ERR;
	clr R2
	movw R30,R20
	std z+0,R2
	.dbline -2
L30:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 22 c
	.dbsym r err 20 pc
	.dbsym r timeout 12 i
	.dbsym r pevent 10 pS[.1]
	.dbend
	.dbfunc e OSSemPost _OSSemPost fc
;         cpu_sr -> R20
;         pevent -> R22,R23
	.even
_OSSemPost::
	rcall push_gset2
	movw R22,R16
	sbiw R28,1
	.dbline -1
	.dbline 308
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                         POST TO A SEMAPHORE
; *
; * Description: This function signals a semaphore
; *
; * Arguments  : pevent        is a pointer to the event control block associated with the desired
; *                            semaphore.
; *
; * 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 322
; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;     OS_CPU_SR  cpu_sr;                               
; #endif    
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;         return (OS_ERR_PEVENT_NULL);
;     }
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
;         return (OS_ERR_EVENT_TYPE);
;     }
; #endif
;     OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 323
;     if (pevent->OSEventGrp != 0x00) {                      /* See if any task waiting for semaphore    */
	movw R30,R22
	ldd R2,z+1
	tst R2
	breq L38
	.dbline 323
	.dbline 324
;         OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
	ldi R24,1
	std y+0,R24
	clr R18
	clr R19
	movw R16,R22
	rcall _OS_EventTaskRdy
	.dbline 325
;         OS_EXIT_CRITICAL();
	mov R16,R20
	rcall _OS_CPU_SR_Restore
	.dbline 326
;         OS_Sched();                                   /* Find highest priority task ready to run       */
	rcall _OS_Sched
	.dbline 327
;         return (OS_NO_ERR);
	clr R16
	rjmp L37
L38:
	.dbline 329
;     }
;     if (pevent->OSEventCnt < 65535) {                 /* Make sure semaphore will not overflow         */
	movw R30,R22
	ldd R24,z+2
	ldd R25,z+3
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brsh L40
	.dbline 329
	.dbline 330
;         pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
	movw R24,R22
	adiw R24,2
	movw R30,R24
	ldd R24,z+0
	ldd R25,z+1
	adiw R24,1
	std z+1,R25
	std z+0,R24
	.dbline 331
;         OS_EXIT_CRITICAL();
	mov R16,R20
	rcall _OS_CPU_SR_Restore
	.dbline 332
;         return (OS_NO_ERR);
	clr R16
	rjmp L37
L40:
	.dbline 334
;     }
;     OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
	mov R16,R20
	rcall _OS_CPU_SR_Restore
	.dbline 335
;     return (OS_SEM_OVF);
	ldi R16,50
	.dbline -2
L37:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym r pevent 22 pS[.1]
	.dbend
	.dbfunc e OSSemQuery _OSSemQuery fc
	.dbstruct 0 6 .2
	.dbfield 0 OSCnt i
	.dbfield 2 OSEventTbl A[3:3]c
	.dbfield 5 OSEventGrp c
	.dbend
;         cpu_sr -> R20
;          pdest -> R12,R13
;           psrc -> R14,R15
;          pdata -> R22,R23
;         pevent -> R10,R11
	.even
_OSSemQuery::
	rcall push_gset5
	movw R22,R18
	movw R10,R16
	.dbline -1
	.dbline 357
; }
; /*
; *********************************************************************************************************
; *                                          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
; *
; *              pdata         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.
; *********************************************************************************************************
; */
; 
; #if OS_SEM_QUERY_EN > 0
; INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
; {
	.dbline 373
; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;     OS_CPU_SR  cpu_sr;
; #endif    
;     INT8U     *psrc;
;     INT8U     *pdest;
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
;         return (OS_ERR_PEVENT_NULL);
;     }
;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
;         return (OS_ERR_EVENT_TYPE);
;     }
; #endif
;     OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	mov R20,R16
	.dbline 374
;     pdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait list           */
	movw R30,R10
	ldd R2,z+1
	movw R30,R22
	std z+5,R2
	.dbline 375
;     psrc              = &pevent->OSEventTbl[0];
	movw R24,R10
	adiw R24,6
	movw R14,R24
	.dbline 376
;     pdest             = &pdata->OSEventTbl[0];
	movw R24,R22
	adiw R24,2
	.dbline 378
; #if OS_EVENT_TBL_SIZE > 0
;     *pdest++          = *psrc++;
	movw R30,R14
	movw R26,R24
	ld R0,Z+
	st X+,R0
	.dbline 382
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 1
;     *pdest++          = *psrc++;
	ld R0,Z+
	st X+,R0
	.dbline 386
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 2
;     *pdest++          = *psrc++;
	ld R0,Z+
	movw R14,R30
	st X+,R0
	movw R12,R26
	.dbline 408
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 3
;     *pdest++          = *psrc++;
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 4
;     *pdest++          = *psrc++;
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 5
;     *pdest++          = *psrc++;
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 6
;     *pdest++          = *psrc++;
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 7
;     *pdest            = *psrc;
; #endif
;     pdata->OSCnt      = pevent->OSEventCnt;                /* Get semaphore count                      */
	movw R30,R10
	ldd R2,z+2
	ldd R3,z+3
	movw R30,R22
	std z+1,R3
	std z+0,R2
	.dbline 409
;     OS_EXIT_CRITICAL();
	rcall _OS_CPU_SR_Restore
	.dbline 410
;     return (OS_NO_ERR);
	clr R16
	.dbline -2
L42:
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r cpu_sr 20 c
	.dbsym r pdest 12 pc
	.dbsym r psrc 14 pc
	.dbsym r pdata 22 pS[.2]
	.dbsym r pevent 10 pS[.1]
	.dbend

⌨️ 快捷键说明

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