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

📄 ucos_ii.s

📁 ucos在mage128上的应用
💻 S
📖 第 1 页 / 共 5 页
字号:
; #if OS_EVENT_EN > 0
; INT8U  OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
; {
	.dbline 656
;     OS_TCB *ptcb;
;     INT8U   x;
;     INT8U   y;
;     INT8U   bitx;
;     INT8U   bity;
;     INT8U   prio;
; 
; 
;     y                      = OSUnMapTbl[pevent->OSEventGrp];   /* Find HPT waiting for message         */
	ldi R24,<_OSUnMapTbl
	ldi R25,>_OSUnMapTbl
	movw R30,R16
	ldd R30,z+1
	clr R31
	add R30,R24
	adc R31,R25
	elpm R2,Z
	std y+0,R2
	.dbline 657
;     bity                   = OSMapTbl[y];
	ldi R24,<_OSMapTbl
	ldi R25,>_OSMapTbl
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	elpm R20,Z
	.dbline 658
;     x                      = OSUnMapTbl[pevent->OSEventTbl[y]];
	movw R24,R16
	adiw R24,6
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_OSUnMapTbl
	ldi R25,>_OSUnMapTbl
	add R30,R24
	adc R31,R25
	elpm R10,Z
	.dbline 659
;     bitx                   = OSMapTbl[x];
	ldi R24,<_OSMapTbl
	ldi R25,>_OSMapTbl
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	elpm R14,Z
	.dbline 660
;     prio                   = (INT8U)((y << 3) + x);   /* Find priority of task getting the msg         */
	mov R2,R10
	clr R3
	ldd R10,y+0
	clr R11
	lsl R10
	rol R11
	lsl R10
	rol R11
	lsl R10
	rol R11
	add R10,R2
	adc R11,R3
	.dbline 661
;     pevent->OSEventTbl[y] &= ~bitx;                   /* Remove this task from the waiting list        */
	movw R24,R16
	adiw R24,6
	ldd R2,y+0
	clr R3
	add R2,R24
	adc R3,R25
	movw R4,R2
	mov R2,R14
	com R2
	movw R30,R4
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 662
;     if (pevent->OSEventTbl[y] == 0x00) {              
	movw R24,R16
	adiw R24,6
	ldd R30,y+0
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L51
X29:
	.dbline 662
	.dbline 663
;         pevent->OSEventGrp &= ~bity;                  /* Clr group bit if this was only task pending   */
	movw R24,R16
	adiw R24,1
	mov R2,R20
	com R2
	movw R30,R24
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 664
;     }
L51:
	.dbline 665
;     ptcb                 =  OSTCBPrioTbl[prio];       /* Point to this task's OS_TCB                   */
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	mov R30,R10
	clr R31
	lsl R30
	rol R31
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	ldd R23,z+1
	.dbline 666
;     ptcb->OSTCBDly       =  0;                        /* Prevent OSTimeTick() from readying task       */
	clr R2
	clr R3
	movw R30,R22
	std z+9,R3
	std z+8,R2
	.dbline 667
;     ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* Unlink ECB from this task                     */
	std z+7,R3
	std z+6,R2
	.dbline 671
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;     ptcb->OSTCBMsg       = msg;                       /* Send message directly to waiting task         */
; #else
;     msg                  = msg;                       /* Prevent compiler warning if not used          */
	.dbline 673
; #endif
;     ptcb->OSTCBStat     &= ~msk;                      /* Clear bit associated with event type          */
	movw R24,R30
	adiw R24,10
	movw R12,R24
	ldd R2,y+13
	com R2
	movw R30,R24
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 674
;     if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* See if task is ready (could be susp'd)        */
	movw R30,R22
	ldd R2,z+10
	tst R2
	brne L53
X30:
	.dbline 674
	.dbline 675
;         OSRdyGrp        |=  bity;                     /* Put task in the ready to run list             */
	lds R2,_OSRdyGrp
	or R2,R20
	sts _OSRdyGrp,R2
	.dbline 676
;         OSRdyTbl[y]     |=  bitx;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	ldd R12,y+0
	clr R13
	add R12,R24
	adc R13,R25
	movw R30,R12
	ldd R2,z+0
	or R2,R14
	std z+0,R2
	.dbline 677
;     }
L53:
	.dbline 678
;     return (prio);
	mov R16,R10
	.dbline -2
L50:
	.dbline 0 ; func end
	adiw R28,1
	xcall pop_xgsetF0FC
	adiw R28,2
	ret
	.dbsym r bity 20 c
	.dbsym r bitx 14 c
	.dbsym r prio 10 c
	.dbsym r x 10 c
	.dbsym r ptcb 22 pS[os_tcb]
	.dbsym l y 0 c
	.dbsym l msk 13 c
	.dbsym l msg 11 pV
	.dbsym r pevent 16 pS[os_event]
	.dbend
	.dbfunc e OS_EventTaskWait _OS_EventTaskWait fV
;              y -> R10
;         pevent -> R16,R17
	.even
_OS_EventTaskWait::
	xcall push_xgset300C
	.dbline -1
	.dbline 698
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                   MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; *              not occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void  OS_EventTaskWait (OS_EVENT *pevent)
; {
	.dbline 702
;     INT8U  y;
; 
; 
;     OSTCBCur->OSTCBEventPtr = pevent;            /* Store pointer to event control block in TCB        */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R17
	std z+6,R16
	.dbline 703
;     y                       = OSTCBCur->OSTCBY;  /* Task no longer ready                               */
	ldd R10,z+13
	.dbline 704
;     OSRdyTbl[y]            &= ~OSTCBCur->OSTCBBitX;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	movw R4,R2
	ldd R2,z+14
	com R2
	movw R30,R4
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 705
;     if (OSRdyTbl[y] == 0x00) {                   
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L56
X31:
	.dbline 705
	.dbline 706
;         OSRdyGrp &= ~OSTCBCur->OSTCBBitY;        /* Clear event grp bit if this was only task pending  */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+15
	com R2
	lds R3,_OSRdyGrp
	and R3,R2
	sts _OSRdyGrp,R3
	.dbline 707
;     }
L56:
	.dbline 708
;     pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
	lds R2,_OSTCBCur
	lds R3,_OSTCBCur+1
	movw R24,R16
	adiw R24,6
	movw R30,R2
	ldd R10,z+13
	clr R11
	add R10,R24
	adc R11,R25
	ldd R2,z+14
	movw R30,R10
	ldd R3,z+0
	or R3,R2
	std z+0,R3
	.dbline 709
;     pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
	movw R20,R16
	subi R20,255  ; offset = 1
	sbci R21,255
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+15
	movw R30,R20
	ldd R3,z+0
	or R3,R2
	std z+0,R3
	.dbline -2
L55:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r y 10 c
	.dbsym r pevent 16 pS[os_event]
	.dbend
	.dbfunc e OS_EventTO _OS_EventTO fV
;              y -> R10
;         pevent -> R16,R17
	.even
_OS_EventTO::
	st -y,R10
	.dbline -1
	.dbline 729
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                              MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; *              timeout occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block which is readying a task.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void  OS_EventTO (OS_EVENT *pevent)
; {
	.dbline 733
;     INT8U  y;
; 
; 
;     y                      = OSTCBCur->OSTCBY;
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R10,z+13
	.dbline 734
;     pevent->OSEventTbl[y] &= ~OSTCBCur->OSTCBBitX;
	movw R24,R16
	adiw R24,6
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	movw R4,R2
	ldd R2,z+14
	com R2
	movw R30,R4
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 735
;     if (pevent->OSEventTbl[y] == 0x00) {
	movw R24,R16
	adiw R24,6
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L59
X32:
	.dbline 735
	.dbline 736
;         pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
	movw R24,R16
	adiw R24,1
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+15
	com R2
	movw R30,R24
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 737
;     }
L59:
	.dbline 738
;     OSTCBCur->OSTCBStat     = OS_STAT_RDY;       /* Set status to ready                                */
	clr R2
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+10,R2
	.dbline 739
;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /* No longer waiting for event                        */
	clr R3
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R3
	std z+6,R2
	.dbline -2
L58:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r y 10 c
	.dbsym r pevent 16 pS[os_event]
	.dbend
	.dbfunc e OS_EventWaitListInit _OS_EventWaitListInit fV
;           ptbl -> R20,R21
;         pevent -> R16,R17
	.even
_OS_EventWaitListInit::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 758
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                 INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments  : pevent    is a pointer to the event control block allocated to the event.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void  OS_EventWaitListInit (OS_EVENT *pevent)
; {
	.dbline 762
;     INT8U  *ptbl;
; 
; 
;     pevent->OSEventGrp = 0x00;                   /* No task waiting on event                           */
	clr R2
	movw R30,R16
	std z+1,R2
	.dbline 763
;     ptbl               = &pevent->OSEventTbl[0];
	movw R20,R30
	subi R20,250  ; offset = 6
	sbci R21,255
	.dbline 766
; 
; #if OS_EVENT_TBL_SIZE > 0
;     *ptbl++            = 0x00;
	movw R30,R20
	st Z+,R2
	.dbline 770
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 1
;     *ptbl++            = 0x00;
	st Z+,R2

⌨️ 快捷键说明

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